数据库为什么数据库不应该使用外键( 三 )
- 当客户端更新 authors 表中记录的主键时 , 数据库会同时更新 posts 表中所有引用该记录的外键;
- 当客户端删除 authors 表中的记录时 , 数据库会删除所有与 authors 表关联的记录;
本文插图
图 4 - 复杂的级联操作
虽然级联删除的出发点也是保证数据的完整性 , 但是在设计关系表之间的不同关系时 , 我们也需要注意级联删除引起的数据大规模删除的问题 。 如上图所示 , 当客户端想要在数据库中删除 authos 表中的数据时 , 如果我们同时在 authors 和 posts中指定了级联删除的行为 , 那么数据库会同时删除所有关联的 posts 记录以及与 posts 表关联的 comments 数据 。
这种涉及多级的级联删除行为在数据量较小的数据库中不会导致问题 , 但是在数据量较大的数据库中删除关键数据可能会引起雪崩 , 一条记录的删除可能会被放大到几十倍甚至上百倍 , 这些对磁盘的随机读写会带来巨大的开销 , 是我们想要尽可能避免的情况 。 如果我们能够较好地设计各个表之间的关系并且慎用 CASCADE 行为 , 这对于保证数据库中数据的合法性有着很重要的意义 , 使用该特性可以避免数据库中出现过期的、不合法的数据 , 但是在使用时也要合理预估可能造成的最坏情况 。
手动实现数据库的级联删除操作是可行的 , 如果我们在一个事务中按照顺序删除所有的数据 , 确实可以保证数据的一致性 , 但是这与外键的级联删除功能没有太大的区别 , 反而会有更差的表现 。 如果我们能够接受在一个时间窗口内的数据不一致 , 就可以将一个大号的删除任务拆成多个子任务分批执行 , 降低对数据库影响的峰值 。
DELETE FROM posts WHERE author_id = 1 LIMIT 100;DELETE FROM posts WHERE author_id = 1 LIMIT 100;...DELETE FROM authors WHERE id = 1; 与数据库外键的 CASCADE 相比 , 这种方式会带来更大的额外开销 , 只是我们能降低对数据库性能的瞬时影响 。总结 外键提供的几种在更新和删除时的不同行为都可以帮助我们保证数据库中数据的一致性和引用合法性 , 但是外键的使用也需要数据库承担额外的开销 , 在大多数服务都可以水平扩容的今天 , 高并发场景中使用外键确实会影响服务的吞吐量上限 。 在数据库之外手动实现外键的功能是可能的 , 但是却会带来很多维护上的成本或者需要我们在数据一致性上做出一些妥协 。 我们可以从可用性、一致性几个方面分析使用外键、模拟外键以及不使用外键的差异:
- 不使用外键牺牲了数据库中数据的一致性 , 但是却能够减少数据库的负载;
- 模拟外键将一部分工作移到了数据库之外 , 我们可能需要放弃一部分一致性以获得更高的可用性 , 但是为了这部分可用性 , 我们会付出更多的研发与维护成本 , 也增加了与数据库之间的网络通信次数;
- 使用外键保证了数据库中数据的一致性 , 也将全部的计算任务全部交给了数据库;
当我们考虑应不应该在数据库中使用外键时 , 需要关注的核心我们的数据库承担这部分计算任务后会不会影响系统的可用性 , 在使用时也不应该一刀切的决定用或者不用外键 , 应该根据具体的场景做决策 , 我们在这里介绍了两个使用外键时可能遇到的问题:
推荐阅读
- 热量|为什么有的人喝凉水都长肉,有的人却光吃不胖?营养科医生:原因其实很简单
- 『中越战争』1979年的中越战争,为什么世界各国都认为越南会赢?主要的原因其实有3点
- 蜜蜂蜇熊刺针拔不出而被肢解致死
- 三星手机|为什么三星手机,在我国越来越没市场了?原来这是必然结果
- 胖子撩综艺|为什么特斯拉这么受欢迎?自主品牌造不出水平相当的电动汽车吗?
- 不执著财经|为什么越来越多的外企都搬迁到东南亚?
- 罗民教授|看到好多脑梗的病人,而且是正值壮年的男人居多,这是为什么呢?
- 美国得克萨斯州|6岁男孩在校戴耳环被禁,妈妈怒指校方性别歧视:为什么女生就行?
- 娱乐仰望新视角|发动机质量差?,为什么大众车迷说到大众就是说双离合顿挫
- 科技速递|为什么太空中看起来没有引力?
