Лучшая структура реляционной базы данных для этих данных


8

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

  • Есть пользователи
  • У пользователей есть роли (например, «Разработчик» или «Генеральный директор»)
  • Роли есть приложения (например, «Topdesk»)
  • Приложения имеют разрешения (например, «Обновить базу знаний»)
  • Роль может иметь разрешения, если роль уже имеет доступ к приложению

Предполагая отсутствие высокопроизводительной среды (не нужно оптимизировать для скорости), что будет лучшим способом для реализации этой схемы? Среда базы данных может быть MySQL, MSSQL ... это больше о дизайне реляционной базы данных.

Я сам придумал следующее:

ERD Diagram

Часть, в которой я больше всего не уверен, это, конечно, таблица Applications_Permissions_Roles. Это таблица ссылок поверх другой таблицы ссылок. Я никогда не использовал и не видел это раньше. Другой способ сделать это - заменить его таблицей связи между ролями и разрешениями, а затем использовать код или ограничения для обеспечения требуемых отношений ... но это не кажется мне хорошим решением. Эти вещи должны применяться на уровне базы данных, если это вообще возможно (и кажется возможным), а не на уровне кода.

Во-вторых, необходима ли связь между Permissions.Application и Applications.Id? Я использую его, потому что в Roles_Applications может не быть никаких строк (например, когда вы только что добавили новое приложение), и тогда невозможно определить, какие разрешения принадлежат какому приложению. Это также единственная точка отсчета для поиска, к какому приложению относится разрешение. Я думаю, это правильно, но это также делает круг в дизайне базы данных. Ошибки MSSQL на нем при попытке установить ON_DELETE или ON_UPDATE в каскад.

Любые предложения, или это как это должно быть сделано? Кстати, любые другие предложения, касающиеся соглашения об именах, также приветствуются (возможно, в качестве комментария).

Спасибо
Люк

Изменить: Изменение названия, надеюсь, сделать его более понятным. Предыдущий был более всеобъемлющим, но, вероятно, слишком запутанным.


Я не уверен, что сосредоточился на взаимодействии ролей, приложений и разрешений. Каждая роль / приложение имеет определенное разрешение, которое не зависит от других приложений роли? Например, у CEO / Topdesk может быть только разрешение на чтение, а у CEO / Calendar может быть запись?
Мдойл

Я не понимаю, что вы имеете в виду «лучшая схема реляционной базы данных для этих данных», вы имеете в виду, какой движок? Как Postgres или MySQL или MSSQL или ... и т. Д.?
Jcolebrand

@jcolebrand Думаю, название еще менее понятно, чем раньше ... Возможно, слово "структура базы данных" - это лучшее слово. Расположение таблиц и связей (внешние ключи и т. Д.).
Люк

@mdoyle Разрешения всегда находятся внутри приложения (пример: разрешение «изменять системные часы» в «окнах» приложения) и, следовательно, разрешение принадлежит только одному приложению. Роль может иметь как разрешения, так и приложения, единственное ограничение состоит в том, что если у вас есть какие-либо разрешения, вы также должны иметь доступ к приложению, которому принадлежат разрешения. (Очевидно, что если вы не можете использовать Topdesk, у вас не может быть разрешения «Обновить базу знаний» для приложения Topdesk.) Это делает это более понятным?
Люк

Я не уверен, что Roles_Applicationsэто реально. Учитывая, что все разрешения зависят от приложения, кажется, что они есть Applications_Permissions(то, что вы пометили Permissions), которые затем могут быть назначены определенным ролям с помощью записи в Applications_Permissions_Roles. Roles_Applicationsна самом деле, похоже, описывается самое основное разрешение приложения - простой доступ. Или это утверждение о том, что роль имеет некоторый уровень разрешений для приложения, но вы должны искать в другом месте, чтобы определить, какие из них.
Мдойл

Ответы:


3

То, как вы смоделировали это хорошо. Ваша модель обеспечивает соблюдение бизнес-правил базой данных.

