数据库设计——由阿里的Java编程规范引发的外键思考

1 阿里的Java编程规范

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

说明:以学生和成绩的关系为例,学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

2 引发思考

到底应不应该使用外键

3 结论

外键是否采用,看业务应用场景,以及开发成本的。

  • 互联网行业应用
    不推荐使用外键, 用户量大,并发高,数据库容易成为性能瓶颈,尤其受IO限制, 此时不用外键,把数据一致性的控制放到程序事务中,易于水平扩展。

  • 传统行业
    软件应用的用户数有限,数据量也一般不会超大,且活跃数据有限。综述,即数据库服务器的性能不是问题,不用过多考虑性能问题

4 分析外键约束的优点与缺点

4.1 优点

  • 保证表间保证数据的完整性和一致性,是事务的一致性实现
  • 级联操作方便
  • 将数据完整性判断托付 给了数据库完成,减少了程序的代码量
  • DBA与开发分工明确,且减少代码量

4.2 缺点

  • 性能瓶颈
    外键被数据库维护,当涉及外键字段的增,删,更新操作之后,需要触发先关查询去检查,性能开销

  • 并发死锁
    update/delete时,外键对数据一致性的控制,其他表内部加锁。进行行锁操作,在并发大流量事务场景,很容易造成死锁

  • 扩展性差
    随着数据量的增加 ,分库分表时,外键无法生效,所以将数据关系维护在程序中,方便迁移

5 总结思维导图

数据库设计——由阿里的Java编程规范引发的外键思考