SQL - 在列中存储计算值(基于子表)或在数据模型中计算?

时间:2012-12-13 15:51:36

标签: sql entity-framework database-design database-optimization

我遇到了一个小问题,我希望SO社区可以帮助我解决这个问题。

我目前正处于为订单折扣编写自定义逻辑的情况,这些逻辑基于可配置的规则。以最简单的形式,这里有表格:

顺序

OrderID int

OrderDiscount

OrderID int
DiscountID int

折扣

DiscountID int

我们正在使用实体框架(但这个问题可能适用于任何数据模型)。我觉得我的选择很简单,但都有它们的缺点:

  1. 在我的SQL 订单表中添加“折扣”列。缺点:订单更新时,我们需要记住重新计算折扣并更新此栏。这可能会导致数据不一致,但性能会更好。还将允许覆盖折扣金额。
  2. 在我的订单数据模型in-code中添加“Discount”属性。缺点:每次访问此属性时都需要计算,但始终是准确的。
  3. 我应该走哪条路?为什么?

2 个答案:

答案 0 :(得分:1)

您忽略了两个关键的会计要求

  1. 每个订单的折扣,以及每个折扣计算方式的详细信息,必须存储在每个订单中;因为一旦订单发布到GL,就不允许更改。发布的订单可以取消或撤消,但不能更改。
  2. 然而,虽然订单正在建立,但尚未发布到GL,但规则是不同的 - 必须实时重新计算折扣,这最容易通过不将其存储在记录中来强制执行。

答案 1 :(得分:0)

通常,数据库中的故事计算字段不被视为最佳实践,除非计算所消耗的时间很长,我选择在构造函数中实现计算,而不是每次折扣值都存储新值改变了。 查看此链接以查看有关该主题的扩展视图。 HERE