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

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

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

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

  • 默认情况下,FK 不会“索引”,那么为 FK 建立索引时需要考虑哪些因素?

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

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

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

有帮助吗?

解决方案

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

其他提示

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

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

FK 约束使您的数据保持一致。就是这样。这是主要的好处。FK 约束不会为您带来任何性能增益。

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

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

如前所述,它们是为了数据完整性。修复损坏数据所需的时间将完全消除任何性能“损失”。

然而,这可能会带来间接的性能优势。

至少对于 SQL Server,FK 中的列每一侧都必须具有相同的数据类型。例如,如果没有 FK,您可能会有一个 nvarchar 父级和一个 varchar 子级。当您连接这两个表时,您将进行数据类型转换,这可能会降低性能。

例子:不同的 varchar 长度导致问题

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top