【问题标题】:How do I change the read model in cqrs?如何更改 cqrs 中的读取模型?
【发布时间】:2021-06-17 20:10:54
【问题描述】:

我是 cqrs 用户。

我有活动在

id agg      event         payload                            time 
1  member   MemberCreated  {id:1,user:yumi,age:21 ...}       2021-06-10
2  member   MemberUpdated  {id:1,user:yumi,age:25 ...}       2021-06-10
3  member   MemberDeleted  {}                                2021-06-11

我的问题是

读取模型如何根据上述事件 1-3 发生变化?

第一个场景:

readmodel 中的 1 个事件:

{id:1,user:yumi,age:21 ...}

读取模型中的 1 行

readmodel 中的 2 个事件:

{id:1,user:yumi,age:21 ...}
{id:1,user:yumi,age:25 ...}

readmodel 中的 2 行

readmodel 中的 3 个事件:

{id:1,user:yumi,age:21 ...}
{id:1,user:yumi,age:25 ...}

{} 读取模型中的 3 行

还是更新只读模型??

第二种情况:

{id:1,user:yumi,age:21 ...}
-> 
{id:1,user:yumi,age:25 ...}
->
{}

我对这个问题很困惑。任何帮助将不胜感激。

【问题讨论】:

    标签: events domain-driven-design cqrs event-sourcing


    【解决方案1】:

    请注意,您的事件总是与某个带有 ID 的 DDD 聚合相关,因此您的事件表中应该有一个 aggregateID 列。

    答案取决于您希望在阅读模型中拥有什么。例如,如果你想有一些成员表,每个成员都有一行,那么在伪代码中我会这样做:

    switch(e.event) {
    case MemberCreated: 
      db.Insert(Members, {
        id: event.aggregateID, 
        user: e.payload.user, 
        age: e.payload.age}
      )
      break
    case MemberUpdated:
      db.Update(Members, {
        id: event.aggregateID,
        user: e.payload.user,
        age: e.payload.age}
      )
      break
    case MemberDeleted:
      db.Delete(Members, {id: event.aggregateID})
      break
    }
    

    但是,如果您想要一些包含成员数量的 MemberCount 表,您可以在 MemberCreated 上增加它并在 MemberDeleted 上减少。

    如果您想要一个 AuditLog 表,那么您只需添加一行来说明每个事件发生的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多