【发布时间】: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
我应该如何在数据库中对零或一对多关系建模?例如,用户记录可能有也可能没有父级。那么我的用户表应该有一个 t_user.parent_id 还是应该有一个名为 t_user_hierarchy 的关联表,其中包含 t_user_hierarchy.parent_id 和 t_user_hierarchy.user_id 列?
【问题讨论】:
标签: database-design data-modeling
看看这个帖子。类似问题:Any example of a necessary nullable foreign key?
是否有另一个关联表或可为空的外键取决于您的用例。它是主观的,取决于您的设计。
【讨论】:
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)
这将返回所有客户记录并关联任何订单。它还会返回没有订单的客户。
【讨论】:
只需将子表(用户表?)中的外键设为可空
【讨论】:
我会使用可以为空的父 ID。然后,您可以使用自连接来获取任何特定记录的父项或子项。
【讨论】:
数据库中的零或一对多关系通常通过声明字段来表示,在您的实例中为 Parent_ID,然后保留一个值以表示它不指向任何内容。 p>
由于关系数据库 (RDBMS) 通常允许您具有 NULL 值,因此您可以使用 NULL 值来标记没有父记录的特定记录。
Create Table T_USER (
User_ID Number(9) NOT NULL ,
Parent_ID Number(9)
)
上面的例子是针对 Oracle RDBMS 的,但是这个想法在其他数据库中也是类似的。或者,您可以用一个字段来专门标记数据库,但通常这是一个过载,因为大多数数据库系统可以处理 NULL 的特殊情况而无需添加额外的字段。
【讨论】: