SQL Server外键约束的好处

时间:2009-10-27 09:04:41

标签: sql foreign-keys

我们正在设计一个数据库,我需要考虑一些FK(外键) 限制。但它不仅限于此 正式的结构和规范化。 我们只有在提供任何东西时才会这样做 性能或可扩展性的好处。

我一直在通过一些有趣的文章和谷歌搜索实际的好处。以下是一些链接:

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

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

  • 默认情况下,FK没有“索引”,因此在索引FK时需要考虑哪些因素?

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

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

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

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

主要的好处是,如果你的错误的客户端代码试图做错了,你的数据库不会最终不一致。外键是一种“约束”,所以你应该如何使用它们。

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

答案 2 :(得分:4)

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

但是,除非你在目的db结构上进行非规范化,否则我建议你使用FK约束。主要原因 - 一致性。

答案 3 :(得分:3)

我已经在net上阅读了至少一个示例,其中显示外键执行提高了性能,因为优化器不必对表进行额外检查,因为它知道数据符合已经到期的某些条件到FK。对不起,我没有链接,但博客提供了详细的查询计划输出来证明它。

答案 4 :(得分:1)

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

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

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

Example: different varchar lengths causing an issue