Циклические иерархии в членстве, выяснение разрешений пользователя

Я без ума от проблемы ниже.
Есть пользователи и группы, и группы могут содержать как пользователей, так и другие группы:
CREATE TABLE GroupMembership (GroupMembershipID, GroupID, GroupTypeID, MemberID, MemberTypeID)
Поля GroupTypeID и MebmerTypeID необходимо предоставить типы, потому что у меня есть различные типы групп и участников.
Назовите меня Джимом, и у меня есть группа "Друзья Джима", в которую входят пользователи Боб, Джейн, а также группа "Друзья Джерри". В то же время у Джерри есть группа «Друзья Джерри», в которую входят Стив, Хлоя и «группа Джима». Как мы видим, между мной и Джерри есть ссылка на петлю. Все говорят, что петли в иерархиях — это ошибка. Как насчет моего случая? Есть ли способ избежать цикла?

Теперь второй вопрос. У меня есть таблица Разрешение, которая описывает права субъекта на определенные объекты:
CREATE TABLE Permission (PermissionID, SubjectID, SubjectTypeID, ObjectID, ObjectTypeID, PermissionTypeID, [Value])
Каждый субъект (пользователь, группа или что-то еще) имеет явное разрешение на определенный объект. В конечном итоге, чтобы узнать права определенного пользователя на определенный объект, я должен отобразить все дерево членства пользователя (через GroupMembership), затем присоединить его к Permission и определить ближайшее (в иерархии GroupMembership) и лучшее разрешение.< br> Кажется, это обычный способ, не так ли?

Итак, в этой области мне нужно решить следующие задачи:
1) Узнать права пользователя на определенный объект
2) Узнать все объекты, которые разрешены для данного пользователя
3) Узнать всех пользователей, которые имеет явные разрешения для определенного объекта
Кажется, это обычная задача, верно?

Сначала я хотел создать какое-то универсальное представление, которое представляет субъект, объект и фактическое разрешение для этого объекта (помните иерархию в GroupMembership!). Это позволило бы мне легко запрашивать его или присоединять к нему другие запросы. Я пытался сделать правильный SELECT в течение многих дней, но это было хорошо для одной задачи и очень плохо для другой (были полные сканирования и т.д.). Такая же ситуация, если я делаю функции. Теперь я сломался со всем этим :( Я не знаю, как это хороший способ решить эти задачи. Архитектура и задачи выглядят общими, но я не могу найти решения для подобных проблем в Интернете.
Не могли бы вы дать ссылки, советы или указать на мои ошибки?
Очень благодарен,
Джим.


person Jim    schedule 20.07.2011    source источник


Ответы (1)


Вы не можете сделать это в SQL. Группа в группе? Невозможно сгенерировать запрос, который может пройти это. Сделайте это вне SQL.

Вы можете создать: Группы: могут содержать пользователей (но не группы). Супергруппа: может содержать группы, но не супергруппы или пользователей. С этим будет намного легче справиться.

Кроме того, если вы придерживаетесь своей структуры, не размещайте пользователей и группы в одной таблице. Сделайте две таблицы: таблицу для групп в группе и таблицу для пользователей в группе.

Комбинация, как у вас, это кошмар для SQL.

person Ariel    schedule 21.07.2011