каков наилучший способ представления отношения "многие ко многим" в базе данных?
-
05-07-2019 - |
Вопрос
Если у меня есть несколько пользователей и несколько страниц, и каждый пользователь может администрировать любое количество страниц, и каждая страница может администрироваться любым количеством администраторов, как я могу сохранить все эти разрешения в базе данных?
Например, у меня могло бы быть поле в таблице users, представляющее собой просто список идентификаторов страниц, разделенных запятыми, или аналогичное поле в для каждой страницы (администрируется...и т.д.).Но для этого потребовалось бы, чтобы я обработал строку после того, как она выйдет из базы данных.
Я мог бы предоставить каждому пользователю их собственную таблицу с макетом типа ключ => значение, где у меня был бы user=> someuser, name=> какой-то парень, permissions => что угодно, page_id => 4, page_id => 8, page_id => 12 и т.д.Но это кажется грязным и потребует дополнительных разрешений для пользователя mysql.
Предполагая, что количество страниц будет относительно небольшим (так и будет), я мог бы поместить поле типа "флаги" в таблицу users, 32-разрядный INT (в этой реализации не было бы более 32 "страниц").но это позволило бы использовать только своего рода привилегии включения / выключения.
Я также рассматривал возможность создания таблицы user, а затем каждой точки входа пользователя в таблицу разрешений для этого пользователя, в которой была бы строка для каждой страницы с соответствующими разрешениями для этого пользователя - это чище, чем другое решение "таблица для каждого пользователя", которое я перечислил, но опять же, также требуются дополнительные привилегии для учетной записи mysql.
Есть еще какие-нибудь идеи?Какое, по вашему опыту, решение этой проблемы оказывается наиболее безболезненным?
Решение
many < - > многие отношения обычно моделируются с помощью промежуточной таблицы. В вашем случае у вас были бы эти таблицы:
User UserPage Page
------ ----------- -------
UserID UserID PageID
... PageID ...
В промежуточной таблице (UserPage
здесь) хранится информация, относящаяся к этому набору идентификаторов (в данном случае, к вашим разрешениям).
Другие советы
канонический способ - создать промежуточную таблицу, содержащую только два поля: первичный ключ каждой из подключенных таблиц.
Что вам нужно, так это таблица сопоставления.
ПОЛЬЗОВАТЕЛЬ-----< USER_PERMISSIONS >-----СТРАНИЦЫ
Первичный ключ для новой таблицы представляет собой составной ключ, состоящий из идентификаторов user_id и page_id
Это обеспечит вам максимальную гибкость и позволит добавлять новые страницы без необходимости изменять вашу схему.