可能重复:
外键有什么问题?
我使用带有大约 4 GB 数据的大型数据库的 MS Sql Server。
我在网上搜索为什么我应该使用外键。到目前为止,我只索引了用于连接表的键。性能很好,数据完整性没问题。
我应该使用外键吗?我会用外键获得更多的性能吗?
可能重复:
外键有什么问题?
我使用带有大约 4 GB 数据的大型数据库的 MS Sql Server。
我在网上搜索为什么我应该使用外键。到目前为止,我只索引了用于连接表的键。性能很好,数据完整性没问题。
我应该使用外键吗?我会用外键获得更多的性能吗?
外键实际上并没有提高性能,实际上它们会在所有写入操作上产生很小的性能损失,以确保遵循约束。
您要使用这些的原因是为了防止破坏性的写入操作。如果您没有它们,错误代码或错误的 sql 语句可能会删除预期存在的行。
诚信今天可能不是问题,但正是这种态度使明天或两周后成为问题。
外键主要是用于加强数据库完整性的工具,与执行速度无关。
如果您已经优化了索引设计,那么您可能已经安装了这些索引,至少作为非唯一索引。所以我不希望仅仅通过安装外键来改变性能(甚至不一定涉及索引。)
不过,如果您还没有确定这个概念,我会怀疑您对优化设计的自满。
阅读有关外键的文档,以了解它们为强制完整性所做的工作(无论如何都值得了解。)然后看看这是否不能更完整地回答您的问题。
SquareCog 之前链接到的旧问题中没有提到的问题 - 是的,外键约束在进行数据清理、批量更新、测试数据生成或任何绕过正常顺序的操作时可能会很痛苦。但是 - 在你做这样的事情之前,你总是可以删除你的外键约束,然后再重新创建它们(如果你的数据库对象脚本正确,这几乎不是任何额外的工作)。
我曾经很懒惰,但已经开始依赖外键约束。在某些情况下您仍然无法拥有它们 - 例如在跨数据库关系中。
外键为您的系统带来了一项功能/约束,目前尚未提及。那是提交/事务逻辑(这就是我所说的)。在启用外键的情况下,所有受影响的表中的所有更新行都需要在那里才能进行提交(不要抛出违反外键约束的 SQL 错误)。
如果你有一个代码体,它可以工作并且“玩得又快又松”,带有提交/事务。然后,您可以进行一些补救,以使架构中的 FK 能够正常工作。
此外,至少 Oracle 允许您禁用约束(不仅仅是删除/删除)。因此,您可以轻松地打开/关闭它们。方便,当您想在没有约束开销的情况下进行一些批量操作时,或者对具有中间状态的数据进行一些“手术”,这些状态会使约束失效。
在 MySQL 中,您可以禁用外键SET FOREIGN_KEY_CHECKS=0
外键还有助于保持数据库清洁,因为您可以让数据库进行级联删除。
外键使数据完整性更好,性能更好,删除/插入/更新时稍慢。
在我上一家公司,我们决定在 BL 中保持完整性/连接,因为它使 BL 中的更改更简单(想想数亿条记录)。如果您有一个小型应用程序,我认为没有理由不在数据层 (db) 中执行此操作