【问题标题】:Model a Zero or One to Many Relationship为零或一对多关系建模
【发布时间】:2012-10-19 20:09:12
【问题描述】:

我应该如何在数据库中对零或一对多关系建模?例如,用户记录可能有也可能没有父级。那么我的用户表应该有一个 t_user.parent_id 还是应该有一个名为 t_user_hierarchy 的关联表,其中包含 t_user_hierarchy.parent_id 和 t_user_hierarchy.user_id 列?

【问题讨论】:

    标签: database-design data-modeling


    【解决方案1】:

    看看这个帖子。类似问题:Any example of a necessary nullable foreign key?

    是否有另一个关联表或可为空的外键取决于您的用例。它是主观的,取决于您的设计。

    【讨论】:

      【解决方案2】:

      1NF 规定没有可为空的列。因此,要实现零对一关系,请在指向父级的子级中放置一个外键(假设这是可能具有或不具有与父级相关的条目的表)。然后使用从父级到子级的外连接查询来检索有父级和没有子级的实例。

      例子:

      Customer Table (i.e., parent)
         CID (Primary Key)
         Customer_Name
         Customer_Address
         ...
      
      Order Table (i.e., child)
         OID (Primary Key)
         Ordered_Date
         Order_Quantity
         ... (product ordered would be a foreign key to the Products table; not relevant to discussion)
         CID (Foreign Key to Customer table)
      
      SQL:
         SELECT Customer.Customer_Name, Order.Ordered_Date, Order.Order_Quantity 
         FROM Customer 
         LEFT OUTER JOIN Order 
         ON Customer.CID = Order.CID (syntax generic)
      

      这将返回所有客户记录并关联任何订单。它还会返回没有订单的客户。

      【讨论】:

        【解决方案3】:

        只需将子表(用户表?)中的外键设为可空

        【讨论】:

          【解决方案4】:

          我会使用可以为空的父 ID。然后,您可以使用自连接来获取任何特定记录的父项或子项。

          【讨论】:

            【解决方案5】:

            数据库中的零或一对多关系通常通过声明字段来表示,在您的实例中为 Parent_ID,然后保留一个值以表示它不指向任何内容。 p>

            由于关系数据库 (RDBMS) 通常允许您具有 NULL 值,因此您可以使用 NULL 值来标记没有父记录的特定记录。

            Create Table T_USER (
                User_ID     Number(9) NOT NULL ,
                Parent_ID   Number(9)
            )

            上面的例子是针对 Oracle RDBMS 的,但是这个想法在其他数据库中也是类似的。或者,您可以用一个字段来专门标记数据库,但通常这是一个过载,因为大多数数据库系统可以处理 NULL 的特殊情况而无需添加额外的字段。

            【讨论】:

              猜你喜欢
              • 2015-07-10
              • 1970-01-01
              • 2014-01-11
              • 2023-03-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-25
              相关资源
              最近更新 更多