Gen*_*nik 17 database database-design foreign-keys
我想知道外键在数据库中的实际用途.从本质上讲,如果开发人员知道不同表所依赖的键,他们就可以编写查询,就像有外键一样,对吧?
另外,我确实看到外键约束如何帮助防止数据完整性的各种错误,但是比方说,程序员在保持数据完整性方面做得很好,外键真的有多大必要吗?
Abe*_*ler 24
如果你不关心参照完整性,那么你是对的.但是......你应该关心参照完整性.
问题是人们会犯错误.电脑没有.
关于你的评论:
但是比如说,程序员在保持数据完整性方面做得很好
有人最终会犯错误.没有人是完美的.此外,如果你带来一个新的人,你并不总是能够确定他们写"完美"代码的能力.
除此之外,您将失去执行级联删除的功能以及已定义外键允许的许多其他功能.
外键是确保完整性的一种手段,即使你相信你的开发人员永远不会(!)犯错,但是拥有它们的成本通常是值得的.
外键也可以作为文档,因为你可以看到与什么有关.此信息通常也由工具使用,例如用于生成报告,从表定义创建数据集,对象关系映射器等.即使您今天不使用任何这些信息,使用FK也可以更容易地使用此路径后来.
外键还允许您定义级联规则,例如,当删除一个表中的行时,可用于删除相关表中的关联记录.
只有你有可笑的高负荷,你才应该考虑绕过FK.
编辑:更新的答案,包括来自其他答案(报告,级联)的点.
在数据库中不使用引用完整性就像不在汽车中使用安全带一样.它将为您提供从A-> B带您的可衡量的改进,但它只会在最极端的情况下产生"真正的"差异.为什么要采取"风险",除非你真的需要?
人们提出这个问题的不足之处始终是表现.
外键为优化器提供了更多信息,并且可能会产生更好的执行计划.它不像特定查询在启用约束时会快%%,更像是由于执行计划错误而有效地消除了所有类别的问题.您还可以使优化器以不受约束的方式重写查询(例如,连接消除).
从这里开始,我想开始一个神话,即参照完整性总是会提高数据库的性能.我相当有信心,如果100人设计他们的数据库进行完整的完整性检查,实际上只有不到5人需要考虑花费1秒钟的时间来禁用它们.在这5个人中,将有近0人发现他们需要禁用100%的约束.
传播这个词;)
你说
但是比如说,程序员在保持数据完整性方面做得很好
您正在寻找的表达方式是,"我100%肯定每个程序员和每个数据库管理员都会手动保持数据完整性,无论应用程序接触到哪个数据库,无论数据库变得多么复杂,从现在开始直到它的时间退役".
你不必使用它们,但为什么不呢?
他们随时为您提供帮助.通过级联更新和级联删除使生活更轻松,以确保不违反约束.
也许应用程序尊重约束,但是明确指定它们是不是有用的?您可以记录它们,或者您可以将它们放在数据库中,大多数程序员都希望找到它们应该符合的约束(我认为这是一个更好的主意!).
最后,如果您需要将数据导入到不通过前端的数据库中,您可能会意外导入违反约束的数据并破坏应用程序.
我绝对不建议跳过数据库中的关系