在一个新项目中,我决定使用mongodb作为主数据库,但是我对它的经验不足导致我对如何构建不同集合之间的关系产生了一些困惑。
在我的情况下,我有一个用户集合,一个'notes'集合和一个groups集合。 Notes可以向不同的用户和组开放。如果用户是组的一部分,并且该组具有对该注释的读访问权,那么该用户也是如此。如果用户已从组中删除,则他们将无法再访问该注释。但是,用户可以基于用户访问该笔记,即使他们从具有访问权限的组中删除,他们仍然可以看到该笔记。希望这是有道理的。
我面临的问题是设置权限,以便所有这些都可以。权限是否应存储在notes集合中?如果其存储如下:
note: {id: xxxx, followers:[{id:user1, permission:write},{id:groupA, permission:read}]}
然后,如果user2是groupA的一部分,我需要检查他们是否通过他们的id与节点相关联,如果没有,我将必须检查每个可以看到该注释的组和看看他们的成员,如果不同的组拥有不同的权限,我必须获得最高权限。这看起来效率不高。
用户集合如下所示:
user: {id:user1, projects:[xxxxx, xxxxx], groups:[xxxxx,xxxx...]}
小组集合:
group: {id:groupA, projects:[xxxxx, xxxx...], users:[user2...]}
我计划将组文档与项目和用户文档相关联,以便在从项目中删除组时,项目将从组中删除。看起来dbref是最好的方法。
我查看了最佳实践,我觉得我的整体结构很混乱,但我想不出另一种方法。
答案 0 :(得分:1)
根据您的要求,如果组的用户数超过用户组,则应考虑在用户中存储group_id。
您可以将用户和组合并到一个集合中,该集合具有两个不同的模式,类似于is_group属性,但可以想象有一天可能会有集合级别锁定,下面的内容将为您提供更大的灵活性。
要确定用户是否具有访问权限,您只需查询项目集合,并在检索项目文档后查看他们所属的组ID是否在写入或读取数组中。
项目:
{
"_id": ObjectId,
"write": [group_id, group_id, ...],
"read": [group_id, group_id, ...]
}
用户:
{
"_id": ObjectId,
"groups": []
}
组:
{
"_id": ObjectId,
}