在v2ex上看到个帖子,关于外键,为什么国内基本都不推荐使用,国外基本都推荐使用。虽然在学校的时候,学到了外键,但是在工作中确实没有用过,主要是公司里的规范要求不使用外键(狗头),至于原因,确实没有深入思考过。刚好看到这个帖子,这里归纳总结下。
外键是一种规范与约束,一定要有,但不一定要用数据库去实现。
外键功能,到底用数据库去实现,还是用代码实现,要看成本。这里的成本,有员工成本,与服务器成本两个因素。
- 用数据库实现外键,员工成本小,服务器成本高。但国外,员工工资贵,服务器相反会便宜些,而国内相反,这是主要因素。
- 国外人少,内卷小,而且各自行业规范多,员工职业素质高,做事规范,自然要用外键,这是原因二。反观国内,竞争太激烈了。整体呈粗犷化,甲方爸爸天天加需求,数据库表一天加好几个,时不时改字段,要用外键的话,每次还得梳理一遍,很麻烦。
面向业务编程时,你很难保证领域模型是稳定且准确的,一旦不是,后期的维护和修改的成本会很大,所以干脆在应用层来自己完成外键的逻辑
确实,相比改表,还是改代码来的简单。
因为大部分人都玩不转啊
就说一个巨常见的需求:不掉线改表。有的时候真的只能重建表结构,然后数据复制过去,然后改表名字
想起我们之前1亿条数据的订单表,要加字段,这如果搞个外键,真的要头痛死。
“加不了?不加?那换个能加的人来做!” Leader 如是说。
因为现在互联网环境提倡快速迭代开发,而不是早年软件工程那一套需要开发后持续长期稳定维护更新的工作流程,所以各种范式约束反而会成为累赘。
大部分互联网企业不用外键的原因是没有专门的开发 DBA, 开发人员糙快猛大多数对数据库也没有很深的理解, 所以用不好, 然后一出问题不去学习, 就推说数据库有坑.
长期撸企业项目, 外键起着非常关键的作用, 数据的完整性, 约束, 级联删除怎么用怎么爽
mysql 就别用了. 如果上了 oracle 什么的商业数据库, 外键倒是搞不死.
免费的东西终究还是没有收费的可靠。
总结
对于互联网行业的快速迭代开发、频繁的需求变更,不加外键应该是一种更好的选择。数据库做存储的事儿,代码做数据组织的事儿,各司其职。
对于企业项目,部分工程师更倾向于加上外键,有了外键的约束,可以更放心的操纵数据库。(很多企业应用,都喜欢在 db 层面搞,还有专门的存储过程开发,也负担得起 oracle 之类商业数据库的开销)