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

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

国内的一些讨论:

国外的一些讨论:

15178 次点击
所在节点    程序员
128 条回复
cmdOptionKana
2021-09-04 18:22:48 +08:00
[外键应不应该建立] - V2EX 大概第 75 楼的说法归纳得比较好:

ipwx 2020-05-20 10:13:58 +08:00

感觉楼上有部分人是鸡同鸭讲。

有一部分回复是支持“在恰当的场景下使用外键”,前提条件是需求明确。

另一部分人的口吻是“弊大于利不用”。但实际上主张弊大于利的,我感受了一下,其实有个前提条件,是一开始的需求没那么明确,还要充分迭代开发,导致后面原先的外键变成了累赘。

你们两拨人根本讨论问题的前提条件就不一样好吧。
plko345
2021-09-04 18:40:19 +08:00
有没比较优秀的项目,用或不用 外键的,理由是什么?现在看大家讨论好像很多公司默认就不允许外键,是不是表示有不少人实际没有遇到过讨论外键带来的问题的问题
ltfree
2021-09-04 18:51:31 +08:00
不知道老外是不是也经常改需求
Huelse
2021-09-04 18:53:43 +08:00
个人理解,这增加了理解成本、后期维护成本

而恰好我们追求的就是低成本、低维护
agagega
2021-09-04 18:58:24 +08:00
Rails 默认就是不用 Foreign Key 的,很多框架默认也不用,不能直接说国外就很流行吧
skiy
2021-09-04 19:02:30 +08:00
按我曾经使用过的理解.
(MySQL) 导出后, 再重新导入时, 如果 A 表存在的外键是 B 表的, 但导入的顺序是 A -> B, 这个时候就会报错了. 所以,我自己的话,我是不会用外键的了.
当然, 这个用不用肯定要看应用场景的了. 存在就有其理由.
ragnaroks
2021-09-04 19:08:17 +08:00
外键会降低性能,国内很少有公司会配备专业的 DBA,都是运维或者开发靠自己优化,不如就直接不要外键用业务逻辑去约束,比如插入数据之前先检查各种冲突
Jooooooooo
2021-09-04 19:19:17 +08:00
小项目用没问题
cassyfar
2021-09-04 19:19:54 +08:00
不选外键为啥用关系型数据库? dynamodb 不香吗?
xstmjh
2021-09-04 19:34:12 +08:00
不用外键不代表不去遵循范式去定义 model,只是不在数据库层面加这么一个强约束而已
JasonLaw
2021-09-04 19:39:04 +08:00
@ltfree #3 改需求跟外键有什么关系?
wangbenjun5
2021-09-04 19:39:14 +08:00
现在国内 99%的项目都不用外键约束,包括 BAT 这些大厂的项目。通常来说,一些对数据完整性要求非常高的项目会使用,比如 OA 、金融类的,但是实际上也不一定是这样,毕竟也可以在应用层去约束。

非要说,我觉得主要原因是为了图方便,加了外键对很多操作都有限制。。。不够灵活!带来的好处也不明显
JasonLaw
2021-09-04 19:40:09 +08:00
@Huelse #4 外键“ 增加了理解成本、后期维护成本”?为什么?
JasonLaw
2021-09-04 19:50:27 +08:00
@ragnaroks #7 外键会带来数据库层面上的负担,难道“ 插入数据之前先检查各种冲突”就不是负担吗?
JasonLaw
2021-09-04 19:57:14 +08:00
@xstmjh #10

What if someone deletes the parent while you're inserting children? Right now when I submit "add comment" -- if you have already deleted your answer, this comment is now an orphan. FKs would've prevented it.

Precisely -- it should be the DB's job, since it's the only one that can guarantee transactionality in the face of multiple concurrent clients.

不在数据库层面加上外键约束的话,应用代码怎么能做到数据库外键的效果?就比如第一段文字所描述的场景。
JasonLaw
2021-09-04 19:58:19 +08:00
@wangbenjun5 #12 “方便”具体指的是什么?
JasonLaw
2021-09-04 20:01:28 +08:00
@agagega #5 我更想知道现象背后的原因,而不是现在是怎样一个现象,欢迎分享你的想法。
JasonLaw
2021-09-04 20:02:43 +08:00
@Jooooooooo #8 大项目用会有什么问题?顺便问一下,怎样的才是大项目?
alamaya
2021-09-04 20:22:42 +08:00
@JasonLaw 应用层横向扩展加机器就完事儿了,数据库可没这么简单,说到底,就是让数据库做尽量简单的事,复杂的逻辑都移到应用层
zjsxwc
2021-09-04 20:22:50 +08:00
不是不想用,
而是业务复杂点,就碰到外键循环死锁依赖问题,
真 tm 吃 shit

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

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

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

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

© 2021 V2EX