CQRS:如何实施投票机制(多对多关系)

时间:2017-07-24 08:52:17

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

我对CQRS和DDD比较陌生,我想知道在域模型中实现投票机制的最佳方法是什么。

在产品上,用户可以upvote / downvote。关于投票有一些域规则,例如。你只能投票一次,无论是向下还是向上投票。

投票和产品都是聚合根。这是最好的方法吗?建议保持聚合较小。将投票添加到产品聚合根将超时使其变得臃肿。

我正在努力解决的问题是当投票是聚合根时删除投票。您需要知道需要删除哪个投票聚合。在命令处理程序中,无法使用productId和userId从存储库中检索投票。 aggregateId作为单个Guid存储在数据库中。

该命令将包含这些字段

  • 用户ID
  • 产品编号

我找到了一些可能的解决方案:

  • 使用基于userId和productId
  • 的确定性GUID
  • 投票是产品上的聚合列表
  • 创建一个voteId并使用它来删除投票。
  • 将聚合存储为字符串,并使用productId和userId
  • 的组合

最好的方法是什么?

1 个答案:

答案 0 :(得分:5)

根据我对您的域名的有限理解,我可以得出结论,有两个有界的上下文CatalogReviews。在这种情况下,您可以Product中的Catalog BC聚合和Product中的Reviews BC聚合。

Product中的Reviews BC聚合将包含特定产品的所有Vote实体的列表。 Vote实体将包含强制执行vote only once业务不变量所需的所有信息(如IP地址,用户ID等)。两种产品聚合类型(来自两个BC)将共享相同的ID - 如果需要,可以保持它们的同步(例如,当从产品目录中删除产品时,它在评论BC中被标记为不可投票)。