是否应该将自引用表列设为外键?

问题描述 投票:0回答:4

例如,要创建类别层次结构,您可以使用“parent_id”列,该列指向同一个表中的另一个类别。

这应该是外键吗?缺点/优点是什么?

database database-design foreign-keys
4个回答
35
投票

是的。确保您没有孤儿(没有父项的条目),并且根据使用情况,如果您定义级联删除,则当父项被删除时,其所有子项也将被删除。

与任何其他外键一样,缺点是性能会受到轻微影响。


15
投票

是的,你应该这样做。如果数据库关系中有一个属性充当同一数据库中另一个关系的主键,则应该将其设为 FK。

您将享受与外键相关的优势:

  • 假设关系设计正确,外键约束使程序员更难在数据库中引入不一致。
  • 由数据库服务器集中检查这些约束使得无需在应用程序端执行这些检查。这消除了不同应用程序可能不以相同方式检查约束的可能性。
  • 使用级联更新和删除可以简化应用程序代码。
  • 正确设计的外键规则有助于记录表之间的关系。

缺点:

  • 如果定义了外键,有时执行批量操作会比较困难。
  • 也许这意味着更多的磁盘使用量和轻微的性能影响。

7
投票

是的,你应该这样做。

优点(对于任何外键):

  • 确保parent_id引用表中的真实行
  • 防止意外删除具有子级的父级,或确保删除级联也删除子级
  • 提供优化器可以使用的信息

我想不出任何真正的缺点。


4
投票

是的,您应该将其设为外键。

好处是数据模型更好,冗余更少。

© www.soinside.com 2019 - 2024. All rights reserved.