数据库外键
性能影响
如果说我们使用了数据库外键的话,其实对于整个项目来讲是有一定性能影响的。一开始最早在我们接触数据库的时候,会有一个数据库三大范式,那么其中就有一点强调,我们要保证数据的一个完整性,也就是数据库在表和表之间一旦有关系的话,我们要使用一个外键,并且这个外键是要有一个物理外键的关系的。外键的好处一个是数据库的一个完整性,另外一个就是强调了数据的强力执行。
但是在分布式项目里面,大型互联网项目里面,在我们进行一些CRUD操作时,对于我们整体的数据库性能会有一定的影响的,因为数据库它会对数据的完整性去做一些相应的检查操作,所以说只要是在我们有一些大并发的时候,数据库的性能是一定会受到相应的影响的,所以说数据库物理外键的关系是尽量的要移除。
热更新
在分布式环境下我们的项目大多数是要进行热更新的,什么是热更新?就是我们不停机去进行项目的维护,不管是互联网产品还是一些游戏、手游,大多都能采用热更新的一种方式。如果说数据库有外键的话,可能会导致新更新上去的一些代码会无法运行,因为要去匹配到现有的一些外键,所以说你可能要去重启一下服务器,这样子就达不到热更新的一个目的。因为外键是强力执行的,这一点是和分布式绝对是冲突的。
降低耦合度
删除了外键,并不是真正的不要外键。而是说物理外键,物理的一层关系不需要了,是这个意思。但是逻辑上这样的一个关系还是存在的,这样子也是适当的降低了表和表之间的一个耦合度。那么什么是物理和逻辑呢?逻辑就是说比方现在有一个用户表,还有一个用户地址表,照理说用户地址要有一个外键要关联到用户表,那么外键的话就是userid,userid这一个字段是不会删除的,只不过它的物理外键就不会再去设置了。
数据库的分库分表
在大型系统里面一般会有多个数据库,可能是一个分布式的数据库集群,如果说有外键关联的话,会导致难以做分库分表,因为耦合度实在是太高了。假设现在是有两张不同的表,一个是用户表,一个是商品表,用户表和商品表假设是有一个外键关联的话,我们现在要做一个分库,要把两张表放在不同的数据库里面,但是它们却有一个外键关联关系,那么就很难去实现。这仅仅只是一个外键,如果说数据库有上百张表,有几十个外键关联的话,那么这个时候分库分表会难以去实现。
小结
如果说一个互联网的项目在前期没有做到一个很好的控制外键关系的话,一旦业务量上去之后物理的外键一定会让大家,尤其是运维人员会欲仙欲死,这是一定要去注意的。所以呢很多的架构师、DBA还有运维工程师都是会弃用数据库外键的,这个在一开始进行项目开发的时候也是会最先提出来的,这一点大家是需要去明确的。
当你在设计一个小型项目或者是一个传统项目的时候,那么数据库的物理外键关系是可以存在也可以不存在的,这一点无所谓。如果是在设计一个互联网项目或者是一个大型项目的时候,那么我们是绝对不能用数据库物理外键的。
版权声明: 本文为 InfoQ 作者【will】的原创文章。
原文链接:【http://xie.infoq.cn/article/9949e7c28f22753427eec52ba】。文章转载请联系作者。
评论