2013-06-24 5 views
2

В настоящее время у меня есть древовидная структура, содержащая элементы данных; на каждом из них можно выполнять базовые операции CRUD. Отсюда мне нужно реализовать разрешения для каждого пользователя для каждого из этих четырех действий. Таким образом, данному пользователю может быть предоставлено создание и чтение, но не разрешение на обновление или удаление. Эти разрешения затем каскадируют дерево до любых дочерних элементов разрешенного объекта; поэтому данный пользователь будет иметь Create и Read для любых дочерних объектов корневого объекта.Разрешения CRUD для пользователей в древовидной структуре

Каков наилучший способ хранения этих разрешений с использованием базы данных SQL (MySQL с PHP)? В настоящее время я думаю, что идеальным решением может быть создание другой таблицы базы данных, которая отслеживает идентификатор пользователя, идентификатор объекта, а затем список логических элементов, отслеживающих каждое возможное разрешение, а затем проверку идентификатора пользователя и идентификатора объекта на таблицу разрешений и перемещаясь по дереву до тех пор, пока объект разрешения не будет найден (или не найден, в зависимости от обстоятельств).

Моя основная проблема с этим двоякая. Во-первых, это делает невозможным предоставление разрешения одному объекту, но не его детям. Во-вторых, похоже, что это может вызвать удар по особенно глубоким объектам. Итак, как хорошо это можно сделать?

ответ

1

Рекурсивные структуры данных часто трудно «сопоставить» с SQL-запросами. Некоторые базы данных имеют для него особую поддержку (например, Oracle), но MySQL has no built-in support (= вы можете обойти это, но это неуклюже).

Нам понадобилось нечто подобное в нашем приложении. Наше решение состояло в том, чтобы хранить нормализованные данные (т. Е. «Пользователь X имеет разрешение Y на узле Z» -> три столбца с отношениями FK) в простой таблице.

Объект DAO/manager считывает эту таблицу и создает кеш, где он может быстро искать разрешения по мере необходимости.

Подведение итогов: простое создание базы данных и создание специального вспомогательного кода в приложении для преобразования базы данных в нужную вам структуру.

+0

Не так изящно, как я надеялся, но потом посмотрел, как настроен MySQL. Я не уверен, что будет лучший способ сделать что-то. Благодаря! – moberemk

+1

Согласен. Из моего блога: «Почему существует более одной базы данных? Потому что они все сосут» ;-) –