模拟零或一对多关系

时间:2010-03-27 17:27:23

标签: database-design data-modeling

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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)

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

答案 2 :(得分:0)

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

即可

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

以上示例适用于Oracle RDBMS,但其他数据库中的想法也类似。或者,您可以使用一个字段来标记数据库,但通常这是一个重载,因为大多数数据库系统可以处理NULL的特殊情况而不添加额外的字段。