跳转至

随笔

不要使用外键

外键是一种限制

举个电商的例子:用户表User,商品表Product,订单表Order。订单表中的user和用户表User构成一个外键,product和商品表中的Product构成一个外键。 由于外键具有一致特性,每插入一个订单,数据库就会查询用户表和商品表是否存在相关数据。由此引发:

  • 触发查询操作,造成额外的性能消耗
  • 查询的时候,触发内部锁,该锁可能会造成高并发死锁
  • 用了外键意味着把所有的数据一致交由数据库处理
  • 未来分库分表时将有无尽的麻烦

建议的处理方式

沿用上述例子中的场景,建表时不再使用外键,而是采用业务逻辑中关联,来模拟外键。数据库层面不要产生强制耦合,业务处理采用一致性方案即可。高并发的场景下,可以先更新部分表,再又消息驱动等方式来进行其他数据的补偿