建模零或一对多关系

4

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

5个回答

3

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)

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

0
在数据库中,零或一对多关系通常通过声明字段来表示,在您的实例中为Parent_ID,然后保留一个值以表示它指向空值。
由于关系型数据库(RDBMS)通常允许您具有NULL值,因此您可以使用值NULL来标记特定记录没有父级。
Create Table T_USER (
    User_ID     Number(9) NOT NULL ,
    Parent_ID   Number(9)
)

以上示例是针对Oracle RDBMS的,但在其他数据库中的想法也类似。另外,您可以使用一个字段来具体标记数据库,但通常这会造成负担,因为大多数数据库系统可以处理NULL的特殊情况而不需要添加额外的字段。

0

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


0
我会选择一个可空的父ID。然后,您可以使用自连接来获取任何特定记录的父级或子级。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接