我应该使用外键吗?

24

可能是重复问题:
外键有什么问题?

我使用 MS Sql Server,拥有一个大约 4 GB 数据的大型数据库。

我在网上搜索了为什么应该使用外键。 目前我只索引用于连接表的键。 性能完全正常,数据完整性没有问题。

我应该使用外键吗?使用外键会获得更好的性能吗?

8个回答

16

外键实际上并不会提高性能,事实上它们会在所有写操作中产生小的性能惩罚,以确保遵循约束。

你想使用这些东西的原因是为了防止破坏性的写操作。如果没有它们,有错误的代码或糟糕的SQL语句可能会删除预期存在的行。


外键不能保护你免受糟糕代码的影响。它们只能在存在依赖子项的情况下,保护你免受删除外键关系的父级的影响。 - Mahdi Yusuf

15

完整性可能今天不是问题,但这正是使其在明天或两周后成为问题的态度。


6
一个外键主要是用于强制数据库完整性的工具,与执行速度无关。
如果您已经优化了索引设计,那么您可能已经安装了这些索引,至少作为非唯一索引。因此,我不会期望仅通过安装外键(甚至不需要涉及索引)来改变性能。
然而,如果您还没有掌握这个概念,我对您对设计优化的自满感到有些怀疑。
阅读外键文档的目标是理解它们如何强制完整性(无论如何都值得知道)。然后看看是否更全面地回答了您的问题。

1
对于插入操作来说,“与执行速度无关”并不完全准确(我知道你知道,但是Tuan可能不知道)。 - SquareCog
谢谢 - 我稍微填写了一下答案,以一种能够达到相同结果的方式。 - dkretz
良好的关于插入的论点。我对结构有很好的看法。正如我所说,完整性不是问题。我需要原始速度。 - Tuan

4
在MySQL中,您可以使用SET FOREIGN_KEY_CHECKS=0禁用外键。

4
在之前SquareCog链接的问题中没有提到的是,当进行数据清理、批量更新、测试数据生成或任何绕过正常顺序的操作时,外键约束可能会很麻烦。但是,您可以在执行此类操作之前删除外键约束,然后稍后重新创建它们(如果您的数据库对象已正确脚本化,则几乎没有额外工作)。
我曾经很懒,但现在依赖外键约束。仍有一些情况下无法使用它们,比如跨数据库关系。

4
Foreign Keys在系统中带来了一个特征/约束,这一点到目前为止还没有提到。我称之为提交/事务逻辑。启用Foreign Keys后,在所有受影响的表中进行更新的所有行都需要存在才能使提交工作正常(不会抛出违反Foreign Key Constraints的SQL错误)。
如果您有一段代码,它可以“快速松散地”处理提交/事务,那么您可能需要进行一些纠正,以便使用FK在模式中运行。
此外,至少在Oracle中,允许您禁用约束(而不仅仅是删除/删除)。因此,您可以轻松地开关它们。当您想要执行一些批量操作时,无需担心约束的开销或者要对数据进行一些“手术”,其中具有中间状态会导致约束失败时,这非常方便。

这两个问题在我发布的链接中都有提到,但无论如何我还是会投票支持你。 "提交/事务逻辑" 正式称为 ACID 保证(其中 "C" 表示一致性,即,在事务完成后,数据与声明的约束条件一致)。 - SquareCog

2

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


1

外键可以提高数据完整性,但在删除/插入/更新数据时会略微降低性能。
在我的上一家公司中,我们决定将完整性和连接保持在业务逻辑层,因为这样可以使业务逻辑的更改变得更加简单(想象一下处理数亿条记录)。如果您的应用程序很小,我认为没有理由不能在数据层(数据库)中实现。


BL代表什么? - usefulBee
1
业务层和数据层处理直接与数据库交互的代码。业务层使用该数据实现业务规则,并将其发送到用户界面。这是一种看待多层软件的有点老旧的方式。今天,我们有超过三个层次/层,并且我们有广泛分布的系统来增加这个。 - Itay Moav -Malimovka
通过说“我们决定在 BL 中保持完整性/连接性”,您是指 Code First 方法还是其他什么? - usefulBee
“我们”指的是软件架构师团队。但是,如果我理解你的问题正确的话,那么是的,我们通过代码本身而不是数据库来维护数据的完整性。顺便说一句,我并不是在说/声称这是正确的方法。 - Itay Moav -Malimovka
谢谢。我所说的代码是Entityframework引入的Code First方法,详见http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx。 - usefulBee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接