оптимизация использования триггера
Добавлено: 29 апр 2009, 12:08
Добрый день.
Опыта в разработке баз данных у меня не очень много, но есть желание прокачать это умении );
Попробую как можно доступнее объяснить свою задачу (использую Firebird 2.1.2).
Таблица ячейка (cell)
id_cell (pk)
cell_param1
cell_param2
Таблица элемент_типа_1 (element1)
id_element (pk)
element_param1
element_param2
Таблица элемент_типа_2 (element2)
id_element (pk)
element_param1
element_param2
Таблица вхождения элемента типа 1 в ячейку (сell_element1)
id
id_cell (fk)
id_element (fk)
count
Таблица вхождения элемента типа 2 в ячейку (cell_element2)
id
id_cell (fk)
id_element (fk)
count
********************************************************************
Таблиц с типа элементов может быть много (соответственно таблиц вхождения элементов в таблицу будет столько же).
Запись cell_param# в таблице cell рассчитывается как:
cell_param1 = параметр элемента (element_param1) * на количество (count)
cell_param2 = параметр элемента (element_param2) * на количество (count)
При создании новой ячейки значения полей cell_param1 и cell_param2 равны 0, а при добавлении в любую из таблиц «вхождения элемента типа # в ячейку» нового значения через триггер пересчитываю значение cell_param1 для ячейки cell_id в соответствии с указанным количеством элемента id_element.
Так же через триггер организован пересчет значения cell_param при изменении количества элементов (update в таблице cell_ellement# для element_id) и при удалении записи.
***********************************************************************
Триггер для обработки данных после вставки новой записи в таблицу cell_element1 выглядит так:
begin
update cell set
cell_param1 =
( cell_param1 +
((select element_param1 from element1 where element_id = new.element_id)
* new."COUNT")
),
cell_param2 =
( cell_param2 +
((select element_param2 from element1 where element_id = new.element_id)
* new."COUNT")
)
where cell_id= NEW.cell_id;
end
Соответсвенно для таблицы cell_element2 код будет идентичным, измениться только «from element1» на «from element2»
***********************************************************************
Допустим, что таблиц с типами элементов у нас 10, тогда надо для 10 таблиц cell_element[1-10] создать почти одинаковый триггер, а если надо что то будет изменить, то придется перебрать все таблицы.
Есть ли красивое решение данной проблемы? Например, создать универсальный триггер, который будет принимать название таблицы из которой его вызвали и генерировать запрос с нужным параметром запроса «from element#»?
***********************************************************************
Код, который выполняется в триггере не сильно нагружает базу? (2 вложенных запроса, а их может быть и больше с увеличением числа вычисляемых полей).
Опыта в разработке баз данных у меня не очень много, но есть желание прокачать это умении );
Попробую как можно доступнее объяснить свою задачу (использую Firebird 2.1.2).
Таблица ячейка (cell)
id_cell (pk)
cell_param1
cell_param2
Таблица элемент_типа_1 (element1)
id_element (pk)
element_param1
element_param2
Таблица элемент_типа_2 (element2)
id_element (pk)
element_param1
element_param2
Таблица вхождения элемента типа 1 в ячейку (сell_element1)
id
id_cell (fk)
id_element (fk)
count
Таблица вхождения элемента типа 2 в ячейку (cell_element2)
id
id_cell (fk)
id_element (fk)
count
********************************************************************
Таблиц с типа элементов может быть много (соответственно таблиц вхождения элементов в таблицу будет столько же).
Запись cell_param# в таблице cell рассчитывается как:
cell_param1 = параметр элемента (element_param1) * на количество (count)
cell_param2 = параметр элемента (element_param2) * на количество (count)
При создании новой ячейки значения полей cell_param1 и cell_param2 равны 0, а при добавлении в любую из таблиц «вхождения элемента типа # в ячейку» нового значения через триггер пересчитываю значение cell_param1 для ячейки cell_id в соответствии с указанным количеством элемента id_element.
Так же через триггер организован пересчет значения cell_param при изменении количества элементов (update в таблице cell_ellement# для element_id) и при удалении записи.
***********************************************************************
Триггер для обработки данных после вставки новой записи в таблицу cell_element1 выглядит так:
begin
update cell set
cell_param1 =
( cell_param1 +
((select element_param1 from element1 where element_id = new.element_id)
* new."COUNT")
),
cell_param2 =
( cell_param2 +
((select element_param2 from element1 where element_id = new.element_id)
* new."COUNT")
)
where cell_id= NEW.cell_id;
end
Соответсвенно для таблицы cell_element2 код будет идентичным, измениться только «from element1» на «from element2»
***********************************************************************
Допустим, что таблиц с типами элементов у нас 10, тогда надо для 10 таблиц cell_element[1-10] создать почти одинаковый триггер, а если надо что то будет изменить, то придется перебрать все таблицы.
Есть ли красивое решение данной проблемы? Например, создать универсальный триггер, который будет принимать название таблицы из которой его вызвали и генерировать запрос с нужным параметром запроса «from element#»?
***********************************************************************
Код, который выполняется в триггере не сильно нагружает базу? (2 вложенных запроса, а их может быть и больше с увеличением числа вычисляемых полей).