2011-01-16 4 views
0

Я делаю простую инвентарную заявку. В таблице у меня есть столбцы Количество, цена и общая стоимость. Что лучше, сделать TotalPrice a Computed Column как Количество * Цена или сделать этот расчет в моем приложении и сохранить его в TotalPrice?Вычислительная колонка для простого умножения?

ответ

2

Одно правило в дизайне базы данных (вообще): не храните информацию, которая также может быть легко извлечена.

В вашем случае я бы не создал вычисляемый столбец, а делал умножение во время извлечения. Либо просто выбрав price * quantity, либо создав представление, которое содержит это вычисление.

Вид имеет дополнительное преимущество, что вы можете легко изменить формулу (например, с учетом НДС) без необходимости изменять все заявления в своем приложении.

+0

Так что я должен добавить представление? – SMUsamaShah

+0

Он централизует определение этого (правда, просто) вычисления. Если бы использовался только для поиска (например, отчетов), я бы пошел на представление. Однако в зависимости от вашей СУБД и языка программирования это может вызвать некоторые проблемы при попытке обновления данных через представление. Если это так, я бы добавил умножение в оператор SELECT или просто выполнил его в приложении. Это зависит от вашей среды. Для этого нет «золотого правила». –

+0

Вид звучит хорошо. Если расчет «TotalPrice» изменится в будущем, вы измените представление только, а не 500 запросов. Или вы можете вызвать функцию в своих запросах для того же эффекта. –

0

зачем хранить вычисляемый столбец, когда вы можете выполнять вычисления в запросе?

SELECT (Quantity * Price) as TotalPrice FROM my_table 
+0

Чтобы сохранить запись. – SMUsamaShah

+0

И если TotalPrice изменен и требует налога. Тогда вам нужно изменить только одно место, а не каждый запрос – PostMan

1

Если вы обновите цену или количество, вы должны сделать обновление 2cd на TotalPrice. Что делать, если другой разработчик забывает обновление 2cd? Теперь у вас плохие данные.

У вас может быть триггер, который синхронизируется, но вероятность наличия плохих данных по-прежнему существует. В некоторых RDMS триггеры не запускаются для каждой строки, обновленной в наборе обновления.

Но иногда это необходимо для хранения рассчитанных полей. Если таблица BIG, и вы планируете искать вычисленное поле. (вы должны сохранить данные для его индексации). В некоторых проектах вы не только сохраняете вычисленные поля, но и агрегатные вычисления.

Не всегда неправильно хранить рассчитанные поля, просто убедитесь, что вы знаете компромисс.

* EDIT * Другой вопрос. Если вы вычислите «Amount_Paid», фактическая сумма, которую заплатил клиент, будет потеряна при изменении формулы расчета.

Дизайн для решения проблемы. Если это означает нарушение эмпирического правила, то сломайте некоторые большие пальцы. * END EDIT *

+0

Я бы добавил, что было бы неправильно хранить столбец, который можно было бы вычислить, не имея ограничения CHECK() в этом столбце, чтобы убедиться, что все всегда добавлено. –