使用外键时在同一个表中包含parent_id的表

时间:2012-08-04 16:42:56

标签: sql rdbms foreign-key-relationship

我有一个包含各种类别的表格。以下是缩小的表结构:

tb_categories
  category_id
  category_name
  category_parent_id

我在category_id上的category_parent_id上创建了一个外键约束,因此数据完整性可以保存在同一个表中。

第一个问题是,在同一个表上使用外键是一种好习惯。从我的思维方式来看,我认为在这种情况下是的,这是一个很好的做法。

第二个问题是,关于如何存储全局父实体的最佳方法是什么?

我提出了以下方法:

方法1:category_parent_id可以存储空值,唯一的null是名为All

的全局父类别

方法2:category_parent_id不能存储空值,全局parrent ALL将包含相同的category_id。因此,仅对于此类别,category_id和category_parent_id将是相同的。没有空值,我不能将此category_parent_id插入为0,因为0不存在作为category_id

方法3:没有全球父母,并且会有不同的“父母”。例如,拥有Audio,Visual作为父母和MP3,WMA作为Audio的孩子和MPEG,AVI作为Visual的孩子。在整个方法中,方法1和2的相同原理适用。

方法4:这是我喜欢的最少方法,包括没有这个外键约束,因此全局父级可以设置为0,这在任何其他类别中都不存在。

有什么建议吗?因为我正在寻找最佳实践,而不是“正常工作”。

1 个答案:

答案 0 :(得分:1)

让表自己参考是正常的。有很多真实场景​​需要这种情况(员工 - >经理是着名的教科书示例)。

而且,你最终会得到一个全球性的" parent是单个全局父级还是多个全局父级。所以你需要提出一种方法。

我更喜欢方法1 - 没有父级的元素根本就没有父级,因为它确实实现了您的业务规则。

拥有0或将自我作为父级会在遇到复杂查询时产生问题