首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外键怎么了?

外键怎么了?
EN

Stack Overflow用户
提问于 2008-09-17 13:25:54
回答 38查看 122.7K关注 0票数 277

我记得乔尔·斯波斯基播客014中提到他几乎没有使用过外键(如果我没记错的话)。但是,对我来说,它们对于避免整个数据库中的重复和随后的数据完整性问题是非常重要的。

对于为什么(为了避免用堆栈溢出原则进行讨论),人们有充分的理由吗?

编辑: https://stackoverflow.fogbugz.com/default.asp?W13086

EN

回答 38

Stack Overflow用户

发布于 2008-09-17 13:46:37

使用外键的理由:

  • 你不会得到孤立的行
  • 您可以获得良好的“删除级联”行为,自动清理表。
  • 了解数据库中表之间的关系有助于优化器为最有效的执行规划查询,因为它能够更好地估计连接基数。
  • FKs在数据库中收集最重要的统计数据方面给出了相当大的提示,从而提高了性能。
  • 它们支持各种自动生成的支持-- ORMs可以自己生成,可视化工具可以为您创建很好的模式布局,等等。
  • 项目的新手会更快地进入事物的流程,因为否则隐式关系就会被显式地记录下来。

不使用外国钥匙的理由:

  • 您使DB在每个CRUD操作上额外工作,因为它必须检查FK的一致性。这可能是一个很大的成本,如果你有大量的搅动
  • 通过强制关系,FKs指定了必须添加/删除事物的顺序,这可能导致DB拒绝执行您想做的事情。(当然,在这种情况下,您要做的是创建一个孤儿行,这通常不是件好事)。当您正在执行大型批处理更新时,这尤其痛苦,并且先加载一个表,然后第二个表创建一致的状态(但是,如果第二个加载失败并且数据库现在不一致,那么您是否应该这样做?)。
  • 有时,您预先知道您的数据将是脏的,您接受它,并且您希望DB接受它。
  • 你只是在偷懒-)

我想(我不确定!)大多数已建立的数据库提供了一种方法来指定未强制执行的外键,并且只是一些元数据。由于非强制执行消除了不使用FKs的所有原因,如果第二节中的任何理由适用,您可能应该走这条路线。

票数 381
EN

Stack Overflow用户

发布于 2008-09-17 16:55:17

这是一个成长的问题。如果在你的教育或职业生涯的某个地方,你花时间喂养和照顾数据库(或与有才华的人密切合作),那么实体和关系的基本原则在你的思维过程中就根深蒂固了。这些基本原理包括如何/何时/为什么在数据库中指定密钥(主键、外键和可能的备用键)。这是第二天性。

但是,如果您过去在与RDBMS相关的工作中没有这样彻底或积极的经验,那么您很可能没有接触过这样的信息。或者你的过去可能包括沉浸在一个声势浩大的反数据库环境中(例如,“那些DBA是白痴--我们很少,我们选择了很少的java/c#代码吊带器就能拯救这一天”),在这种情况下,你可能会强烈反对某个白痴说FKs (以及他们可能暗示的约束)中那些神秘的废话--如果你愿意听的话。

大多数人从小就被教导刷牙是很重要的。没有它你能过得去吗?当然,但在某种程度上,你的牙齿会比如果你每次饭后刷牙的话都少。如果妈妈和爸爸足够负责数据库的设计和口腔卫生,我们就不会有这样的谈话了。:-)

票数 87
EN

Stack Overflow用户

发布于 2008-09-17 13:38:10

我相信有很多应用程序可以让你摆脱它,但这不是最好的主意。您不能总是依靠应用程序来正确地管理数据库,坦率地说,管理数据库不应该是您的应用程序非常关心的问题。

如果使用的是关系数据库,那么似乎应该在其中定义一些关系。不幸的是,这种态度(您不需要外键)似乎被许多应用程序开发人员所接受,他们不愿为诸如数据完整性之类的愚蠢事情而烦恼(但需要这样做,因为他们的公司没有专门的数据库开发人员)。通常,在按这些类型组合的数据库中,只有主键才是幸运的;)

票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/83147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档