如何在cqrs中进行分页

How to do pagination in cqrs

我刚开始学习 CQRS 模型。因此,当对域执行操作时,我将该操作作为事件存储在数据库中,而不更新实际域。所以,我知道在阅读方面我必须通过将给定域的所有事件和 return 应用到客户端来准备阅读模型。只要我使用它的 ID 访问单个实体,这就很好。但是如果是分页数据,我该如何处理呢?

例如:假设我有一个名为 "Content" 的域,并且将对该域执行

的操作

事件 1: 状态变化

事件 2: 网站访问用户将内容标记为有用

事件 3: 将内容分配给用户进行审核。

现在我的查询页面大小为 20

查询 1: 获取我 "Content" 的状态 "APPROVED"

查询 2: 由用户(分配给谁进行审核)"Content" 获取我

查询 3: 按有用计数 "Content" 获取我

并且在 UI 上列出的内容应该包含所有信息,例如 - 它被分配给谁以及它的有用计数与上述查询无关

如果像一个一个地读取所有内容,丢弃不符合条件的内容实体,最终会读取过多数据,对吗?

在查询 3 的情况下:通过有用计数找到我 "Content" - 我应该阅读数据库中存在的所有内容实体,以确定哪个具有最有用的评级。

请指导我学习CQRS的读取端。

在我看来,您在写入端选择了与读取端相同的域对象。您不必在这些模型之间进行一对一的映射。您可以从同一个域对象创建不同的读取模型,具体取决于您希望如何使用它们。

据我了解,您已经创建了一个阅读模型,您可以在其中使用 ID 获取每个内容。如果您想同时显示一个内容,那很好。

要解决搜索问题,您可以创建一个针对搜索优化的新读取模型。例如,您可以将要筛选的值存储在 SQL table 中。这两个读取模型可以完全相互分离。由于第一个模型是通过键访问的,因此可以使用键值存储。

So, I understand that on read side I have to prepare read model by applying all events of given domain and return to client.

您不必应用所有事件。您可以只应用您感兴趣的事件。您也可以应用来自其他域对象的事件。