【问题标题】:ID duplication when persisting events (event sourcing)持久化事件时的 ID 重复(事件溯源)
【发布时间】:2016-04-28 20:50:10
【问题描述】:

应用领域驱动设计 我读过关于事件溯源的文章。这样可以保存一系列事件。数据库的事件表有以下几列:

EventID, EventDate, AggregateId, EventData

我可以在此表中保存产品、类别订单事件。但是aggregateId 可能会重复。在这种情况下,我会将订单事件作为产品事件。

如何防止系统 ID 重复。

【问题讨论】:

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


    【解决方案1】:

    你不能让 AggregateID 成为 type 和 id 的复合键吗?所以你可以拥有Product:123456Category:123456?或者,如果这对您来说是一个更好的解决方案,您可以为聚合类型添加另一列。

    【讨论】:

    • 我会再添加一列。
    【解决方案2】:

    根据定义,聚合根具有全局唯一标识符。如果你正在做 DDD(我假设你是因为你用 DDD 标记了问题),并且你正在使用事件源来捕获聚合根的事件流,那么你需要找到一种方法来确保不同聚合类型的唯一性。

    您可以生成 GUID 或使用其他人建议的某种复合键。

    【讨论】:

    • 参见:命名 UUID。
    【解决方案3】:

    除了使用客户端生成的 GUID 之外,我还建议在表中添加几列。

    EventID, EventType, EventDate, AggregateType, AggregateId, MetaData, EventData
    

    出于几个原因,我会添加事件类型和聚合类型。 它们将支持底层类型的再水化,允许表上的附加索引,并表示系统中相当重要的信息。最后,它可能会简化对表的读取查询,避免了几个连接。

    元数据将允许跟踪用户和/或源事件信息。

    尽管这增加了信息以使我可以避免使用复合键,但还是坚持使用 GUID 键。

    如果您不能使用客户端 GUID,则可以将 EventID 上的 newsequentialguid() 作为主键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 2021-06-24
      • 1970-01-01
      • 2018-09-23
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多