SQL - сохранить вычисленное значение (на основе дочерних таблиц) в столбце или рассчитать в модели данных?

Я столкнулся с небольшим затруднением, и я надеюсь, что SO-сообщество может помочь мне с этим.

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

порядок

OrderID int

OrderDiscount

OrderID int
DiscountID int

скидка

DiscountID int

Мы используем Entity Framework (но этот вопрос может относиться к любой модели данных). Я чувствую, что мои варианты просты, но оба имеют свои недостатки:

  1. Добавить столбец "Скидка" в мою таблицу заказа SQL. Недостатки: при каждом обновлении заказа нам нужно помнить о необходимости пересчета скидки и обновления этого столбца. Это может привести к несогласованности данных, но будет работать лучше. Позволит также изменить размер скидки.
  2. Добавьте свойство "Скидка" в мой код модели данных заказа. Недостатки: Требуется расчет в любое время, когда к этому свойству обращаются, но он всегда будет точным.

По какому маршруту мне идти и почему?

2 ответа

Вы пренебрегаете двумя ключевыми требованиями бухгалтерского учета

  1. Скидка на каждый заказ вместе с подробной информацией о том, как рассчитывается каждая скидка, ДОЛЖНА храниться в каждом соответствующем заказе; потому что как только заказ размещен в GL, НЕ ДОЛЖНО ИЗМЕНЯТЬСЯ. Размещенные заказы могут быть отменены или отменены, но не могут быть изменены.
  2. Однако, пока заказ строится, но еще не был опубликован в ГЛ, правила отличаются - скидка ДОЛЖНА быть пересчитана в реальном времени, что легче всего выполнить, НЕ сохраняя ее в записи.

Как правило, расчетные поля истории в базе данных не считаются оптимальной практикой, если только время, затрачиваемое на вычисления, не является значительным, я бы предпочел реализовать вычисления в конструкторе, а не сохранять новое значение при каждом изменении значения скидки. проверьте эту ссылку для расширенного взгляда на предмет. ВОТ

Другие вопросы по тегам