【表设计】外键的取舍-分布式中逐渐消失的外键

在分布式大行其道的今天,为什么外键约束越来越少?

外键-数据链接带来强制完整性

在关系型数据库中,外键(Foreign Key)可以用于建立和强制两个表之间的数据链接。

层次数据结构一篇的闭包表简单设计中,就有使用外键进行数据链接。

像这样:

我们很容易发现,外键最直接的体现是强制完整性,即引用表中的外键值必须先存在于被引用表。

删除被引用的行数据时,必须先删除引用表数据(级联删除)。

通过外键,我们很容易理清楚表之间的关系,即理解数据模型,且也有利于ER图的生成和可视化。

外键-强制完整性不适应微服务

分布式与微服务追求服务的自洽 ,要求服务具备独立性,要求架构整体具备容错,服务之间不会互相阻塞。

这些与外键的强制关联特性相冲突。

且在数据库与服务基本是N对N的环境下,数据库外键约束通常无法跨越不同的数据库实例或服务边界 来强制执行。

另外数据库每次执行外键操作还需要额外的检查来验证外键约束。在高并发、高写入吞吐量的场景下,这样的额外开销可能会成为性能瓶颈。

因此,高耦合强制的外键,并不适应现在主流的微服务、分布式。

应用层处理代替外键约束

外键不合适了,但是外键要做的事情却不能不做,常见的做法是在应用层完成外键原本的工作。

  • 数据链接

    在执行删除或更新操作前,应用程序代码需要检查是否存在关联数据。

    通过逻辑删除,保留数据的链接。

  • 数据稽核

    建立一个稽核系统,处理数据的不一致与孤儿数据(在引用表有数据,被引用表没有数据)。

相关推荐
難釋懷5 小时前
分布式锁的原子性问题
分布式
ai_xiaogui6 小时前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
凯子坚持 c6 小时前
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器
分布式
飞升不如收破烂~6 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式
无心水7 小时前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
Lansonli7 小时前
大数据Spark(八十):Action行动算子fold和aggregate使用案例
大数据·分布式·spark
invicinble8 小时前
对于分布式的原子能力
分布式
心态还需努力呀18 小时前
CANN仓库通信库:分布式训练的梯度压缩技术
分布式·cann
Coder_Boy_21 小时前
基于SpringAI的在线考试系统-相关技术栈(分布式场景下事件机制)
java·spring boot·分布式·ddd