知识卡片

跨库关联查询两类场景:主题库汇集,与小表广播

结构图卡

内容

分布式架构下,原来在同一个数据库里能一条SQL联表查出来的数据,因为领域建模把实体分散到不同微服务各自的数据库里,变成了物理上无法直接联表的两类跨库查询问题,需要用两种不同的解法分别应对。第一类是基于某一维度或主题的综合查询,比如”查询客户的全部业务数据”——这类数据天然分散在多个不同业务领域的微服务里,无法靠临时联表解决,正确做法是提前建一个面向该主题的独立分布式数据库,通过CDC(数据库日志捕获技术)和领域事件驱动机制,把各业务端微服务的相关数据准实时地汇集进这个主题库,汇集时就把跨表关联处理好(如合并成宽表)或建好数据模型,再在主题库之上建一个专职的查询微服务对外提供服务;主题库的分库主键也可以按查询场景单独设计,以提升大数据量下的查询效率。第二类是两张表之间的关联查询,比如”机构表联业务表”,但机构表和业务表分别在不同微服务里——这类场景适合用小表广播模式:在需要联表的业务库里增加一张冗余的机构代码表,专门只用于关联查询,这张冗余表的数据生命周期仍由主数据微服务统一管理,当源头数据变化时,通过领域事件驱动的消息发布订阅,异步刷新所有订阅了这张冗余表的下游副本。两类方案的共同思路都是”用数据冗余换查询性能”,区别只在于冗余的规模和汇集方式:主题库汇集面对的是多微服务、多维度的大规模数据整合,小表广播针对的是体量小、变更不频繁的维表型数据。

结构图

flowchart TB
  Q["跨库关联查询怎么解决?"]
  Q --> A["场景一:跨多个微服务的<br/>多维度/主题综合查询<br/>(如客户全业务视图)"]
  A --> A1["建独立主题数据库<br/>CDC+领域事件准实时汇集各微服务数据<br/>汇集时预处理关联(合并宽表/建模型)<br/>建专职查询微服务对外服务"]
  Q --> B["场景二:两张分散在<br/>不同微服务的表之间联表查询<br/>(如机构表联业务表)"]
  B --> B1["小表广播<br/>业务库内增加冗余小表(如机构代码表)<br/>主数据微服务管理生命周期<br/>变更时异步消息广播刷新所有订阅方冗余表"]

参考来源

- 位置:第24章《分布式架构的关键设计》"24.4 跨库关联查询如何处理"(源文件:_epub-src/OEBPS/Text/chapter7-2-4.xhtml) - 结论依据:原文说明"对于第一类场景……你可以建立面向不同业务主题的分布式数据库……采用数据库日志捕获技术和领域事件驱动机制,从各业务端微服务将数据准实时汇集到主题数据库……对于第二类场景……你可以采用小表广播的设计模式……通过消息发布和订阅的领域事件驱动模式,异步刷新所有订阅了机构代码表数据的冗余表中的数据",直接支撑本卡片结论。 - 原始内容:对于第一类场景,由于数据分散在不同微服务里,我们无法跨多个微服务来统计这些数据。你可以建立面向不同业务主题的分布式数据库……对于第二类场景,即不在同一个数据库的表之间的关联查询场景,你可以采用小表广播的设计模式……通过异步消息广播和数据冗余的方式,既可以解决表与表的关联查询,还可以提高数据的查询效率。