【问题标题】:SQL Server Foreign Key constraint benefitsSQL Server 外键约束的好处
【发布时间】:2012-05-01 22:29:49
【问题描述】:

我们正在设计一个数据库,我需要在其中考虑一些 FK(外键) 约束。但不限于 正式的结构化和规范化。 只有当它提供任何 性能或可扩展性优势。

我一直在浏览一些有趣的文章并在谷歌上搜索实际的好处。以下是一些链接:

http://www.mssqltips.com/tip.asp?tip=1296

我想了解更多关于 FK 的好处(除了正式的结构和著名的级联删除\更新)。

  • FK 默认不被“索引”,那么在索引 FK 时有哪些注意事项?

  • 如何处理映射为外键的可空字段 - 是否允许?

  • 除了索引之外,这是否有助于优化 SQL-Server 中的查询执行计划?

我知道还有更多,但我更希望专家就此发表意见。请指导我。

【问题讨论】:

    标签: sql foreign-keys


    【解决方案1】:
    • 外键不提供性能或可扩展性优势。
    • 外键强制参照完整性。如果有人试图从父表中错误地删除行,这可以通过引发错误来提供实际好处。
    • 默认情况下不索引外键。您应该为外键列建立索引,因为这样可以避免在删除/更新父行时对子表进行表扫描。
    • 您可以使外键列可以为空并插入空。

    【讨论】:

    • 我一直在处理一些包含几百万条记录的数据库。在数据库及其克隆之间导入数据,然后在 web 应用程序环境中使用该克隆有很多事情要做。好吧,我知道自动保留 PK 索引,因此它有助于加快数据访问速度。现在,从这个讨论中我得出,如果我在我的 SQL 查询中使用 JOIN,那么我将使用 FK 并对其进行索引以使 JOIN 操作高效。
    • 例如,我有一个 OrgMaster 表(包含所有 Org 记录)然后我有一个 BookingMaster 表(包含所有 Booking 记录)。现在,OrgMaster.Id 被“引用”为 BookingMaster.OrgId。所以,我有一个用于 OrgId-to-Id 关系的 FK,我将它“索引”以更好地执行这两个表之间的任何 JOIN 操作..我得到它了吗?
      以上所有 - 以额外的空间和时间开销为代价(使用 FK 在表中插入记录时)。
    • 我要求您提供一份需要考虑的点列表,例如 - - 随着表增长几百万条记录,FK-index 是否会占用太多空间\时间? - 在那种情况下,“每次”都值得去一个 FK-index 吗? - 在什么情况下我不应用 FK 或索引它或不做任何事情(当然我可以从应用程序处理很多) - 任何其他棘手的加速 JOIN 或其他此类耗时的查找?
    【解决方案2】:

    主要的好处是,如果您的有缺陷的客户端代码试图做错事,您的数据库不会最终出现不一致。外键是一种“约束”,所以你应该这样使用它们。

    它们没有任何“功能”优势,它们不会优化任何东西。您仍然必须自己创建索引等。是的,您可以在作为外键的列中包含 NULL 值。

    【讨论】:

    • 不仅仅是错误的客户端代码。众所周知,“有问题”的用户和数据库管理员在通过直接输入 SQL 更新命令进行快速修复时会犯错误!
    【解决方案3】:

    FK 约束使您的数据保持一致。而已。这是主要的好处。 FK 约束不会为您提供任何性能提升。

    但是,除非您有意对数据库结构进行非规范化,否则我建议您使用 FK 约束。主要原因——一致性。

    【讨论】:

      【解决方案4】:

      我在网上阅读了至少一个示例,其中显示外键 确实 提高了性能,因为优化器不必对表进行额外检查,因为它知道数据已经满足某些标准到 FK。抱歉,我没有链接,但博客提供了查询计划的详细输出来证明这一点。

      【讨论】:

        【解决方案5】:

        如前所述,它们用于数据完整性。修复损坏数据所需的时间将彻底消除任何性能“损失”。

        但是,可能会有间接的性能优势。

        至少对于 SQL Server,FK 中的列在每一侧都必须具有相同的数据类型。例如,如果没有 FK,您可能会有一个 nvarchar 父级和一个 varchar 子级。当您加入 2 个表时,您将获得可能会影响性能的数据类型转换。

        Example: different varchar lengths causing an issue

        【讨论】:

          最近更新 更多