В настоящее время я рассматриваю возможность создания поставщика ролей .NET для Couchbase для использования в проекте. Я хочу смоделировать это в 2 типах документов.
Первый тип документа представляет собой простой список всех ролей, доступных в приложении. Это упрощает поддержку Add, Delete, GetAllRoles и т. д. Этот документ будет иметь фиксированный ключ для каждого приложения, поэтому «applicationname_roles», поэтому он хорошо известен с точки зрения кодов и быстро извлекается.
Второй документ сопоставляет пользователя с ролью, например
{ "type": "roleprovider.user-role", "user": "user1", "role": "role1", "application": "app1" }
Ключ для этого типа документа будет иметь формат "имя_приложения_роли_имя_пользователя_имя_роли", что делает наиболее распространенную операцию проверки, если пользователь находится в определенной роли, тривиальной и быстрой.
Для поддержки методов GetRolesForUser или GetUsersInRole поставщика ролей .NET я рассматриваю использование представления формы.
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 просто нужно добавить префикс «user:» или «role:» в зависимости от того, запрашивает ли он GetRolesForUser или GetUsersInRole, чтобы отфильтровать то, что ему нужно.
Итак, теперь к вопросу: все это кажется достаточно тривиальным и логичным, однако я впервые работал с Couchbase и задавался вопросом, попадаю ли я в какие-то ловушки с этим? Очевидным альтернативным подходом было бы использование 2 представлений, но в моем чтении я видел упоминание о том, что лучше всего уменьшить количество проектных документов и количество представлений в них, см. ответ Перри Круга в обсуждение представлений couchbase для каждой корзины, в этом он упоминает попытку "создать несколько разных запросы от одного индекса». Так что в основном мне интересно, является ли подход, который я описал выше, предписывающим то, что говорит Перри, или я просто обманываю себя и собираюсь причинить себе боль в будущем.
Спасибо за любые указатели.