English 中文(简体)
我应该使用外键吗? [重复]
原标题:
  • 时间:2009-03-01 02:56:31
  •  标签:
This question already has answers here:
Closed 10 years ago.

Possible Duplicate:
What’s wrong with foreign keys?

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

I search around the web why I should use foreign keys. by now I only indexed the keys used to join tables. Performance is all fine, dataintegrety is no problem.

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

问题回答

实际上,外键并不能改善性能,事实上,它们会对所有写操作产生一定的性能损耗,以确保约束得到遵循。

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

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

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

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

如果你还没有掌握这个概念,我对你关于设计优化方面的满足感有些怀疑。

阅读外键的文档,以了解它们如何执行完整性约束(无论如何都值得了解)。然后看看是否完全回答了您的问题。

在SquareCog早先链接的旧问题中没有提到的是 - 是的,在进行数据清理、批量更新、测试数据生成或任何绕过正常流程的操作时,外键约束可能会很麻烦。但是 - 在执行此类操作之前,您始终可以放弃您的外键约束,然后稍后重新创建它们(如果您的数据库对象已正确编写脚本,则这几乎不需要额外工作)。

我曾经很懒,但现在依赖外键约束已经改观了。仍然有一些情况,你不能使用它们 - 比如跨数据库关系。

外键为您的系统带来了一个特性/约束,这一点到目前为止还没有提到。那就是提交/事务逻辑(无论我如何命名都是这样)。启用外键后,所有受影响的表中更新的所有行都需要在提交中才能工作(否则会抛出SQL错误,指外键约束已被违反)。

如果您有一段工作并且“玩的快且松散”的代码,具有提交/事务。那么您可能需要进行一些纠正,以使架构中的FK正常工作。

另外,至少Oracle可以让你禁用约束(不只是删除/移除)。因此,你可以轻松地切换它们。当你想要进行一些批量操作的时候,这非常方便,因为你可以避免进行约束的开销,或者对数据进行一些“手术”,其中的中间状态会导致约束失败。

In MySQL you can disable Foreign Key s with SET FOREIGN_KEY_CHECKS=0

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

Foreign keys make data integrity better, performance, somewhat slower when deleting/inserting/updating.
In my last company we decided to keep integrity/connections in the BL, as it makes changes in the BL simpler (think hundreds of millions of records). If you have a small app, I see no reason why not do it in the data layer (db)





相关问题
热门标签