CQRS 和事件溯源我可以使用自动递增的 INT 作为聚合 ID 吗?
CQRS & event sourcing can I use an auto incremented INT as the aggregate ID?
我正在处理遗留项目并尝试在某些适当的地方引入 CQRS。为了与所有相关的遗留物集成,我想将我的聚合(或其中的一部分)投影到关系数据库中的 table 中。
我还希望聚合 ID 是该投影 table 的自动增量值。我知道这似乎有悖常理,因为它混合了读取模型和写入模型。但是我不想用外键 GUUID 污染旧架构。
这完全是禁忌吗?如果是,您有什么建议?
编辑:也许我可以只将 GUUID 存储在投影 table 中,这样当事件被投影时我可以识别要更新的行,但仍然有一个自动递增的列用于加入?
使用基础结构层为您的实体创建的 ID 没有任何问题。这种模式在Vaughn Vernon's 'Implementing DDD'本书中常用:
- 从存储库中获取下一个可用 ID。
- 创建实体。
- 将实体保存在存储库中。
你的问题是你想使用在另一个限界上下文中创建的 id。这是一个巨大而彻底的禁忌,而不是 id 是由基础设施层创建的事实。
您应该在限界上下文中创建 id 并使用它来引用来自其他上下文的聚合(就像您在编辑问题时所写的那样)。
我正在处理遗留项目并尝试在某些适当的地方引入 CQRS。为了与所有相关的遗留物集成,我想将我的聚合(或其中的一部分)投影到关系数据库中的 table 中。
我还希望聚合 ID 是该投影 table 的自动增量值。我知道这似乎有悖常理,因为它混合了读取模型和写入模型。但是我不想用外键 GUUID 污染旧架构。
这完全是禁忌吗?如果是,您有什么建议?
编辑:也许我可以只将 GUUID 存储在投影 table 中,这样当事件被投影时我可以识别要更新的行,但仍然有一个自动递增的列用于加入?
使用基础结构层为您的实体创建的 ID 没有任何问题。这种模式在Vaughn Vernon's 'Implementing DDD'本书中常用:
- 从存储库中获取下一个可用 ID。
- 创建实体。
- 将实体保存在存储库中。
你的问题是你想使用在另一个限界上下文中创建的 id。这是一个巨大而彻底的禁忌,而不是 id 是由基础设施层创建的事实。
您应该在限界上下文中创建 id 并使用它来引用来自其他上下文的聚合(就像您在编辑问题时所写的那样)。