为订单系统设计表

时间:2011-12-28 16:27:17

标签: database-design

这是我经常遇到的情景:

规范化通常要求我们以数据不重复的方式设计表。

显示以下信息的典型订单条目示例:

  1. 产品说明。
  2. 产品价格。
  3. 规范化数据库的示例,订单表可能具有产品表的PK(包含产品描述,定价)。

    但是,在客户下订单后,产品定价可能会增加/减少。

    我是否应该将交易时产品的定价存入订单表?

    这类问题有更好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

尽管规范化确实减少了冗余信息,但“冗余”是一个含义狭义的技术术语。在此上下文中,冗余表示具有相同含义的相同值。

应该清楚的是,“当前价格”和“下订单时的价格”(或“客户同意支付的价格”)具有相同的含义,即使这些值恰好相同。

有几种方法可以对其进行建模。但关键的见解是,当你以这种方式谈论价格时,你谈论的是两件完全不同的事情。

答案 1 :(得分:2)

你是对的。我会使用OrderLine表来存储订单上的每一行。存储产品的售价。您还可以存储任何折扣。

答案 2 :(得分:2)

Catcall的回答很棒。应该给出正确的答案。但是为了扩展这一点,列名也应该是不同的。如果两个表中有两个具有相同名称的列,我希望它们中的数据意味着相同的东西。有一个名为“价格”的列对任何试图理解您的模型的人都没有帮助。 Extended_price,Price_at_sale,MSRP等都帮助我乍一看了解数据。

另一种看待这种情况的方法是如何计算优惠券/折扣/ bogo优惠/套餐?如果我以5美元的价格购买一件商品,但可以获得1美元的优惠券。我是以5美元还是4美元的价格销售该产品?如果您说5美元,那么您可以在详细信息表中为 - $ 1获得单独的项目,但如果您研究了该产品的盈利能力,则可能会错过这些折扣。