23

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

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

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

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

4

8 回答 8

14

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

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

于 2009-03-01T03:02:56.500 回答
13

诚信今天可能不是问题,但正是这种态度使明天或两周后成为问题。

于 2009-03-01T05:26:13.550 回答
6

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

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

不过,如果您还没有确定这个概念,我会怀疑您对优化设计的自满。

阅读有关外键的文档,以了解它们为强制完整性所做的工作(无论如何都值得了解。)然后看看这是否不能更完整地回答您的问题。

于 2009-03-01T03:01:15.897 回答
4

SquareCog 之前链接到的旧问题中没有提到的问题 - 是的,外键约束在进行数据清理、批量更新、测试数据生成或任何绕过正常顺序的操作时可能会很痛苦。但是 - 在你做这样的事情之前,你总是可以删除你的外键约束,然后再重新创建它们(如果你的数据库对象脚本正确,这几乎不是任何额外的工作)。

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

于 2009-03-01T04:43:25.837 回答
4

外键为您的系统带来了一项功能/约束,目前尚未提及。那是提交/事务逻辑(这就是我所说的)。在启用外键的情况下,所有受影响的表中的所有更新行都需要在那里才能进行提交(不要抛出违反外键约束的 SQL 错误)。

如果你有一个代码体,它可以工作并且“玩得又快又松”,带有提交/事务。然后,您可以进行一些补救,以使架构中的 FK 能够正常工作。

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

于 2009-03-01T05:18:21.840 回答
4

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

于 2010-10-06T16:05:29.830 回答
2

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

于 2009-03-01T05:20:54.423 回答
1

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

于 2009-03-01T03:05:38.710 回答