从事程序员工作一开始,公司的开发规范就参照阿里的开发规范,其他不说,这次就说说不使用外键,而是用代码逻辑处理相关约束这个事情吧。我觉得阿里有这样的规范应该是考虑到服务多,分库分表下外键基本上不可用了,但是当涉及体量不大,即使是多服务,但是也没有到分库分表的情况,那这种情况下我觉得使用外键还是不错的,当删除和更新是就不需要开发人员去考虑写逻辑,只要前期表设计的合理,这些容易让开发人员忽略的事情就可以交给数据库去做了。
我最近在做自己的一个小项目,我开始从头捡起了多年未使用的外键,因为我不需要考虑分表,这种情况下写代码真的省心好多,以前在写删除或者更新的时候还得自己考虑到位,保证不出现 “孤儿数据”,现在根本不需要。不知道大家平时会给自己的项目使用外键吗?如果不使用是为什么?如果使用了你觉得带来的开发收益大不大?
外企路过,FK 必须用!
本质上是 RD 和 DBA 争话语权的问题。
1. 和其他功能不兼容,例如分片(驳斥:很多问题只在早期 MySQL 中存在,PostgreSQL 大概率并没有相关问题)
2. 影响性能(驳斥:对性能影响很小。而且如果真的存在某条高频语句,你确保不会出现问题,希望外键不要做无用的检查,现代数据库都允许你针对这单条语句禁用一致性检查,从而保持性能。另外,外键约束也会帮助某些连表查询的自动优化,实际上可能有助于提升性能)
3. 人工维护数据时必须停机(驳斥:对整个数据库临时禁用一致性检查,就能在线维护数据)
4. 外键功能太弱,不满足业务需求(这个完全看特定场景了,如果不能满足业务需求那没什么好说的)