没有DDD和没有(或带有?)ES的CQRS-什么是写模型,什么是读模型?
据我了解,CQRS背后的主要思想是拥有2个不同的数据模型来处理命令和查询。这些被称为“写入模型”和“读取模型”。 让我们考虑一个Twitter应用程序克隆的示例。以下是命令: 用户可以自己注册。CreateUserCommand(string username)发出UserCreatedEvent 用户可以关注其他用户。FollowUserCommand(int userAId, int userBId)发出UserFollowedEvent 用户可以创建帖子。CreatePostCommand(int userId, string text)发出PostCreatedEvent 虽然我在上面使用了“事件”一词,但我并不是说“事件源”事件。我的意思是触发读取模型更新的信号。我没有活动存储,到目前为止,我想专注于CQRS本身。 这是查询: 用户需要查看其帖子列表。 GetPostsQuery(int userId) 用户需要查看其关注者列表。 GetFollowersQuery(int userId) 用户需要查看其后的用户列表。 GetFollowedUsersQuery(int userId) 用户需要查看“朋友供稿”-他们所有朋友活动的日志(“您的朋友约翰刚刚创建了一个新帖子”)。 GetFriedFeedRecordsQuery(int userId) 要处理,CreateUserCommand我需要知道这样的用户是否已经存在。因此,在这一点上,我知道我的写模型应该具有所有用户的列表。 要处理,FollowUserCommand我需要知道userA是否已经跟随userB。在这一点上,我希望我的写模型具有所有用户关注用户连接的列表。 最后,要处理CreatePostCommand我不需要其他任何东西,因为我没有诸如之类的命令UpdatePostCommand。如果有这些内容,则需要确保该帖子存在,因此我需要所有帖子的列表。但是因为我没有此要求,所以不需要跟踪所有帖子。 问题1:以我使用的方式使用术语“写模型”实际上正确吗?还是ES的“写模型”总是代表“事件存储”?如果是这样,我需要处理命令的数据和我需要处理查询的数据之间是否存在任何分隔? 要处理GetPostsQuery,我需要所有帖子的列表。这意味着我的阅读模型应具有所有帖子的列表。我将通过收听来维护此模型PostCreatedEvent。 要同时处理GetFollowersQuery和GetFollowedUsersQuery,我需要一个用户之间所有连接的列表。为了维持这种模式,我要听UserFollowedEvent。这是第2个问题:如果我在这里使用写模型的连接列表,实际上可以吗?还是我应该更好地创建一个单独的读取模型,因为将来可能需要比写入模型更多的细节? 最后,要处理,GetFriendFeedRecordsQuery我需要: 听 UserFollowedEvent 听 PostCreatedEvent 了解哪些用户关注其他用户 如果用户A跟随用户B并且用户B开始跟随用户C,则应显示以下记录: 对于用户A:“您的朋友用户B刚刚开始关注用户C” 对于用户B:“您刚刚开始关注用户C” 对于用户C:“用户B现在正在关注您” 这里的问题3:我应该用什么模式来获取连接列表?我应该使用写模型吗?我应该使用读取模型- GetFollowersQuery/ GetFollowedUsersQuery吗?还是应该让GetFriendFeedRecordsQuery模型本身处理UserFollowedEvent并维护自己的所有连接列表?