代码之家  ›  专栏  ›  技术社区  ›  Prashant Lakhlani

在创建子表时,哪一个是好的数据库设计?

  •  0
  • Prashant Lakhlani  · 技术社区  · 14 年前

    我在设计儿童桌时注意到了两种方法

    方法1示例:

    
    Master Table >>Order Table (order_id pk)
    Child Table >>order_products 
    table (order_id,product_id, quantity,PK (order_id,product_id))
    
    

    方法2示例:

    
    Master Table >>Order Table (order_id pk)
    Child Table >>order_products table (order_product_id PK, order_id,product_id, quantity)
    

    问题: 注意,我们正在使用加法 order_product_id 在第二种方法中。这是我的问题,是使用组合主键还是像方法2中那样引入一个新的列?

    有什么利弊。 这取决于双方的关系吗?(万一) one-to-many 方法1更好,或者 many-to-many 方法2更好等)

    4 回复  |  直到 14 年前
        1
  •  1
  •   sled    14 年前

    第二个选项是要执行的,因为在第一个选项中有一个复合主键:

    PK (order_id,product_id)
    

    所以您总是需要这两个值来引用一个记录。

    我推荐第二个,如果您需要一些限制,请创建一个唯一的订单编号和产品编号索引。

        2
  •  1
  •   Amadan    14 年前

    你似乎已经明白了(还是你?)一对多关系和多对多关系的区别,所以我不确定你在问什么。

    当您有一对多模式时,使用第二个模式;当您有多对多模式时,您需要第一个模式的额外表。

        3
  •  1
  •   Stefan Steinegger    14 年前

    我一点也不会多想。这是一个简单的一对多关系。你应该确定 订单项作为自己的实体 ,不是链接表。

    • 订单包含多个订单项
    • 订单项具有产品、数量等。
    • 那里 可以 成为订单和产品的唯一约束。但这是必要的吗?

    这样看,显然是解决方案二:

    • 订单(订单号pk)
    • orderitem(orderitem_id pk,order_id(fk),product_id(fk),数量)
        4
  •  0
  •   TomTom    14 年前

    这不是设计问题,而是功能问题。

    在你的第一个例子-你如何处理某人订购3本书?输入3个不同时间的同一本书(2个孩子)?

    一般来说-对不起-细节应该包含所有Reelvant信息。这包括金额,但也包括文本和价格信息。

    为什么?

    因为根据您的业务,您可能会更改项目的描述或订单到达后的价格,这可能会更改未来订单的描述,但不会更改已在处理中的订单。

    想象一下,我去你的商店订购一个9,99的小部件,然后-2分钟后-有人将价格改为14,99。我仍然应该得到9,99的小工具,因为这是我的订单输入时vlaid的价格。如果你方同意我方14.99的订单,那就是欺诈。

    我建议专业化。获取数据模型资源手册第1卷的副本。有很多数据模型用于Standard SCNearios,比如ORD的处理。