Я нахожусь в процессе создания схемы базы данных для следующего сценария:
- Есть пользователи
- У пользователей есть роли (например, «Разработчик» или «Генеральный директор»)
- Роли есть приложения (например, «Topdesk»)
- Приложения имеют разрешения (например, «Обновить базу знаний»)
- Роль может иметь разрешения, если роль уже имеет доступ к приложению
Предполагая отсутствие высокопроизводительной среды (не нужно оптимизировать для скорости), что будет лучшим способом для реализации этой схемы? Среда базы данных может быть MySQL, MSSQL ... это больше о дизайне реляционной базы данных.
Я сам придумал следующее:
Часть, в которой я больше всего не уверен, это, конечно, таблица Applications_Permissions_Roles. Это таблица ссылок поверх другой таблицы ссылок. Я никогда не использовал и не видел это раньше. Другой способ сделать это - заменить его таблицей связи между ролями и разрешениями, а затем использовать код или ограничения для обеспечения требуемых отношений ... но это не кажется мне хорошим решением. Эти вещи должны применяться на уровне базы данных, если это вообще возможно (и кажется возможным), а не на уровне кода.
Во-вторых, необходима ли связь между Permissions.Application и Applications.Id? Я использую его, потому что в Roles_Applications может не быть никаких строк (например, когда вы только что добавили новое приложение), и тогда невозможно определить, какие разрешения принадлежат какому приложению. Это также единственная точка отсчета для поиска, к какому приложению относится разрешение. Я думаю, это правильно, но это также делает круг в дизайне базы данных. Ошибки MSSQL на нем при попытке установить ON_DELETE или ON_UPDATE в каскад.
Любые предложения, или это как это должно быть сделано? Кстати, любые другие предложения, касающиеся соглашения об именах, также приветствуются (возможно, в качестве комментария).
Спасибо
Люк
Изменить: Изменение названия, надеюсь, сделать его более понятным. Предыдущий был более всеобъемлющим, но, вероятно, слишком запутанным.
Roles_Applications
это реально. Учитывая, что все разрешения зависят от приложения, кажется, что они естьApplications_Permissions
(то, что вы пометилиPermissions
), которые затем могут быть назначены определенным ролям с помощью записи вApplications_Permissions_Roles
.Roles_Applications
на самом деле, похоже, описывается самое основное разрешение приложения - простой доступ. Или это утверждение о том, что роль имеет некоторый уровень разрешений для приложения, но вы должны искать в другом месте, чтобы определить, какие из них.Ответы:
То, как вы смоделировали это хорошо. Ваша модель обеспечивает соблюдение бизнес-правил базой данных.
Есть несколько вещей, которые вы могли бы сделать в качестве альтернативы. Можно было бы устранить суррогатный ключ на
Roles_Applications
. В качестве таблицы пересечений вы можете использовать два внешних ключа вместе в качестве составного первичного ключа. Если вы это сделаете, это будет распространятьсяRole
иApplication
до вашегоApplications_Permissions_Roles
стола. Это дает преимущество, заключающееся в том, что вы получаете больше «единого окна» для данных разрешений вашего приложения (т. Е. Меньше объединений) без какого-либо ущерба для нормализации.Другой способ, которым вы могли бы пойти - это немного упростить и определить разрешение по умолчанию для каждого приложения. Вы можете называть это как хотите, например, «доступ по умолчанию», «базовый доступ» или «пользователь», или что угодно для вас. Это позволит вам сгладить вашу модель и, по сути, уронить
Roles_Applications
стол и присоединитьсяApplications_Permissions_Roles
к немуRoles
. Это изменило бы природу запроса, который вы будете использовать, чтобы спросить «какие роли могут обращаться к каким приложениям?» но ваши бизнес-правила все равно будут соблюдаться схемой.источник
Roles_Application
не представляется реальной вещью здесь. Что это, кроме того, что означает, что определенная роль имеет определенный уровень разрешений для приложения, даже если вам нужно проверить,Applications_Permissions_Roles
чтобы определить, что это за уровень? Например, вот генеральный директор, который получает доступ на запись к календарю приложения в вашей текущей модели:Роли
Приложения
права доступа
Roles_Applications
Applications_Permissions_Roles
Я думаю, что эта серия отношений может быть смоделирована без
Roles_Applications
. Если мы удалим это (как предлагает Джоэл Браун, но без изменения предположения, что есть «разрешения по умолчанию»):Роли
Приложения
Applications_Permissions (nee
Permissions
)Applications_Permissions_Roles
Старая
Permissions
таблица не имеет простых разрешений, таких как «чтение» и «запись», которые затем могут применяться к приложениям, таким как «Topdesk» и «Календарь»: она содержит разрешения для конкретных приложений, такие как «запись в Topdesk» и « «Писать в календаре» и «Изменить системные часы в Windows». Чтобы сделать это более понятным, я назвал таблицу,Applications_Permissions
но, конечно, это не необходимый шаг.Этот подход приводит к сглаживанию модели, как и второе предложение Джоэла, но без добавления логики приложения или концепции разрешений по умолчанию.
Roles_Applications
не принес ничего стороне, кроме указания на то, что роль имеет некоторый уровень доступа к приложению. Эта информация передается с большей краткостью благодаря наличию записиApplications_Permissions_Roles
с правильным значением Role_ID.источник