大家在正式的环境里面会使用外键么

2015-11-19 14:11:23 +08:00
 yeyuexia
最近和几个同事聊及对 mysql 的使用的时候,纷纷对我们项目并不使用外键而在逻辑上维护 table 之间的关系这种事情感到不可思议,说“怎么能这么做呢,为什么不用外键?” 这件事情简直对我产生了巨大的冲击,难道还有人会在生产环境上使用外键么? 如果是的话,能否告诉我为什么要这么做,好处有哪些? 谢谢
13056 次点击
所在节点    程序员
57 条回复
abscon
2015-11-20 09:27:46 +08:00
@clinkzlol ORM 的实现也会用外键
exit0
2015-11-20 09:52:04 +08:00
这类系统 etl 操作多,表约束成了障碍。
lilydjwg
2015-11-27 18:28:38 +08:00
我一直很疑惑的是,为什么很多人不用外键不用约束,却要手工连上数据库操作?把数据改坏了怎么办?我在学校时就见过一个坏得完全没法用的数据库。

当然 MySQL 的实现若是有问题那当我没说。
yeyuexia
2015-12-02 11:28:43 +08:00
@lilydjwg
@SmiteChow
@rail4you
统一回复下吧 个人觉得使用外键开保证数据一致的话,不可避免的会造成扩展性的损失。因为你依赖了大量的外部的工具来保证了你程序的逻辑完备,一旦需要数据迁移到其他数据库上时,会造成很大的麻烦。而且使用外键,实际上是将一些逻辑服务器的压力转嫁到了 mysql 上,如果你的系统只是服务于小量级的用户的话,那用用也没什么,一旦用户量变大,后果不堪设想。还有就是手动改数据库而不是用接口去改这个事情,个人表示佩服。
rail4you
2015-12-02 12:32:42 +08:00
@yeyuexia mysql 的功能和性能也很强,不是 toy 级别的数据库。楼主总是说 mysql 只能服务小数量级用户(什么算小?),用户量变大不可想象,这些都是主观臆断。现实中 mysql 使用外键的例子太多 ,这些 mysql 应用的用户量都不小,数据库端的逻辑也没那么简单。

数据库的迁移一直很麻烦,不单单是 mysql ,数据验证还有用户逻辑也有很多选择,有丰富经验 dba 的情况下,在数据库端做这些也无妨。

数据库环境很复杂的,每种数据库都有自己擅长的领域。楼主的数据库经验只限于一定领域,建议把话题限制下,说明下数据库应用范围(比如 xxx 类的互联网应用),这样能减少很多争议。
SmiteChow
2015-12-02 15:47:29 +08:00
数据库表的定义必然在程序里啊,现在都是 ORM ,如果楼主认为 mysql 的外健性能还不如你程序自己写的话可能楼主是撸 C 的大牛。
zonghua
2016-08-11 01:00:49 +08:00
外键不利于集群
ezreal
2016-10-11 14:30:21 +08:00
公司线上数据库全面禁止外键!
ezreal
2016-10-11 14:32:12 +08:00
外键高并发下会有性能问题,以及容易造成死锁?
rosalindest
2016-12-07 15:43:32 +08:00
大半年前你说你在 thoughtworks ,小女子现在有一事相求!!!!!!!!
虽然你很久不上 V2 ,看到可否回复!!!!!!!!!!!!!!!
yeyuexia
2016-12-08 14:04:52 +08:00
@rosalindest 啥事?
rosalindest
2016-12-19 14:07:49 +08:00
啊啊啊啊居然被看到了!!抱歉现在才回复!!!我想问你还在 TW 么??
yeyuexia
2016-12-21 14:49:52 +08:00
@rosalindest 在 有事私聊吧 yyxworld@gmail.com 我邮箱
Pegasus
2017-02-16 00:22:13 +08:00
最近阿里放出来的《 java 开发规范》里明确说了不用外键。
liuxin5959
2017-02-17 18:05:53 +08:00
@Pegasus 看来可以终结这个问题了,马云爸爸都说不要用了。😂
Mark24
2017-03-01 14:35:39 +08:00
@Infernalzero 感谢

长知识了

一直以为一定要外键。
kanezeng
2019-01-24 18:50:09 +08:00
其实对大多数量小的项目来说,我觉得用不用外键看自己吧。对于量很大的项目,很可能实施了一大堆微服务,严格来说每个微服务应该有自己背后的的数据库,这时候比如用户表和帖子表可能都在不同的数据库服务器里的,也就没有人考虑外键的问题了。不过大多这种情况下,直接 nosql 更好一点。

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

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

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

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

© 2021 V2EX