【IT老齐012】外键约束
优点
- 保证数据的完整性和一致性
- 级联操作方便
- 数据一致性交给数据库,代码量小
缺点
- 性能问题
- 额外的数据一致性校验查询
- 并发问题
- 外键约束会启用行级锁主表写入时会进入阻塞
- 级联删除问题
- 多层级联删除会让数据变得不可控
- 数据耦合问题
- 数据库层面数据关系产生耦合,数据迁移维护困难
场景
- 性能问题
- 往订单明细表添加一条数据,会强制查询对应订单表中的订单id是否存在。
- 并发问题
- 并发环境下,往订单明细表添加一条数据,会强制查询对应订单表中的订单id是否存在,所以订单表开启共享锁(共享锁【S锁】,又称为读锁,可以查看但无法修改和删除的一种数据锁)。
- 某种情况下对订单id进行更新操作,这时订单表该数据开启排它锁(排他锁【X锁】,又称写锁)。
- 若订单表写锁不被释放,订单明细表处于阻塞的状态。会造成线程积压,系统崩溃。
- 级联删除问题
- 删除一条订单类型数据,导致删除的订单明细无法追溯
- 数据耦合问题
- 订单明细表数据增长,数据量10亿后,需要迁移到Hbase。这时数据不在同一个库,没有了主外键约束,代码上无校验,就会产生属于一致性问题。