为什么很多mysql课程不推荐用物理外键?
时间:2021-07-01 10:21:17
帮助过:5人阅读
回复内容:
因为mysql数据库设计得不好,用数据库的外键有问题。以及,近年来互联网的发展,弱化数据库,可以容忍错误数据错误也成为潮流。牺牲正确性换取效率,成为潮流。DBA的水平越来也差也成为事实。
别说mysql了,其他数据库也都不用外键了。牺牲掉数据的正确性被认为是没有任何问题的。哪怕银行的系统也是一样。至于业务上如何保证关键数据(钱)是对的?好几个系统互相对账呗。
错了,修复数据嘛。只要错得不离谱就行。用外键也不能保证不出业务错误。很多时候外键的级联更新或者删除造成了性能灾难。只能级联禁止,这样造成了开发效率的下降。没有开发效率,如何有时间修复bug和优化系统呢?
外键会和触发器一样变成小众和适用场景及其少的遗留技术。
其实不光是mysql,从DBA的角度出发,我也不建议在oracle里使用外键。
外键的效果完全可以通过业务逻辑来保证,但是它带来的一系列性能问题却很难有办法解决。
看你要在哪一层面维护模型完整性。我们暂时也没有用到。但是不应该一概而论,简单的说外键没有用。
使用外键的目的是保证数据的完整性,但是这样会带来额外的性能上的开销。替代的做法是可以在应用程序中完成这一步,并且可以通过异步处理增加效率。其次外键在水平分表和分库的情况下就无法使用了。
外健开销较大,不利于维护,而且在业务逻辑中维护就绰绰有余了。
数量级不够没有sharding的系统,最好还是用外键约束来保护数据,你不能指望程序猿写的代码都是高质量的数据访问。
大数据量的分布式系统最好别用,拆表拆到死,但也要用别的办法保证数据完整性才好。
作为新项目的话,个人认为是一定要用的。因为项目迭代的时候,其他代码大不了推了重做就好,数据要是乱了,那真就是回天乏力了。