Database design 为零或一对多关系建模

Database design 为零或一对多关系建模,database-design,data-modeling,Database Design,Data Modeling,我应该如何在数据库中为零或一对多关系建模?例如,用户记录可能有父记录,也可能没有父记录。那么,我的用户表应该有一个t_user.parent_id,还是应该有一个名为t_user_hierarchy的关联表,该表的列为t_user_hierarchy.parent_id和t_user_hierarchy.user_id?只需在子表(用户表?)中设置外键即可可空的我会使用一个可空的父id。然后您可以使用自连接来获取任何特定记录的父项或子项。看看这个线程。类似问题: 是否有另一个关联表或可空外键取决

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

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

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

看看这个线程。类似问题:


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

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

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

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

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

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

例如:

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)
这将返回所有客户记录并关联任何订单。它还将退回没有订单的客户