Каков наилучший способ хранения разрешений в базе данных, которая включает более двух уровней? В настоящее время есть только 2 уровня разрешений, и они хранятся в таблице сущностей моста, например:
UID | Buildings | Floor
------------------------
1 | A, B, C | F9
Есть также другая таблица с именем Exceptions, которая имеет такую же структуру, которая указывает, что пользователи НЕ должны иметь разрешения для них:
UID | Buildings | Floor
------------------------
1 | null | C4
Таким образом, в моем примере выше, у пользователя 1 будут права на 9-й этаж в здании F, все комнаты в зданиях A, B и C, но не на 4-й этаж в C.
Новое требование заключается в том, чтобы добавить еще более детальный уровень разрешений для комнат на этажах. Таким образом, код будет выглядеть примерно так: A1A, A1B и т. Д. Здания и комнаты всегда алфавитны, а номер этажа всегда числовой. Я не могу изменить формат этих кодов, так как они поступают из внешнего источника.
Каков наилучший способ справиться с такой ситуацией? Я знаю, что Linux обрабатывает права доступа к файлам для группы и пользователя с помощью битовой строки, но в моем случае это тысячи комнат, что не представляется возможным, а также пользователь / группа — это всего два уровня.
Я рассмотрел просто добавление нового столбца под названием Rooms
и продолжить со строкой через запятую, но есть ли лучший способ? Если это имеет значение, я использую MySQL.
Если бы мне пришлось реализовать это, я бы использовал одну таблицу с тремя столбцами — uid, type и element.
Uid ссылается на пользователя, тип (здание, этаж, помещение) и элемент кода здания или этажа или помещения.
Я обычно вставляю одну строку для каждого человека для каждого элемента доступа.
Я мог бы также стать более смелым, и если бы я был уверен, что формат элементов следует строгим образцам. Например
Здания будут иметь коды только буквы
Этажи будут иметь коды, такие как letter.number
Номера будут иметь коды, такие как letter.number.letter
В приведенном выше случае вы можете использовать одну таблицу только со столбцами uid и element, потому что из формата данных вы можете извлечь тип элемента (если это здание, этаж или комната). Вы также можете пойти дальше и сохранить доступ с подстановочными знаками:
Доступ ко всем этажам и комнатам здания C: C *
Доступ ко всем комнатам 6 этажа здания B: B6 *
или даже
Доступ ко всем комнатам C на всех этажах и зданиях: ** C
Доступ ко всем вторым этажам: * 2 *
Надеюсь, поможет
Других решений пока нет …