Сохранение трех уровней разрешений в базе данных

Каков наилучший способ хранения разрешений в базе данных, которая включает более двух уровней? В настоящее время есть только 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.

2

Решение

Если бы мне пришлось реализовать это, я бы использовал одну таблицу с тремя столбцами — uid, type и element.
Uid ссылается на пользователя, тип (здание, этаж, помещение) и элемент кода здания или этажа или помещения.
Я обычно вставляю одну строку для каждого человека для каждого элемента доступа.

Я мог бы также стать более смелым, и если бы я был уверен, что формат элементов следует строгим образцам. Например

Здания будут иметь коды только буквы

Этажи будут иметь коды, такие как letter.number

Номера будут иметь коды, такие как letter.number.letter

В приведенном выше случае вы можете использовать одну таблицу только со столбцами uid и element, потому что из формата данных вы можете извлечь тип элемента (если это здание, этаж или комната). Вы также можете пойти дальше и сохранить доступ с подстановочными знаками:

Доступ ко всем этажам и комнатам здания C: C *

Доступ ко всем комнатам 6 этажа здания B: B6 *

или даже

Доступ ко всем комнатам C на всех этажах и зданиях: ** C

Доступ ко всем вторым этажам: * 2 *

Надеюсь, поможет

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]