leader 竟然让我们用外键

2019-12-05 11:54:10 +08:00
 InkAndBanner

楼主应届生,第一份工作,之前在 jd 实习时候记得都是严禁外键的,都在业务层解决.前天入职正好赶上 leader 和主程在设计表结构,然后说"我知道现在很多公司都不用外键,但是我觉得我们项目还是用外键,避免脏数据嘛" [leader 是个老程序员...] , 现在显示和我接受到的教育开始冲击了......有点怀疑人生. 想问问大家你们工作中的项目有没有用过外键啊? 怎么处理这种技术方面的"厌恶感"啊

12550 次点击
所在节点    问与答
102 条回复
Johnny168
2019-12-05 14:46:59 +08:00
说白了,就是现在不想搞(厌恶一点),以后出了事又得搞(厌恶二点)
所以,还是六字真言送给你
huanchena
2019-12-05 14:49:21 +08:00
@InkAndBanner #12 年轻人 还没有经受社会的毒打。。
Raymon111111
2019-12-05 14:56:41 +08:00
不考虑性能的情况下, 用外键可以使得你不考虑数据一致性的问题
taogen
2019-12-05 15:20:23 +08:00
性能与数据一致性的权衡。用部分性能代价换取严格的数据一致性。

建议看一下高性能 MySQL,扩展一下思维。
18ac0877
2019-12-05 15:36:53 +08:00
既然楼主应届生,建议不要考虑工资,这是多么难的练手机会呀,多么好的学习机会呀。有人花钱请你学习,为什么还挑三拣四的? 建议楼主强烈支持上外键的版本,等什么时候出问题了,再强烈建议做重构,取消外键,这样就知道两种版本的区别,为你下次跳槽积攒了多么重要的经验的,关键是有人花钱请你学习呀,还不用承担后果。

最好,强烈鄙视楼主,身在福中不知福。
looseChen
2019-12-05 15:42:56 +08:00
广听言论,多思考背后的逻辑,不要被 JD 的思想潜移默化
Vegetable
2019-12-05 15:45:17 +08:00
「看山是山,看山不是山,看山还是山」
ChenStyle
2019-12-05 15:45:32 +08:00
技术是为业务服务的。

业务是为人服务的。
Vegetable
2019-12-05 15:46:26 +08:00
教条主义是工程师的大忌!
abcdexx
2019-12-05 15:52:56 +08:00
@18ac0877 有道理,学习了
Caratpine
2019-12-05 16:09:04 +08:00
用不用外键都是根据业务场景决定的,不是死知识。
barbery
2019-12-05 16:18:42 +08:00
一圈怼楼主的,就问一句,你们的项目用了外键了吗?
lllllliu
2019-12-05 16:19:47 +08:00
emmm 你们说的外键是建表的时候用的外键约束,还是比如 a_table > id , name b_table> id,a_id,other_info 这种情况下的 a_id ? 俩的区别是第二个没有做外键约束,,只是查询用的。。范式化??忘了都- -
seakingii
2019-12-05 16:26:18 +08:00
小规模的项目完全可以用外键
Marstin
2019-12-05 16:26:50 +08:00
额,本来想怼楼主的,一度以为一对多就是外键了,慌了一下。查了一下 mysql 文档才发现,外键是 foreign_key 是数据库层面表与表之间的强关联,我还真从大一开始就没用过这个,接手过最烂的项目也没用过

其实这种银行项目,为什么要物理删除,采用逻辑删除,就不存在外键的问题啊
Felldeadbird
2019-12-05 16:51:43 +08:00
不同领导有不同要求,适用时代才是生存之道。
passerbytiny
2019-12-05 17:00:30 +08:00
@Just1n 接口让前端定义还是后端定义、多服务的数据整合让前端处理还是后端门面处理、用 Java8 还是用 Java11,这些是没有定论要看情况选择的。但是,“用业务上的约束还是数据库外键”,跟“面向对象还是面向过程”、“基于领域模型还是基于 CRUD”、“代码编程还是数据库编程”、“用模板还是用 JSP”这些问题一样,是有定论答案的,即:只要有能力有条件用前者,就不能用后者。

虽然你不啦不啦了一大堆,但是你是站在 DBA (或者不混程序员社区的老程序员)的角度上看问题的,并不是在程序员的角度上看问题。推测原因:
一、楼主年少只在 JD 实习过,拿 JD 的经验来说事,你就认为只有 JD 是这么干的;然而事实是,不管是培训班,还是复制粘贴博客,还是大厂里的正式规范,数据库外键都是严禁的(例:〔阿里编码规约〕 [强制] 不得使用外键与级联,一切外键概念必须在应用层解决)。
二、你在 SO 的搜索关键字是“DB foreign Key pros and cons”,然而要是程序员搜索,关键字是“program or db foreign key to make constraint”

@b821025551b #31 我没做过银行项目,但是能猜的出银行即使用了数据库外键,仍然会有其它手段去做约束,因为即使你用上了包括外键在内的所有数据库上的约束手段,那还是不如一份严格的测试报告保险。数据库外键对于银行项目来说,只能算作锦上添花的保险设施,并不是必要条件。
shuangyeying
2019-12-05 17:17:00 +08:00
无所谓,跟着 leader 走,技术干不翻他就活该好好听话。什么时候自己是 leader 才能让别人听话。
encro
2019-12-05 17:19:48 +08:00
外键好处:
1,部分框架自动生成关联 Model,代码更少。
2,强约束,不会出现类似删除父级,子集还在的情况。

外键坏处:
1,部分外键字段其实业务上本身就是可以选的;
2,默认没注意就嵌套删除;

为了数据的安全,目前我这边的做法:
1,只有软删除,不允许物理删除,甚至可以考虑不开放删除权限账号;
2,一律不用外键。

你想某人删除一个用户,结果将所有交易纪录,访问记录都 xxx 了,多恐怖啊。
encro
2019-12-05 17:25:01 +08:00
说外键性能差的,连数据库原理都不清楚,而且写程序没有动过脑子。

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

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

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

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

© 2021 V2EX