关于外键,为什么国内基本都不推荐使用,国外基本都推荐使用?

2021-09-04 17:38:25 +08:00
 JasonLaw

国内的一些讨论:

国外的一些讨论:

16346 次点击
所在节点    程序员
128 条回复
JasonLaw
2021-09-04 22:02:09 +08:00
@zjsxwc #40 是有一点道理,不过要保证 referential integrity,也只有数据库外键才能做到。
alamaya
2021-09-04 22:08:35 +08:00
@gBurnX 我可没说不行,只是说没应用层这么简单。也确实没接触过业界有哪些广泛使用、成本低、伸缩自如的数据库集群方案
yhkang
2021-09-04 22:09:44 +08:00
我都快忘了物理外键有什么作用了
qinwangzeng
2021-09-04 22:12:54 +08:00
本小白懂了,以后也不用外键,多一事不如少一事
ospider
2021-09-04 22:15:49 +08:00
先问是不是,再问为什么……从你发的几个链接我得不出国外都推荐使用外键这个结论来
ericls
2021-09-04 22:26:31 +08:00
不用外键的话 不是得用事务去处理约束? 不是更麻烦吗?
pigspy
2021-09-04 22:27:25 +08:00
我其实挺喜欢外键,个人觉得这玩意是关系型数据库的核心功能之一
但是奈何面向业务编程时,你很难保证领域模型是稳定且准确的,一旦不是,后期的维护和修改的成本会很大,所以干脆在应用层来自己完成外键的逻辑
kkbblzq
2021-09-04 22:30:13 +08:00
程序规模不大的话,也没有性能要求的话,随便吧,否则从程序设计的角度上看,外键会使你的程序对底层 DB 强依赖,其实是不利于程序的扩展的,在不少的分层设计中,仓储层是需要无感知能替换切换的,用了外键就不能实现这一点,而且用了外键,分库分表的之类的就没办法做了,一些分布式的 DB 也基本不支持外键,当 DB 成为瓶颈点再来大改的话反而更麻烦。
另外那个评论的例子,我想知道有没有什么其他有实际意义的场景,以这个例子来看,参照完整性好像没有什么意义,就算是子表多了一条脏数据,其实对业务本身是没有关系的,完全可以后续再清理。
kekxv
2021-09-04 22:30:45 +08:00
讲真的,用数据库进行约束,比应用层去搞好多了,因为你永远不知道下一个改代码的人会对他做什么🤔
而且,你的或者你们公司项目真的在乎那点性能吗?
BraveChi
2021-09-04 22:34:15 +08:00
@adoal 认识深刻,现在动不动就高并发高可用,其实就是个内网系统,架构整的太大,运行效果反而不如老系统设计合理
mxT52CRuqR6o5
2021-09-05 00:14:41 +08:00
是不是经常改需求就不适合用外键?
akira
2021-09-05 00:25:29 +08:00
外键这种东西,谁爱用谁用,反正我不用
JerryCha
2021-09-05 00:25:36 +08:00
因为我们的系统要出生就支持 114514 用户并发,1 分钟承担 1919810 的 transaction
Rocketer
2021-09-05 00:29:43 +08:00
一楼已经说得很清楚了,就是因为需求不明确。

这都不是需求方本身的问题,而是行业发展太快,想明确都明确不了。功能做一半,项目就被砍,然后又去做别的,这都是常态。

现在分布式数据库又不追求强一致,都是最终一致性,你以为数据应该存在而实际找不到的情况是必须要兼容的,这就更不需要外键了。
agagega
2021-09-05 00:35:56 +08:00
@JasonLaw
前面有层楼也说了,现在的业务有些稀奇古怪的做法,比如假删除,对应到数据库,外键的意义就少了很多。还有一点原因,互联网公司的业务不太追求完整的数据一致性,而外键有可能会影响性能。打个不太合适的比喻:你生活在一个很久都没有确诊病例的地方,打疫苗的意愿肯定不会那么高,因为疫苗副作用概率>感染的概率。

不过,这些习惯可能也就为了降低对开发者数据库技能的要求,把数据库下沉,单纯当一个存内容的地方。所谓保证可移植性这个就比较扯淡了。即使不用外键这些东西,一个 MySQL 的项目要转 PG 也没那么容易的。如果是 scope 很清楚的项目,复杂 join 、存储过程、视图这些用得飞起,应该能轻松不少的。
coolcfan
2021-09-05 02:10:38 +08:00
好奇 WordPress 用没用外键
passerbytiny
2021-09-05 05:44:43 +08:00
你首先的区分应用编程还是数据库编程。国内不管哪种语言、用不用 ORM 、用全 ORM 还是用半 ORM,都是应用编程,主编程语言是高级编码语言而不是 SQL,这种情况下物理外键是负担(但逻辑外键仍然存在)。而国外,既有应用编程,也有数据库编程,你用外键作为关键字搜索,结果自然倾向于数据库编程。
iPhone9
2021-09-05 05:51:19 +08:00
因为大部分人都玩不转啊
elboble
2021-09-05 06:20:30 +08:00
Python 用 orm 如果不用外键不如直接用 nosql 吧! 萌新看得满头大汗
JasonLaw
2021-09-05 06:54:59 +08:00
@Rocketer #54

我还是不明白,为什么“需求不明确”就开始开工了?就不建议使用外键了?

你说的分布式数据库指的是 NoSQL 数据库吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX