这是我经常遇到的情景:设计表的订单系统
正常化往往需要我们在其中的数据不会重演的方式来设计的表。
的典型订单输入其示出了下列信息的实施例:
- 产品描述。
- 产品价格。
标准化数据库的示例,订单表可能包含产品表(包含产品说明,定价)的PK。
但是,产品定价可能会在客户下单后增加/减少。
我应该在交易时将产品的价格存储到订单表中吗?
有没有更好的解决这类问题的方法?
这是我经常遇到的情景:设计表的订单系统
正常化往往需要我们在其中的数据不会重演的方式来设计的表。
的典型订单输入其示出了下列信息的实施例:
标准化数据库的示例,订单表可能包含产品表(包含产品说明,定价)的PK。
但是,产品定价可能会在客户下单后增加/减少。
我应该在交易时将产品的价格存储到订单表中吗?
有没有更好的解决这类问题的方法?
尽管规范化确实减少了冗余信息,但“冗余”是一个狭义的术语。在这种情况下,冗余表示具有相同含义的相同值。
应该清楚的是,“当前价格”和“定单时的价格”(或“客户同意支付的价格”)并不具有相同的含义,即使价值碰巧相同。
有几种方法来建模。但重要的见解是,当你以这种方式谈论价格时,你正在谈论两件完全不同的事情。
你是对的。我会使用OrderLine表来存储订单上的每一行。存储产品销售的价格。您还可以存储所给的折扣。
Catcall的回答很棒。应该给出正确的答案。但为了扩大这一点,列名也应该不同。如果你在两个表中有两个同名的列,我期望它们中的数据意味着同样的事情。有一个名为“价格”的专栏对任何试图理解你的模型的人都没有帮助。 Extended_price,Price_at_sale,MSRP等都能帮助我第一眼就了解数据。
另一种看待这种情况的方法是,您将如何计算优惠券/折扣/ bogo优惠/套餐?如果我以5美元的价格购买物品,但有1美元的优惠券。我以5美元还是4美元的价格出售该产品?如果你说5美元,那么你可以在细节表中为$ 1分开一个单独的项目,但是如果你研究了该产品的盈利能力,你可能会错过这些折扣。
有一件事:**不要**调用你的表'Order',因为这是一个保留的SQL关键字(如'ORDER BY') - 称之为“订单”或别的东西! – 2011-12-28 16:29:09
@marc_s Nooooo不复数我的表名! – Yuck 2011-12-28 16:30:00
@Yuck:好吧,然后叫它'OrderHead'或其他...... – 2011-12-28 16:30:32