我目前正在考虑为 couchbase 组合一个 .NET 角色提供程序,以便在项目中使用。我希望在 2 种文档类型中对此进行建模。
第一个文档类型是应用程序中所有可用角色的简单列表。这使得支持 Add、Delete、GetAllRoles 等变得很容易。这个文档对于每个应用程序都有一个固定的密钥,因此“applicationname_roles”因此从代码的角度来看是众所周知的并且可以快速检索。
第二个文档将用户映射到角色,例如
{“类型”:“roleprovider.user-role”,“用户”:“user1”,“角色”:“role1”,“应用程序”:“app1”}
此文档类型的键将采用“applicationname_roles_username_rolename”格式,这使得测试用户是否处于特定角色的最常见操作变得简单而快速。
为了支持 .NET 角色提供程序的 GetRolesForUser 或 GetUsersInRole 方法,我正在查看使用表单的视图。
function (doc, meta) {
if(meta.type != 'json')
{
return;
}
if (doc.type == "roleprovider.user-role")
{
if(doc.application && doc.user && doc.role)
{
emit([doc.application, "user:" + doc.user, doc.role]);
emit([doc.application, "role:" + doc.role, doc.user]);
}
}}
因此,对于每个用户到角色的映射,我们都会将 2 行发送到视图中。第一个允许我们在视图中查询用户所在的角色。第二个允许我们查询用户所在的角色。.NET 提供者只需要根据是否查询 GetRolesForUser 或 GetUsersInRole 来为“user:”或“role:”添加前缀,以筛选出它需要的内容。
所以现在的问题是,这一切似乎都是微不足道和合乎逻辑的,但这是我第一次与 Couchbase 合作,想知道我是否陷入了任何陷阱?一个明显的替代方法是使用 2 个视图,但在我的阅读中,我看到它提到最好减少设计文档的数量以及其中的视图数量,请参阅 Perry Krug 在沙发库视图中的回复根据桶讨论,他在此提到尝试“从一个索引生成多个不同的查询”。所以基本上我想知道我上面描述的方法是否是对佩里所说的话的规定,或者我是否只是在欺骗自己并会让自己痛苦。
感谢您的任何指示。