Events 如何更新与另一个聚合关联的聚合的ReadModel

Events 如何更新与另一个聚合关联的聚合的ReadModel,events,domain-driven-design,cqrs,event-sourcing,Events,Domain Driven Design,Cqrs,Event Sourcing,我正在尝试将读模型和写模型分开。总之,我有两个实体,它们之间有关联: //AgregateRoot class ProfessionalFamily { private ProfessionalFamilyId id; private String name; } //AgregateRoot class Group { private GroupId id; private String literal; private ProfessionalFam

我正在尝试将读模型和写模型分开。总之,我有两个实体,它们之间有关联:

//AgregateRoot
class ProfessionalFamily {
    private ProfessionalFamilyId id;
    private String name;
}

//AgregateRoot
class Group {
    private GroupId id;
    private String literal;
    private ProfessionalFamilyId professionalFamilyId; //ManyToOne association referenced by the ID of "professional-family"
}
我在网格中用于返回数据的读取模型是下一个模型

class GroupReadModel {
    private String id;
    private String groupLiteral;
    private String professionalFamilyName;
}
我想将NoSql用于ReadModel查询,并将它们用于write模型。但我最头疼的是:使用这种方法,当创建一个组时,我会触发一个事件(GroupCreated),事件处理程序监听该事件,并将反读取/查看/投影模型存储在NoSql数据库中。所以我的问题是:如果我需要更新ProfessionalFamilyName,而这与1000多个组(还有更多组)相关,那么我如何更新ReadModel中与我更新的professionalFamily相关的所有组?很可能我做得不好


非常感谢。

NoSql数据库的设计通常不支持数据规范化,甚至有意打破这一概念。如果要使用关系数据库系统,通常会对数据进行规范化,对于每个组,只存储ProfessionalFamily的id,而不是在每个组文档中复制ProfessionalFamily的名称。因此,一般来说,对于NoSql,可以接受数据库复制

<>但是我想在决定使用NoSQL或关系数据库之前,你应该考虑(至少)以下:


读写速度的优先级

如果您需要写操作(在您的情况下是名称更改)非常快,因为它们经常发生,并且读取速度优先级较低,那么NoSql可能不是最佳选择。您仍然可以研究MongoDB之类的技术,它提供了某种混合方法,并允许在一定程度上对数据进行规范化和索引

在关系数据库中具有规范化结构时,写入通常会更快,而在NoSql数据库中,如果没有规范化和重复,读取通常会更快。但这当然取决于您正在比较的现有技术以及我们正在讨论的实体数量(在您的案例组中)以及交叉引用数据的数量。如果由于规范化,您需要在读取过程中执行大量连接,那么与组文档相比,您的读取性能通常会更差,因为组文档中由于重复而已经存在所有必需的数据


对数据结构/模式的控制

如果您知道数据的外观,那么您可能不需要NoSql数据库的优势,因为它非常适合频繁更改或无法控制的数据结构。如果情况并非如此,您可能无法从NoSql技术中获得足够的好处


此外,还需要考虑另一件事:读取的模型数据必须保持多大的一致性?由于您正在采用某种活动来源方法,我想您已经开始采用最终一致性。这意味着不仅事件处理是异步执行的,而且您还可以接受以下事实:回到您的示例,不是所有组都同时使用新的姓氏更新,而是异步更新,或者通过一些后台作业更新,如果一个组仍然显示旧名称而另一个组显示旧名称不是问题的话已经显示新名称一段时间了


很可能我做得不好


只要您出于正确的原因(包括这些考虑因素)决定支持(或反对)NoSql,您选择这种方法本身并没有做任何错误或正确的事情。

NoSql数据库通常不支持数据规范化,甚至有意打破这一概念。如果要使用关系数据库系统,通常会对数据进行规范化,对于每个组,只存储ProfessionalFamily的id,而不是在每个组文档中复制ProfessionalFamily的名称。因此,一般来说,对于NoSql,可以接受数据库复制

<>但是我想在决定使用NoSQL或关系数据库之前,你应该考虑(至少)以下:


读写速度的优先级

如果您需要写操作(在您的情况下是名称更改)非常快,因为它们经常发生,并且读取速度优先级较低,那么NoSql可能不是最佳选择。您仍然可以研究MongoDB之类的技术,它提供了某种混合方法,并允许在一定程度上对数据进行规范化和索引

在关系数据库中具有规范化结构时,写入通常会更快,而在NoSql数据库中,如果没有规范化和重复,读取通常会更快。但这当然取决于您正在比较的现有技术以及我们正在讨论的实体数量(在您的案例组中)以及交叉引用数据的数量。如果由于规范化,您需要在读取过程中执行大量连接,那么与组文档相比,您的读取性能通常会更差,因为组文档中由于重复而已经存在所有必需的数据


对数据结构/模式的控制

如果您知道数据的外观,那么您可能不需要NoSql数据库的优势,因为它非常适合频繁更改或无法控制的数据结构。如果情况并非如此,您可能无法从NoSql技术中获得足够的好处


此外,还需要考虑另一件事:读取的模型数据必须保持多大的一致性?由于您正在采用某种活动来源方法,我想您已经开始采用最终一致性。这意味着不仅事件处理是异步执行的,而且还可以