我在创造一个销售平台。核心聚合称为公告,它保存对其他聚合(如类别、用户等)的引用。我正在使用CQRS方法作为一个事件源解决方案作为存储。
出于性能原因,我决定在公告聚合中存储一些有关相关对象(类别、用户)及其I的重要细节。我的理由是,在过滤公告时,我希望尽可能简化对这些信息的访问(减少数据库连接的数量,允许花哨的查询语法)。这是可能的,因为我在命令中包含了所有所需的信息,这将创建一个公告。生成公告的详细视图是基于聚合中嵌入的信息。虽然一开始看上去是合理的,但现在我有了新的想法。
我认为的考虑因素是:
我使用的事件存储库
以下步骤是否是所描述问题的有效解决方案?
从公告aggregate;
的完整视图。
发布于 2021-11-19 15:31:26
通常,在特定聚合中包含数据的唯一原因是该数据是否影响命令验证,或者是否存在其他一致性需求。如果关于类别或用户的信息在任何一个原因下都没有限定,那么将其从公告聚合中删除是非常有意义的。
我可能会考虑建模一个“分类和相关的公告”聚合,它是由公告/类别/用户聚合提供的域事件提供的。这可以通过事件存储中的多流投影来实现,但我认为将这些细节分开是有用的,因为还有其他方法可以将来自多个聚合的域事件作为不同聚合的命令(任何事件中隐含的命令是“将此事件合并到您的世界视图中”)。
发布于 2021-11-20 07:32:05
决不要通过考虑如何读取数据来设计聚合。这违背了CQRS的目的。聚合是关于命令和业务规则,而不是查询。使用事件从多个聚合收集数据,然后在不影响聚合的情况下任意投影数据。这个概念被称为“投影”。
https://stackoverflow.com/questions/70036104
复制相似问题