CQRS:如何实现投票机制(多对多关系)
CQRS: How to implement a voting mechanism (many to many relationship)
我对 CQRS 和 DDD 比较陌生,想知道在域模型中实现投票机制的最佳方式是什么。
在产品上,用户可以 upvote/downvote。有一些关于投票的域规则,f.e。您只能投票一次,要么反对,要么反对。
投票和产品都是聚合根。这是最好的方法吗?建议保持较小的聚合。将投票添加到产品聚合根会超时使其变得臃肿。
我正在努力解决的问题是当投票是聚合根时删除投票。您需要知道需要删除哪些投票聚合。在命令处理程序中无法使用 productId 和 userId 从存储库中检索投票。 aggregateId 作为单个 Guid 存储在数据库中。
该命令将包含这些字段
- 用户名
- 产品编号
我找到的一些可能的解决方案:
- 使用基于 userId 和 productId 的确定性 GUID
- 投票是对产品的汇总列表
- 创建一个 voteId 并使用它来删除投票。
- 将聚合存储为字符串并使用 productId 和 userId 的组合
最好的方法是什么?
根据我对您领域的有限了解,我可以得出结论,有两个限界上下文 Catalog
和 Reviews
。在这种情况下,您可以在 Catalog BC
中有一个 Product
聚合,在 Reviews BC
中有一个 Product
聚合。
来自 Reviews BC
的 Product
聚合将包含特定产品的所有 Vote
实体的列表。 Vote
实体将包含执行 vote only once
业务不变性所需的所有信息(如 IP 地址、用户 ID 等)。两种产品聚合类型(来自两个 BC)将共享相同的 ID - 如果需要,这就是使它们保持同步的方式(例如,当产品从目录中删除时,它在评论 BC 中被标记为不可投票)。
我对 CQRS 和 DDD 比较陌生,想知道在域模型中实现投票机制的最佳方式是什么。
在产品上,用户可以 upvote/downvote。有一些关于投票的域规则,f.e。您只能投票一次,要么反对,要么反对。
投票和产品都是聚合根。这是最好的方法吗?建议保持较小的聚合。将投票添加到产品聚合根会超时使其变得臃肿。
我正在努力解决的问题是当投票是聚合根时删除投票。您需要知道需要删除哪些投票聚合。在命令处理程序中无法使用 productId 和 userId 从存储库中检索投票。 aggregateId 作为单个 Guid 存储在数据库中。
该命令将包含这些字段
- 用户名
- 产品编号
我找到的一些可能的解决方案:
- 使用基于 userId 和 productId 的确定性 GUID
- 投票是对产品的汇总列表
- 创建一个 voteId 并使用它来删除投票。
- 将聚合存储为字符串并使用 productId 和 userId 的组合
最好的方法是什么?
根据我对您领域的有限了解,我可以得出结论,有两个限界上下文 Catalog
和 Reviews
。在这种情况下,您可以在 Catalog BC
中有一个 Product
聚合,在 Reviews BC
中有一个 Product
聚合。
来自 Reviews BC
的 Product
聚合将包含特定产品的所有 Vote
实体的列表。 Vote
实体将包含执行 vote only once
业务不变性所需的所有信息(如 IP 地址、用户 ID 等)。两种产品聚合类型(来自两个 BC)将共享相同的 ID - 如果需要,这就是使它们保持同步的方式(例如,当产品从目录中删除时,它在评论 BC 中被标记为不可投票)。