为什么禁用外键约束

这个话题比较简单,我就简单描述一下:

不使用外键的原因主要有一下几个:

  1. 每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。
  2. 性能问题,会多额外的数据一致性校验

    1. 例如:

2022-07-05T06:26:47.png
如果我们设计了外键约束,即我们需要将订单表的id与订单明细表的订单id关联,我们需要向订单明细表插入一条数据的时候,还回去校验一次订单表此id存在还是不存在。

  1. 并发问题,外键约束会启用行级锁,主表写入时会进入阻塞

    1. 解释: 当我需要给订单明细表插入一条数据,订单明细表去检查订单表时,会开启 ”共享锁“,将该行的数据锁定,即写锁,写锁是排他锁,此时如果和此id的另外一条数据需要更新,是无法进行的。
  2. 多层级联删除问题,多层级联删除让数据变得不可控,触发器也被严格禁用(触发器: 对某些字段单独设计删除更新策略)
  3. 数据耦合问题严重,数据迁移维护困难
    由于数据已经上升到10亿级别了,假如我们需要将mysql的数据迁移至hbase,我们需要单独将订单明细表迁移到大数据的hbase,这个时候连数据库都不一样了,此时的外键就不具备意义了,而且此时我们之前根据外键设计的一致性校验就失效了
Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate