1

我经常看到订单或发票的 line_item 表从其他表中复制一个或多个字段,以便在客户下达产品订单时对其进行快照。

然而,在我的模式中,我可以在不复制数据的情况下生成订单视图。所以查找订单/产品/价格数据会稍微贵一点,但我可以节省复制/插入的时间、空间和冗余。我知道复制/插入是一次性事务,而查找将需要多次 - 但是,我只处理给定表中的数千条记录,我不希望性能是一个问题。

因此,因为 a) 我的模式支持无需快照的准确查找,并且 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)
4

2 回答 2

5

在我使用的在线销售应用程序中,我们总是在下单时将计算出的税金和价格复制到每个单独的订单中;这是您的“快照”选项。我们从未重新计算过它。为什么?

  • 价格变动;快照捕获的是订购产品时的价格,而不是现在的价格。
  • 表发生变化。您依靠价格的每个生产者和消费者来了解视图并仅使用视图。永远。如果您提供快照,未来的数据消费者不会关心它是如何计算的。
  • 架构改变。安大略省正在改变计算销售税的方式以及对哪些产品征税。这会破坏视图,但不会破坏快照。
  • 规则改变。我们必须为客户提供一种方法来覆盖优惠券和价格匹配等规则。你可以通过覆盖快照价格来做到这一点,你不能用视图来做到这一点。
于 2009-11-18T20:58:21.087 回答
1

通常会拍摄快照,以确保您拥有每笔销售的真实记录,无论是用于数据仓库还是用于客户投诉处理。使用快照只需保证单个表的安全、备份和严格的审计。

以自己的方式做这件事会使保证变得更加困难,主要是因为您必须确保没有人以任何方式弄乱任何涉及的表格(折扣、税收、产品、订单等)。例如,您如何判断是否有人更改了 2005 年 1 月的贴现率?此外,这会阻止您以一种简单的方式发展您的数据模型,如果您现在必须拥有多个贴现率列,那么您不仅需要更改未来的计算,还要保留旧的计算对于过去(或者以向后兼容的方式进行所有更改。)

空间很便宜,拥有快照可以让很多事情变得更容易,而且成本很低。

于 2009-11-18T20:49:13.843 回答