Есть несколько вещей, которые вы могли бы сделать в качестве альтернативы. Можно было бы устранить суррогатный ключ на Roles_Applications. В качестве таблицы пересечений вы можете использовать два внешних ключа вместе в качестве составного первичного ключа. Если вы это сделаете, это будет распространяться Roleи Applicationдо вашего Applications_Permissions_Rolesстола. Это дает преимущество, заключающееся в том, что вы получаете больше «единого окна» для данных разрешений вашего приложения (т. Е. Меньше объединений) без какого-либо ущерба для нормализации.

Другой способ, которым вы могли бы пойти - это немного упростить и определить разрешение по умолчанию для каждого приложения. Вы можете называть это как хотите, например, «доступ по умолчанию», «базовый доступ» или «пользователь», или что угодно для вас. Это позволит вам сгладить вашу модель и, по сути, уронить Roles_Applicationsстол и присоединиться Applications_Permissions_Rolesк нему Roles. Это изменило бы природу запроса, который вы будете использовать, чтобы спросить «какие роли могут обращаться к каким приложениям?» но ваши бизнес-правила все равно будут соблюдаться схемой.


Спасибо за ваш ответ! Я еще не думал об этих предложениях. Второе предложение добавило бы много логики приложения: все места, которые обрабатывают разрешения, должны проверять, не выполняется ли операция с разрешением по умолчанию (поскольку это не должно быть изменяемым или, возможно, даже отображаться); и персонал, работающий с приложениями, должен убедиться, что разрешение по умолчанию создано или удалено соответствующим образом. Это упростит базу данных, но, похоже, дороже. Первое предложение - вариант, хотя, я думаю, я это реализую. Еще раз спасибо за обзор :)
Luc

1

Roles_Applicationне представляется реальной вещью здесь. Что это, кроме того, что означает, что определенная роль имеет определенный уровень разрешений для приложения, даже если вам нужно проверить, Applications_Permissions_Rolesчтобы определить, что это за уровень? Например, вот генеральный директор, который получает доступ на запись к календарю приложения в вашей текущей модели:

Роли

ID    Name
--    ----
1     CEO

Приложения

ID    Name
--    ----
C     Calendar

права доступа

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Roles_Applications

ID    Role_ID    Application_ID
--    -------    --------------
50    1          C

Applications_Permissions_Roles

Role_Application_ID    Permission_ID
-------------------    -------------
50                     10

Я думаю, что эта серия отношений может быть смоделирована без Roles_Applications. Если мы удалим это (как предлагает Джоэл Браун, но без изменения предположения, что есть «разрешения по умолчанию»):

Роли

ID    Name
--    ----
1     CEO

Приложения

ID    Name
--    ----
C     Calendar

Applications_Permissions (nee Permissions)

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Applications_Permissions_Roles

Role_ID    Application_Permission_ID
-------    -------------
1          10

Старая Permissionsтаблица не имеет простых разрешений, таких как «чтение» и «запись», которые затем могут применяться к приложениям, таким как «Topdesk» и «Календарь»: она содержит разрешения для конкретных приложений, такие как «запись в Topdesk» и « «Писать в календаре» и «Изменить системные часы в Windows». Чтобы сделать это более понятным, я назвал таблицу, Applications_Permissionsно, конечно, это не необходимый шаг.

Этот подход приводит к сглаживанию модели, как и второе предложение Джоэла, но без добавления логики приложения или концепции разрешений по умолчанию. Roles_Applicationsне принес ничего стороне, кроме указания на то, что роль имеет некоторый уровень доступа к приложению. Эта информация передается с большей краткостью благодаря наличию записи Applications_Permissions_Rolesс правильным значением Role_ID.


Хорошо, теперь я понимаю, что вы имеете в виду. Проблема в том, что у пользователя не всегда есть права доступа к приложению. Как и в случае с Microsoft Word, их просто нет. В этих случаях неизвестно, какая роль может получить доступ к какому приложению; у вас всегда должно быть хотя бы одно разрешение от этого приложения, назначенное на роль. Вот для чего было предложено «разрешение по умолчанию» от Джоэла Брауна. Спасибо за предложение, хотя! Это неплохая идея и имеет смысл, но я просто не могу применить ее к своей ситуации. * Upvoted *
Люк

Для чего-то вроде Word, не «выполнить» разрешение? Но я понимаю вашу точку зрения, если по какой-либо причине выполнение или доступ к приложению не считается разрешением.
Мдойл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.