Domain driven design CQRS设计:nosql数据视图

Domain driven design CQRS设计:nosql数据视图,domain-driven-design,cqrs,Domain Driven Design,Cqrs,这是一个语言不可知的问题。 我开始研究CQRS模式 我有一个简单的问题。我假设有两个不同的存储层:一个用于commandsMysql等的关系存储层。。还有一个NoSql mongo,cassandra。。等等来查询 让我来解释一个小例子: 1作为用户,我想插入Todo任务 命令:创建任务并将新任务插入到包含用户和Todo表的数据库中 2作为一个用户,我能够看到创建的任务列表 Query:GetTasks,它将返回一个视图,其中包含从名为UserTasks的非sql表中获取的任务集合,该表包含一个

这是一个语言不可知的问题。 我开始研究CQRS模式

我有一个简单的问题。我假设有两个不同的存储层:一个用于commandsMysql等的关系存储层。。还有一个NoSql mongo,cassandra。。等等来查询

让我来解释一个小例子:

1作为用户,我想插入Todo任务 命令:创建任务并将新任务插入到包含用户和Todo表的数据库中

2作为一个用户,我能够看到创建的任务列表 Query:GetTasks,它将返回一个视图,其中包含从名为UserTasks的非sql表中获取的任务集合,该表包含一个用户和一个已创建任务列表

这是正确的方法吗?如果语言不好,我很抱歉,这只是一个小例子。 如果它看起来是一个好的方法,不要考虑细节,什么是最好的方法来保持更新数据存储? 我正在考虑引发一个类似TaskCreated的事件,并接受新任务并将这些信息插入nosql存储中


谢谢

我真的不明白你在找什么。但是通常,命令会产生副作用。查询不会产生副作用。GetTasks实际上不是一个命令,而是一个查询

您的CreateTask将是一个命令,它将导致将任务添加到相关数据存储中。您的GetTasks查询将从数据存储中检索该信息。对于这一点,使用SQL或NoSQL存储并不重要

CommandStore通常是具有刚好足够的数据来执行不变量的存储。在您的情况下,需要哪些数据?是否需要一些信息来决定是否可以注册任务?例如,假设您有一个用户最多可以有3个待办事项的要求。在这种情况下,命令存储区中存储UserId、Todo Count的表就足够了。您还可以使用UserId、[TodoId]-ie。存储一个TodoId列表,以便获得幂等性。关于用户和任务的所有其他信息都将是查询数据,并且将在查询存储中


希望这是有意义的。

虽然有时您可能希望存储命令,但通常不会。一种比较流行的方法是存储由于命令而发生的域事件。这称为事件源。这将使“STOREA”成为事件的存储,或者换一种说法,成为事件流STOREB’通常被称为读取模型。它的非标准化结构针对读取速度进行了优化。它通过响应特定事件的去常态化器保持最新。这里需要注意的一个关键点是,在引发的事件和更新的读取模型之间通常存在延迟。我认为这是一件好事,但在设计UI时需要考虑

有关更多信息,请查看


我希望这有帮助

嗨,谢谢你的回答。是的,getTask是一个查询,我立即修改了这个错误,因为我称它为CommandQuery,我的意思是一个查询。我的问题是,是否在sql数据库中存储来自命令的信息,并同时拥有该信息的NoSql视图。nosql视图是查询的存储,信息以查询驱动的方式建模。有意义吗?再说一遍,sql或nosql并不一定重要。重要的是命令端存储应该只包含强制不变量所需的信息。这可能意味着查询存储中的某些信息,也可能是完全不同的格式。这将取决于您的特定业务场景。好的,谢谢!也许我没有很好地解释我的意思。我只是说:假设我们有一个业务场景,其中命令将信息存储在STOREA中。假设查询从STOREB获取信息。STOREA在哪里STOREB因为STOREB中的信息是以另一种方式组织的,所以用STOREA更新STOREB的最佳方法是什么?我认为CQR的好处之一是将写操作和读操作之间的关注点分开。然后,在某些情况下,我可以将数据写入或读取的存储区分开。有许多方法,取决于保证、延迟等。如果您需要A和B之间的绝对一致性,则必须使用某种形式的事务协调器支持3阶段提交(假设A和B之间存在网络)。通常,使用消息队列/总线…更新消息并发布消息。处理程序更新B。另一种方法是发布消息,单独的处理程序更新A和B。另一种方法是发布事件,处理程序轮询该事件以更新viewmodel存储。例如,这可能是在原子之上。很多选项。CQR不需要不同的持久性模型,只需要不同的应用程序模型域和查询。根据应用程序的不同,您可能会对这两种需求使用相同的持久性模型
r您将需要为每种类型提供特定的持久性模型。重点是,这不是必须的,这取决于你选择1个或2个型号更适合你的应用。谢谢你的回答。是的,如上所述,我知道您可以根据具体情况选择不同的解决方案。如果在某些情况下,使用两个不同的数据存储(一个用于命令,一个用于查询)不是违反cqrs设计,我只是好奇。如果没有,在这种情况下,使用命令one?CQRS=1域模型和至少一个读取模型保持查询数据存储更新的最佳方法是什么。就这样。其他的都是实现细节。CQRS只是一个原则,由您决定如何实施。