是线项目价格的数据快照不是在所有情况下计算的更好吗?(Are data-snapshots of l

2019-10-18 09:05发布

我经常看到的订单或复制其他表的一个或多个字段,以便采取客户的产品订单的快照,当它被置于发票LINE_ITEM表。

在我的架构,但是,我可以生成一个订单,而不复制数据的视图。 因此要查找的订单/产品/价格数据是有点贵,但我节省了复制/插入时间,空间和冗余。 据我所知,复制/插入是一次性交易,而查询将需要很多次 - 但,我只用成千上万的记录10S成交在一个给定的表,我不希望表现要一个问题。

所以,因为)我的架构支持精确的查找没有一个快照,和b)我没有对查询优化的强烈需求,我觉得很有道理运行计算,而不是采取瞬间-射击。 或者是有什么我失踪,我应该始终以一个快照在这样的情况下?

下面是查找计算将是什么样子的例子:

# display order items for a particular order on a particular date

# get order, products and base prices from order_id

order_products = SELECT * FROM order_has_product ohp
                          INNER JOIN price ON (price.product_id = ohp.product_id)
                          INNER JOIN order ON (order.id = ohp.order_id)
                          WHERE order_id = ?


# calculate price of each product at order.datetime_opened

for op in order_products:

    tax = SELECT SUM(tax.rate) FROM product_has_tax pht
             INNER JOIN tax ON (tax.id = pht.tax_id)
             WHERE pht.product_id = op.product_id
                 AND tax.date_start <= op.datetime_opened
                 AND tax.date_end >= op.datetime_opened

    discount_product = SELECT SUM(discount.rate) FROM product_has_discount phd
             INNER JOIN discount ON (discount.id = phd.discount_id)
             WHERE phd.product_id = op.product_id
                 AND discount.date_start <= op.datetime_opened
                 AND discount.date_end >= op.datetime_opened

    discount_customer = SELECT SUM(discount.rate) FROM customer_has_discount chd 
             INNER JOIN discount ON (discount.id = chd.discount_id)
             WHERE chd.customer_id = op.customer_id
                 AND discount.date_start <= op.datetime_opened
                 AND discount.date_end >= op.datetime_opened
                 AND (chd.date_used_limited IS NULL OR chd.date_used_limited = op.datetime_opened)

    discount = discount_product + discount_customer

    price = op.price * (1-discount) * (1+tax)

Answer 1:

在网上销售应用我的工作中,我们始终复制计算的税收和价格,每个人为了当它被放置; 这是你的“快照”选项。 我们从来没有重新计算它。 为什么?

  • 价格的变化; 快照捕获的价格在产品订购的时间,现在是不是有什么。
  • 表改变。 你是你的价格的每一个生产者和消费者依赖于了解的视图,并仅使用视图。 永远。 如果您提供的快照,未来数据的消费者并不关心它是如何计算的。
  • 架构更改。 安大略省正在改变它是如何计算营业税和征税什么样的产品。 这打破了看法,但没有一个快照。
  • 规则的改变。 我们必须为客户提供覆盖对于像优惠券和价格匹配规则的方式。 您可以通过覆盖快照的价格做到这一点,你不能与意见做。


Answer 2:

通常快照正在使它容易,以确保你有每个销售的忠实记录,是它datawarehousing或客户投诉处理。 通过快照,它只是一个保持单个表安全的事,备份和严格的审核。

做你的方式,使具有保证了很多困难 ,主要是因为你必须确保没有人在某个表(折扣,税收,产品,订单等)的任何方式弄乱。 例如,你会怎么说,如果有人改变了2005年1月的折现率? 此外,这可以防止您在一个简单的方法,如果你现在有什么对折价率超过一列不断变化的数据模型,你就那么不仅要改变计算的未来,但保留旧的在过去的(或者做一个向后兼容的方式每一个变化。)

空间是便宜的,具有快照使很多事情变得更加容易,在一个小的成本。



文章来源: Are data-snapshots of line item prices better than calculations in all cases?