Я делаю простую инвентарную заявку. В таблице у меня есть столбцы Количество, цена и общая стоимость. Что лучше, сделать TotalPrice a Computed Column
как Количество * Цена или сделать этот расчет в моем приложении и сохранить его в TotalPrice?Вычислительная колонка для простого умножения?
ответ
Одно правило в дизайне базы данных (вообще): не храните информацию, которая также может быть легко извлечена.
В вашем случае я бы не создал вычисляемый столбец, а делал умножение во время извлечения. Либо просто выбрав price * quantity
, либо создав представление, которое содержит это вычисление.
Вид имеет дополнительное преимущество, что вы можете легко изменить формулу (например, с учетом НДС) без необходимости изменять все заявления в своем приложении.
зачем хранить вычисляемый столбец, когда вы можете выполнять вычисления в запросе?
SELECT (Quantity * Price) as TotalPrice FROM my_table
Чтобы сохранить запись. – SMUsamaShah
И если TotalPrice изменен и требует налога. Тогда вам нужно изменить только одно место, а не каждый запрос – PostMan
Если вы обновите цену или количество, вы должны сделать обновление 2cd на TotalPrice. Что делать, если другой разработчик забывает обновление 2cd? Теперь у вас плохие данные.
У вас может быть триггер, который синхронизируется, но вероятность наличия плохих данных по-прежнему существует. В некоторых RDMS триггеры не запускаются для каждой строки, обновленной в наборе обновления.
Но иногда это необходимо для хранения рассчитанных полей. Если таблица BIG, и вы планируете искать вычисленное поле. (вы должны сохранить данные для его индексации). В некоторых проектах вы не только сохраняете вычисленные поля, но и агрегатные вычисления.
Не всегда неправильно хранить рассчитанные поля, просто убедитесь, что вы знаете компромисс.
* EDIT * Другой вопрос. Если вы вычислите «Amount_Paid», фактическая сумма, которую заплатил клиент, будет потеряна при изменении формулы расчета.
Дизайн для решения проблемы. Если это означает нарушение эмпирического правила, то сломайте некоторые большие пальцы. * END EDIT *
Я бы добавил, что было бы неправильно хранить столбец, который можно было бы вычислить, не имея ограничения CHECK() в этом столбце, чтобы убедиться, что все всегда добавлено. –
Так что я должен добавить представление? – SMUsamaShah
Он централизует определение этого (правда, просто) вычисления. Если бы использовался только для поиска (например, отчетов), я бы пошел на представление. Однако в зависимости от вашей СУБД и языка программирования это может вызвать некоторые проблемы при попытке обновления данных через представление. Если это так, я бы добавил умножение в оператор SELECT или просто выполнил его в приложении. Это зависит от вашей среды. Для этого нет «золотого правила». –
Вид звучит хорошо. Если расчет «TotalPrice» изменится в будущем, вы измените представление только, а не 500 запросов. Или вы можете вызвать функцию в своих запросах для того же эффекта. –