【发布时间】:2014-12-05 11:37:27
【问题描述】:
这是一个“语言无关”的问题。 我开始研究 CQRS 模式。
我有一个简单的问题。我假设有 2 个不同的存储层:一个用于命令(Mysql 等)的关系层和一个用于“查询”的 NoSql(mongo、cassandra.. 等)?
让我解释一个小例子:
1) 作为用户,我想插入“待办事项” 命令:“创建任务”并将新任务插入到具有用户和待办事项表的数据库中。
2) 作为用户,我可以看到已创建任务的列表 查询:“GetTasks”,它将返回一个“视图”,其中包含从名为“UserTasks”的非 sql 表中获取的任务集合,该表具有用户和已创建任务的列表。
是正确的方法吗?如果语言不好,我很抱歉,这只是一个小例子。 如果这似乎是一个好方法(同样,不要考虑细节)保持更新数据存储的最佳方法是什么?
我正在考虑引发像“TaskCreated”这样的事件并接受新任务并将这些信息插入到 nosql 存储中。
谢谢!
【问题讨论】:
-
CQRS 不需要不同的持久性模型,只需要不同的应用程序模型(域和查询)。根据您的应用程序,您可能会为两种需求使用相同的持久性模型,或者您需要为每种需求使用特定的持久性模型。关键是,这不是必须,您可以选择 1 或 2 个模型是否更适合您的应用
-
好的,谢谢迈克的回答。是的,如上所述,我知道您可以根据具体情况选择不同的解决方案。如果在某些情况下使用两个不同的数据存储(一个用于命令,一个用于查询)不是“cqrs 设计”违规,我只是好奇。如果不是,在这种情况下,使用“命令”更新查询数据存储的最佳方法是什么?
-
CQRS = 1 个域模型和至少一个读取模型。就是这样。其他任何东西都是实现细节。 CQRS 只是一个原则,您决定如何实施。