我应该使用外键在 SQL 中显示树关系吗

Posted

技术标签:

【中文标题】我应该使用外键在 SQL 中显示树关系吗【英文标题】:Should I use a Foreign Key to Show Tree Relationship in SQL 【发布时间】:2009-06-26 21:20:45 【问题描述】:

我正在尝试在表格中建模树关系。例如,有“类别”,类别本身可以位于父类别中。

我的架构是:

id int PRIMARY KEY,
parent_id int,
name

我的问题是,我应该将 parent_id 列标记为外键吗? Foreign 意味着“外部”而不是自我引用。为此目的是否有不同类型的密钥?

我的问题类似于: Self-referencing constraint in MS SQL,但我问的是不同的问题,级联不是问题。

【问题讨论】:

这是另一个您可能错过的 SO 帖子:***.com/questions/935098/… 【参考方案1】:

自引用外键一直在发生。例如。一个员工可能有另一个“员工”作为他的经理,因此 manager_id 将是同一张表中employee_id 字段的外键。

外键是在分层数据中表示父节点的自然候选者,尽管它们并非专门用于此:)

【讨论】:

【参考方案2】:

如果您有非常深的嵌套级别,则可能不容易高效地选择特定节点的所有后代,因为大多数 DB 不能很好地处理递归。另一种方法是使用所谓的“嵌套集模型”来表示关系。这里有一篇很棒的文章:

http://www.intelligententerprise.com/001020/celko.jhtml

【讨论】:

【参考方案3】:

在将树结构映射到关系数据库时,通常会使用同一张表中两列之间的外键。但是,这不是唯一可用的方法。

请参阅这篇文章以获取替代表述:Storing Hierarchical Data in a Database

【讨论】:

【参考方案4】:

我不相信还有另一种类型的键...在这种情况下使用外键就可以了...它将强制对 parent_id 进行约束以确保它引用有效的 id

【讨论】:

以上是关于我应该使用外键在 SQL 中显示树关系吗的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:当我的外键在数组中时,如何在模型中添加关系?

外键在对象上不可用

CakePHP 3外键在视图中

如何在模板中显示具有外键关系的元素?

外键在一对多关系中始终为空 - Spring Boot Data with JPA

oracle怎么查看外键在哪个表