Domain driven design 使用大数据集权限读取时的CQR

Domain driven design 使用大数据集权限读取时的CQR,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我试图了解CQR的读取端如何与我们正在编写的大型文档管理应用程序(视频/pdf文件/等)一起工作 我们希望显示用户具有编辑权限的所有文档的列表(即显示用户可以编辑的所有文档)。特定用户可以编辑的文档可能有100000个 总的来说,我已经了解到,一个单一的“表”(平面结构)应该足以满足大多数屏幕的需要,并且有了权限,每个角色都可以有一个表 我将如何设计我的阅读模型,以允许我快速获取可以为特定用户编辑的文档 目前,我可以看到一个表包含我的文档,另一个表包含用户,另一个表链接用户和文档之间的“编辑”角

我试图了解CQR的读取端如何与我们正在编写的大型文档管理应用程序(视频/pdf文件/等)一起工作

我们希望显示用户具有编辑权限的所有文档的列表(即显示用户可以编辑的所有文档)。特定用户可以编辑的文档可能有100000个

总的来说,我已经了解到,一个单一的“表”(平面结构)应该足以满足大多数屏幕的需要,并且有了权限,每个角色都可以有一个表

我将如何设计我的阅读模型,以允许我快速获取可以为特定用户编辑的文档

目前,我可以看到一个表包含我的文档,另一个表包含用户,另一个表链接用户和文档之间的“编辑”角色。因此,我正在进行连接以获取此屏幕的数据

此外,还可能有用于删除、查看等的角色

在这种情况下,这是正确的方法吗


JD

您可以提供一个平面表,其中包含用户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(如果您还没有这样做的话),这就变得非常容易了


特别是当有成千上万的文档可供用户查看或编辑时,扁平化的表可以比连接添加一个真正的性能提升。

< P>当我有一个以过滤搜索表单的形式(PUN不打算)的读取模型时,我使用RiNo安全作为授权服务的基础。

我对系统进行了配置,以便授权服务的表通过SQL Server的发布子系统和SQL Server代理推送到部分显示非规范化数据的客户端,然后让授权模型以每个用户为单位加入到读取模型中


因为我基本上从未从读取模型写入读取模型的授权表,所以我们对授权服务的数据库和逻辑进行了很好的封装,因为授权仅通过该服务进行更改,并且它是该服务的全局唯一性和特定性(一致性)。这意味着,我们用于处理高级(层次实体、用户组、用户、权限、每个实体权限)授权需求的自定义GUI仍然可以针对此授权模型执行CRUD,并将软实时推送到任何读取模型。

感谢Dennis的回复。如果我使用基于SQL的非规范化数据,比如说我们有100000个文档,对于单个用户,我们可能有300000条记录,该用户可以编辑/删除/查看。如果现在我们有10个用户,我们就有300万……除非我没有抓住重点,否则这在性能和维护(更新)方面肯定会是一场噩梦。这就是为什么我考虑使用单独的表来连接数据。当然,我对您的数据和您选择的RDBMS了解不够,因此无法判断。但是考虑一下:用300个条目查询一个非正规化表,而不是在100个条目上执行双连接,甚至更快。就性能而言,查询一个大表通常比连接多个小表更快,尤其是当您有适当的索引时。当涉及到更新时,在CQRS中,这可能是由异步事件处理程序处理的。谢谢Dennis的帮助。我已经把你说的话都带到船上了。