我有一个由.NET核心CQRS API和MongoDB数据库支持的AngularJS应用程序。虽然我非常了解和理解大多数技术,但是MongoDB和文档数据库作为一个整体对我来说还是陌生的,我仍在学习中。
最简单形式的数据是一个文档,最多可以包含3层层次结构(顶层,组层和最终节点)。首次创建文档并将其插入Mongo数据库时,它根本没有层/节点,而只有名称,作者等高级信息。然后,用户界面中用户可以在其中添加任意数量的新组和最终节点。组。
在关系数据库中,我将简单地将必要的信息发布到将插入新行的命令中,该命令将被称为“ AddNewGroup”。我不必发布所有信息,而只需发布所需的密钥ID和要插入的新信息。
但是,这种方法在Mongo中似乎并不正确。我是否应该发布整个文档并使用单个更新命令来覆盖数据库中的现有文档,对吗?还是有更好的方法?
我还是应该将命令分解为正在执行的特定类型的更新,例如如果整个文档始终在更新,则为UpdateAuthorName,AddNewGroup等。
答案 0 :(得分:1)
您的文档是Write模型,是领域驱动设计世界中的汇总模型。作为没有事件来源的CQRS,您需要将文档状态与生成的事件一起存储。您还需要防止并发写入。话虽这么说,您有两种选择:
如果您对每个文档部分都有单独的保护(例如,每个文档的version
属性都与单个{{1相对),则具有保护,它的优点是速度快,并发修改异常的可能性更低。 }})。
它的缺点是它将过多的Domain模型(类)与基础结构耦合在一起,因为您需要将查询放入Document类中。如果您将域与基础结构混合使用,则您将不再拥有纯模型,并且将无法安全地重试该命令。如果您“教”基础架构存储库根据发出的事件做出不同的反应,则可以在Domain类之外的基础架构中完成此操作。
这也表明您实际上有多个写模型,每个文档部分的模型(页眉,正文,页脚,注释等),因为写模型是由一致性边界决定的。在这种情况下,他们将共享相同的文档ID。
它具有巨大的优势,您可以拥有一个纯Domain类,而无需依赖任何基础结构。基础架构只需要在同一事务中获取整个状态并替换持久状态并追加新事件即可。
它的缺点是比第一种解决方案要慢。 如果您遵循DDD方法,这就是本课程,然后您将文档标识为汇总文件(在DDD中,该汇总文件已完全加载并完全保留以响应执行命令)。