CQRS设计:nosql数据视图

时间:2014-12-05 11:37:28

标签: domain-driven-design cqrs

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

我有一个简单的问题。我想要有两个不同的存储层:一个关系用于命令(Mysql等...)和一个NoSql(mongo,cassandra等等)用于“查询”?

让我解释一个小例子:

1)作为用户,我想插入“Todo任务”    命令:“创建任务”,并将新任务插入到具有User和Todo表的数据库中。

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

是正确的做法吗?如果语言很差,我很抱歉,这只是一个小例子。 如果这似乎是一个好方法(再次,不考虑细节),保持更新数据存储的最佳方法是什么?

我正在考虑提出像“TaskCreated”这样的事件并接受新任务并将这些信息插入到nosql存储中。

谢谢!

2 个答案:

答案 0 :(得分:0)

我无法理解你正在寻找的东西。但是......通常情况下,命令会导致副作用。查询不会引起副作用。 GetTasks不是一个命令,而是一个查询。

你的" CreateTask"将是一个命令,这将导致任务添加到相关的数据存储。您的GetTasks查询将从数据存储中检索该信息。如果您正在使用SQL或NoSQL存储,那么这并不重要。

" CommandStore"通常是具有足够数据来强制执行不变量的商店。在您的情况下,需要哪些数据?是否需要一些信息来决定是否可以注册任务?例如,假设您要求用户最多可以拥有3" todo" s。在这种情况下," Command Store"中的表格。存储(UserId,Todo Count)就足够了。你也可以使用(UserId,[TodoId]) - 即。存储待办事项ID列表,以便您获得幂等性。有关用户和任务的所有其他信息都是查询数据,并且将位于查询存储中。

希望这是有道理的。

答案 1 :(得分:0)

虽然有时您可能希望存储命令,但通常不会。相反,流行的方法是存储由于命令而发生的域事件。这被称为事件源。这将使“商店”成为现实。事件存储或以另一种方式,事件流。 ' STOREB'通常称为读模型。它具有针对读取速度优化的去标准化结构。它通过响应特定事件的反规范器保持最新。这里要注意的一个关键点是,在引发事件和更新读取模型之间通常存在延迟。在我看来,这是一件好事,但在设计UI时需要考虑。

有关详细信息,请查看CQRS – A Step-by-Step Guide to the Flow of a typical Application

我希望有帮助