каков наилучший способ представления отношения "многие ко многим" в базе данных?

StackOverflow https://stackoverflow.com/questions/1610411

Вопрос

Если у меня есть несколько пользователей и несколько страниц, и каждый пользователь может администрировать любое количество страниц, и каждая страница может администрироваться любым количеством администраторов, как я могу сохранить все эти разрешения в базе данных?

Например, у меня могло бы быть поле в таблице 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

Это обеспечит вам максимальную гибкость и позволит добавлять новые страницы без необходимости изменять вашу схему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top