【IT老齐012】外键约束

发布时间 2023-04-25 16:31:30作者: Faetbwac

【IT老齐012】外键约束

优点

  • 保证数据的完整性和一致性
  • 级联操作方便
  • 数据一致性交给数据库,代码量小

缺点

  • 性能问题
    • 额外的数据一致性校验查询
  • 并发问题
    • 外键约束会启用行级锁主表写入时会进入阻塞
  • 级联删除问题
    • 多层级联删除会让数据变得不可控
  • 数据耦合问题
    • 数据库层面数据关系产生耦合,数据迁移维护困难

场景

1682410790494

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