Domain driven design 持久化事件时的ID重复(事件源)

Domain driven design 持久化事件时的ID重复(事件源),domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,应用领域驱动设计,我读到了关于事件源的内容。这样可以保存一系列事件。数据库的事件表包含以下列: EventID, EventDate, AggregateId, EventData 我可以在此表中保存产品、类别和订单事件。但是,aggregateId可能重复。在这种情况下,我将订单事件作为产品事件 如何防止系统Id重复。您不能将AggregateID设置为类型和Id的复合键吗?那么您可以拥有产品:123456和类别:123456?或者,如果这是一个更好的解决方案,您可以为聚合类型添加另一列。您

应用领域驱动设计,我读到了关于事件源的内容。这样可以保存一系列事件。数据库的事件表包含以下列:

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


如何防止系统Id重复。

您不能将AggregateID设置为类型和Id的复合键吗?那么您可以拥有
产品:123456
类别:123456
?或者,如果这是一个更好的解决方案,您可以为聚合类型添加另一列。

您不能将AggregateID设置为类型和id的复合键吗?那么您可以拥有
产品:123456
类别:123456
?或者,如果这是一个更好的解决方案,您可以为聚合类型添加另一列。

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


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

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


您可以生成GUID,也可以像其他人建议的那样使用某种复合键。

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

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

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

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


如果您不能使用客户端GUID,那么EventID上的newsequentialguid()作为主键是一种方法。

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

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

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

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


如果无法使用客户端GUID,则EventID上的newsequentialguid()作为主键是可行的。

我将添加另一列。我将添加另一列。另请参见:命名UUID。另请参见:命名UUID。