我正在使用事件源构建StackOverflow克隆。 MVP很简单:
我已将问题建模为聚合根。一个问题可以有零个或多个答案,答案可以有零个或多个upvotes和downvotes。
但这会导致严重的性能问题。要提出答案,必须加载问题(作为聚合根),这需要加载其所有答案。在非事件源DDD中,我会使用延迟加载来解决此问题。但是,事件采购中的延迟加载非常重要(http://docs.geteventstore.com/introduction/event-sourcing-basics/)
将问题建模为聚合根是否正确?
答案 0 :(得分:5)
首先不要使用延迟加载(使用ORM时)。由于这一点,你可能会发现自己情况更糟,而不是等待一段时间。如果你需要使用它,大多数时候都意味着,你的模型只是错误。
您可能想要考虑以下内容:
您可能希望使用单独的聚合,不是因为性能问题,而是因为并发问题(问题2)。
根据表现和你的upvote行为的方式,你可以考虑将其建模为价值对象。 (问题3)
继续read it
http://dddcommunity.org/library/vernon_2011/
使用cqrs读/写分离可以实现真正的性能提升 http://udidahan.com/2009/12/09/clarified-cqrs/
答案 1 :(得分:0)
使用简单的读取模型它应该不是问题。问题的最大答案数是多少?也许有几百个与非规范化数据模型没什么关系。
upvote事件将由具有少数属性的非常简单的命令触发。
事件处理程序很可能必须加载整个问题。但是通过聚合根ID加载这些记录非常快,并重放事件。如果每个问题的事件数量非常高(由于答案编辑等),您可以实现快照而不是重放每个事件。并且该过程是异步完成的,这将使读取模型最终保持一致"与活动商店。