当我们使用关系数据库来执行多表子查询时,例如
select * from `t_a` a where exist (select pid from` t_b` b where b.pid = a.pid group by pid)
如果表t_a,t_b在同一个数据库中,那么很容易实现子查询,如果我们将这两个表(超过数百万行)分成两个微服务A和B,服务A有数据库db_a,它有表t_a,服务B有数据库db_b,它有表t_b。
我的问题是:CQRS& ES实现数据聚合?
我在这个问题上挣扎了很长时间,搜索了很多文章,但我没有找到任何有用的答案,任何建议都会受到赞赏。
答案 0 :(得分:2)
在CQRS +事件采购中,您不一定需要任何联接。为什么?见下文。
在写入方面,您可以通过重播以前的事件而不加入来从事件存储中重新水化的聚合。
在阅读方面,你有readmodels / projection和sagas。在这里,您对数据进行非规范化。您将模型设计为包含客户端所需的所有数据。例如,在博客中帖子的评论列表中,您还会添加作者的用户名及其ID。这样您就不需要从users表中获取数据,因为数据已经存在(您也不需要通用用户表)。
存在数据新鲜度的问题。通过收听相关事件,您可以保持相关/非规范化数据的新鲜度。对于我们的示例,您的readmodel会侦听UsernameWasChanged
事件并更改其所有帖子的用户名。
CQRS使连接过时。