Работа с вычисляемыми полями

Модераторы: kdv, CyberMax

Ответить
Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Работа с вычисляемыми полями

Сообщение Guardian777 » 07 авг 2009, 13:15

Добрый день.
Windows XP Prof
Firebird 1.5
Возник следующий вопрос.
Требуется вычислить значение столбца на основе данных из другой таблицы. В книге Хелен Борри упомянается что можно для вычисления использовать SELECT. Но проблема заключается в том что ести мы пишем запрос типа (SELECT G.NAC FROM GROUP G WHERE G.KODT = KODT) , то берется только первое значение из столбца KODT
Есть ли варианты решения данной задачи без написания пользовательской UDF ?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Работа с вычисляемыми полями

Сообщение Dimitry Sibiryakov » 07 авг 2009, 14:23

1) View
2) Trigger
3) DB Developer

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Работа с вычисляемыми полями

Сообщение kdv » 07 авг 2009, 20:49

к ответу DS добавлю, что UDF - нет, не сможете. И вообще select в вычисляемых полях это ужасно (с точки зрения производительности). Никогда так не делайте.

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Работа с вычисляемыми полями

Сообщение Guardian777 » 10 авг 2009, 12:10

Что использовать лучше Просмотр или триггер?
Я понимаю это так. Если использовать просмотры то получается что мы избавляемся от избыточных данных и их вычислений в ходе изменения данных.
Если же использовать триггеры, то мы получаем лишнее поле, но выигрываем в скорости исполнения запроса основанного на этих полях.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Работа с вычисляемыми полями

Сообщение kdv » 10 авг 2009, 16:32

триггер хуже view тем, что пресловутый select будет выполняться так же как и check constraint. Собственно, check constraint, грубо говоря, и есть "системный триггер". View или запрос лучше тем, что "вычисляемый столбец" будет вычисляться только при выборке, и только когда это нужно.
Кроме того, может быть изменится Ваше представление о правилах "программирования" метаданных. Например, есть такая штука - join (www.ibase.ru/devinfo/joins.htm).

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Работа с вычисляемыми полями

Сообщение WildSery » 10 авг 2009, 19:39

Присоединяюсь к совету с JOIN. Пока не выучите что это - никаких вычисляемых полей.

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Работа с вычисляемыми полями

Сообщение Guardian777 » 11 авг 2009, 09:29

kdv писал(а):триггер хуже view тем, что пресловутый select будет выполняться так же как и check constraint. Собственно, check constraint, грубо говоря, и есть "системный триггер". View или запрос лучше тем, что "вычисляемый столбец" будет вычисляться только при выборке, и только когда это нужно.
Кроме того, может быть изменится Ваше представление о правилах "программирования" метаданных. Например, есть такая штука - join (http://www.ibase.ru/devinfo/joins.htm).
1) Статью читал уже до этого, шяс перечитал. Но по моему мы немного друг друга не понимаем.
2) Подумав пришел к выводу что в моем случае лучше использовать триггер. Поясню почему.
Есть таблица товаров и таблица элементов из которых состоит товар. У каждого элемента есть своя цена. Цена товара получается путем сложения цен элементов. Тут то и начинается самое интересное.
Дорпустим есть 3000 товаров в каждом в среднем 6 элементов.
Мы забили справочник товаров и их комплектующих.
2.1) Используем триггер.
Изменили 5 товаров. В таблице товаров справочник поменял в соответствии с условиями (наценка/скидка) цены 5 ти товаров. Потом сделали выборку всех товаров для визуального отображения в программе без выборки составляющих. Выборка прошла мгновенно т.к. все данные есть и ничего высчитывать не надо.
2.2) Используем View.
Изменили теже 5 товаров. Делаем выборку для просмотра и получаем что для того чтобы собрать данные нашего SELECT надо выполнить 3000 ! запросов в дочернюю таблицу.
А если учесть что в реальных базах товаров десятки тысяч то ......

Ответить