我试图理解CQRS的阅读方面如何与我们正在编写的大型文档管理应用程序(视频/ pdf文件/等)一起使用。
我们希望显示用户具有编辑权限的所有文档的列表(即显示用户可以编辑的所有文档)。特定用户可以编辑10,000个文档。
一般来说,我已经读到单个“表格”(平面结构)应该足以满足大多数屏幕的需要,并且每个角色都可以拥有一个表格。
如何设计我的阅读模型以便我快速获取可以为特定用户编辑的文档?
目前,我可以看到一个持有我的文档的表,另一个持有用户的表和另一个链接用户和文档之间的“编辑”角色的表。所以我正在加入以获取此屏幕的数据。
此外,可能还有删除,查看等角色。
在这种情况下,这是正确的方法吗?
JD
答案 0 :(得分:4)
您可以提供一个具有用户ID以及相应的非规范化文档信息的平面表。
SELECT * FROM documents_editable_by_user WHERE UserId = @UserId
SELECT * FROM documents_deletable_by_user WHERE UserId = @UserId
SELECT * FROM documents_visible_for_user WHERE UserId = @UserId
但您甚至可以在读模型商店中为每个用户动态创建一个表/列表。一旦从基于SQL的读取存储切换到NoSQL(如果还没有),这将变得非常容易。
特别是当用户可以看到或可编辑成千上万的文档时,与连接相比,展平的表可以提供真正的性能提升。
答案 1 :(得分:1)
当我的读取模型采用过滤搜索形式(双关语)时,我使用rhino-security作为授权服务的基础。
我配置了系统,以便授权服务的表通过SQL Server的pub-sub系统和SQL Server代理推送到部分显示非规范化数据的客户端 - 然后让Rhino.Security加入授权模型一起进入阅读模型,基于每个用户。
因为我基本上从未从读取模型写入读取模型的授权表,所以我们对授权服务的数据库和逻辑进行了很好的封装,因为只有通过 服务才能更改授权,并且该服务具有全球唯一性和特定性(一致性)。这意味着我们用于处理高级(层次结构实体,用户组,用户,权限,每个实体权限)授权要求的自定义GUI仍然可以针对此授权模型执行CRUD,并且可以软实时推送到任何读取模型。