我应该使用外键吗?

时间:2009-03-01 02:56:31

标签: sql sql-server performance database-design foreign-keys

  

可能重复:
  What’s wrong with foreign keys?

我使用带有大约4 GB数据的大型数据库的MS Sql Server。

我在网上搜索为什么要使用外键。 到现在为止,我只索引用于连接表的键。 性能都很好,dataintegrety没问题。

我应该使用外键吗?使用外键可以获得更高的性能吗?

8 个答案:

答案 0 :(得分:14)

外键实际上并没有提高性能,实际上它们会对所有写操作造成很小的性能损失,以确保遵循约束。

您想要使用它们的原因是为了防止破坏性写入操作。如果您没有它们,错误的代码或错误的SQL语句可以删除预期存在的行。

答案 1 :(得分:13)

今天诚信可能不是一个问题,但这是明天或两周之后成为问题的确切态度。

答案 2 :(得分:6)

外键主要是用于强制执行数据库完整性的工具,与执行速度无关。

如果您已经优化了索引设计,那么您可能已经安装了这些索引,至少作为非唯一索引。所以我不希望任何性能改变只是安装外键(这甚至不一定涉及索引。)

我对你对设计优化的自满情绪有点怀疑,但是,如果你还没有把这个概念钉住的话。

阅读外键的文档,目的是了解它们如何强制执行完整性(在任何情况下都值得了解。)然后看看它是否不能更完整地回答您的问题。

答案 3 :(得分:4)

在SquareCog之前链接的旧问题中没有提到 - 是的,外键约束在进行数据清理,批量更新,测试数据生成或任何类型的操作时都会很麻烦,其中您绕过了正常的顺序的东西。但是 - 在执行此类操作之前,您始终可以删除外键约束,然后再次重新创建它们(如果您的数据库对象编写正确,那么这几乎不需要额外的工作)。

我曾经懒惰,但是依赖于外键约束。在某些情况下,您无法拥有它们 - 例如在跨数据库关系中。

答案 4 :(得分:4)

外键为您的系统带来了一个功能/约束,到目前为止还没有提到。那就是提交/事务逻辑(这就是我所说的)。启用外键后,所有受影响的表中的所有更新行都需要存在才能使提交正常工作(不会抛出违反外键约束的SQL错误)。

如果你有一个代码体,它可以工作并且“播放快速和松散”,具有提交/事务。然后你可以进行一些补救,以便在模式中使用FK。

此外,Oracle至少允许您禁用约束(不仅仅是删除/删除)。因此,您可以轻松打开/关闭它们。很方便,当您想要在没有约束的开销的情况下进行一些批量操作时,或者对具有中间状态的数据进行一些“手术”,这些数据会使约束失败。

答案 5 :(得分:4)

在MySQL中,您可以使用SET FOREIGN_KEY_CHECKS=0

禁用外键

答案 6 :(得分:2)

外键还有助于保持数据库清洁,因为您可以让数据库执行级联删除。

答案 7 :(得分:1)

外键在删除/插入/更新时使数据完整性更好,性能更慢 在我上一家公司,我们决定在BL中保持完整性/连接,因为它使BL中的更改更简单(想想数以亿计的记录)。如果你有一个小应用程序,我认为没有理由不在数据层(db)

中这样做