2011-12-28 94 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分开一个单独的项目,但是如果你研究了该产品的盈利能力,你可能会错过这些折扣。