我应该使用外键在 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:当我的外键在数组中时,如何在模型中添加关系?