2009-11-18 28 views
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) 

回答

5

在我工作的在線銷售應用程序中,我們總是在每次訂單放置時將計算的稅金和價格複製到每個訂單;這是你的「快照」選項。我們從未重新計算過它。爲什麼?

  • 價格變化;快照捕捉產品訂購時的價格,而不是現在的價格。
  • 表更改。您正在依靠您的價格的每個生產者和消費者瞭解這個視圖並僅使用視圖。永遠。如果提供快照,未來的數據使用者並不在意它是如何計算的。
  • 模式更改。安大略正在改變它如何計算銷售稅和哪些產品被徵稅。這打破了觀點,但不是快照。
  • 規則改變。我們必須爲客戶提供一種覆蓋優惠券和價格匹配等規則的方法。你可以通過覆蓋快照的價格來做到這一點,你不能用視圖來做到這一點。
+0

價格和稅收變化是沒有問題的,因爲他們在我的架構獨立的實體,與開始/結束日期查找它們的值在給定時間。但重要的是,快照將使數據對未來的數據消費者更加透明。還有一個更好的觀點:我的折扣規則令人頭疼。使用我的方法,如果他們改變了,我將不得不保存舊規則!感謝您指出了這一點! – Tony 2009-11-18 21:20:10

+0

我試圖對其進行編輯,使其更清晰,在我的示例中不是稅額變化,計算稅款的方式正在改變;它將需要一個不同的數據庫模式。 – 2009-11-18 21:43:26

1

通常快照正在使它容易,以確保你有每個銷售的忠實記錄,是它datawarehousing或用於客戶投訴處理。有了快照,只需保持單個表格的安全,備份和嚴格的審覈即可。

這樣做會讓保證困難很多,主要是因爲您必須確保沒有人以任何方式干擾涉及的任何表格(折扣,稅收,產品,訂單等)。例如,如果有人更改2005年1月的折扣率,你將如何判斷?此外,這可以防止您以簡單的方式演變數據模型,如果您現在必須爲折扣率設置多個列,那麼您不但必須更改未來的計算,而且還要保留舊的計算(或者以向後兼容的方式做每一項改變)。

空間很便宜,擁有快照使得許多事情更容易,而且成本很低。

相關問題