在所有情况下,订单项价格的数据快照是否优于计算?

Ton*_*ony 1 schema database-design snapshot

我经常看到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)
Run Code Online (Sandbox Code Playgroud)

Dou*_*rch 5

在我工作的在线销售应用程序中,我们总是将计算出的税费和价格复制到每个订单上; 这是您的"快照"选项.我们从未重新计算过它.为什么?

  • 价格变化; 快照捕获产品订购时的价格,而不是现在的价格.
  • 表格改变了.您依靠价格的每个生产者和消费者来了解视图并仅使用视图.永远.如果您提供快照,则未来的数据使用者不关心它的计算方式.
  • 架构改变了.安大略省正在改变计算销售税和征税产品的方式.这会打破视图,但不会打破快照.
  • 规则改变了.我们必须为客户提供一种覆盖优惠券和价格匹配等规则的方法.您可以通过覆盖快照价格来执行此操作,但不能通过视图执行此操作.