2011-12-28 53 views
0

這是我經常遇到的情景:設計表的訂單系統

正常化往往需要我們在其中的數據不會重演的方式來設計的表。

的典型訂單輸入其示出了下列信息的實施例:

  1. 產品描述。
  2. 產品價格。

標準化數據庫的示例,訂單表可能包含產品表(包含產品說明,定價)的PK。

但是,產品定價可能會在客戶下單後增加/減少。

我應該在交易時將產品的價格存儲到訂單表中嗎?

有沒有更好的解決這類問題的方法?

+1

有一件事:**不要**調用你的表'Order',因爲這是一個保留的SQL關鍵字(如'ORDER BY') - 稱之爲「訂單」或別的東西! – 2011-12-28 16:29:09

+1

@marc_s Nooooo不復數我的表名! – Yuck 2011-12-28 16:30:00

+1

@Yuck:好吧,然後叫它'OrderHead'或其他...... – 2011-12-28 16:30:32

回答

2

儘管規範化確實減少了冗餘信息,但「冗餘」是一個狹義的術語。在這種情況下,冗餘表示具有相同含義的相同值。

應該清楚的是,「當前價格」和「定單時的價格」(或「客戶同意支付的價格」)並不具有相同的含義,即使價值碰巧相同。

有幾種方法來建模。但重要的見解是,當你以這種方式談論價格時,你正在談論兩件完全不同的事情。

1

你是對的。我會使用OrderLine表來存儲訂單上的每一行。存儲產品銷售的價格。您還可以存儲所給的折扣。

0

Catcall的回答很棒。應該給出正確的答案。但爲了擴大這一點,列名也應該不同。如果你在兩個表中有兩個同名的列,我期望它們中的數據意味着同樣的事情。有一個名爲「價格」的專欄對任何試圖理解你的模型的人都沒有幫助。 Extended_price,Price_at_sale,MSRP等都能幫助我第一眼就瞭解數據。

另一種看待這種情況的方法是,您將如何計算優惠券/折扣/ bogo優惠/套餐?如果我以5美元的價格購買物品,但有1美元的優惠券。我以5美元還是4美元的價格出售該產品?如果你說5美元,那麼你可以在細節表中爲$ 1分開一個單獨的項目,但是如果你研究了該產品的盈利能力,你可能會錯過這些折扣。