SQL - сохранить вычисленное значение (на основе дочерних таблиц) в столбце или рассчитать в модели данных?
Я столкнулся с небольшим затруднением, и я надеюсь, что SO-сообщество может помочь мне с этим.
В настоящее время я нахожусь в ситуации, когда мы пишем собственную логику для скидок на заказ, основанную на настраиваемых правилах. В простейшем виде, вот таблицы:
порядок
OrderID int
OrderDiscount
OrderID int
DiscountID int
скидка
DiscountID int
Мы используем Entity Framework (но этот вопрос может относиться к любой модели данных). Я чувствую, что мои варианты просты, но оба имеют свои недостатки:
- Добавить столбец "Скидка" в мою таблицу заказа SQL. Недостатки: при каждом обновлении заказа нам нужно помнить о необходимости пересчета скидки и обновления этого столбца. Это может привести к несогласованности данных, но будет работать лучше. Позволит также изменить размер скидки.
- Добавьте свойство "Скидка" в мой код модели данных заказа. Недостатки: Требуется расчет в любое время, когда к этому свойству обращаются, но он всегда будет точным.
По какому маршруту мне идти и почему?
2 ответа
Вы пренебрегаете двумя ключевыми требованиями бухгалтерского учета
- Скидка на каждый заказ вместе с подробной информацией о том, как рассчитывается каждая скидка, ДОЛЖНА храниться в каждом соответствующем заказе; потому что как только заказ размещен в GL, НЕ ДОЛЖНО ИЗМЕНЯТЬСЯ. Размещенные заказы могут быть отменены или отменены, но не могут быть изменены.
- Однако, пока заказ строится, но еще не был опубликован в ГЛ, правила отличаются - скидка ДОЛЖНА быть пересчитана в реальном времени, что легче всего выполнить, НЕ сохраняя ее в записи.
Как правило, расчетные поля истории в базе данных не считаются оптимальной практикой, если только время, затрачиваемое на вычисления, не является значительным, я бы предпочел реализовать вычисления в конструкторе, а не сохранять новое значение при каждом изменении значения скидки. проверьте эту ссылку для расширенного взгляда на предмет. ВОТ