Каков наилучший способ представления отношения «многие ко многим» в базе данных? - PullRequest
0 голосов
/ 23 октября 2009

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

Например, у меня может быть поле в таблице users, представляющее собой список идентификаторов страниц, разделенный запятыми, или аналогичное поле для каждой страницы (администрируется ... и т. Д.). Но для этого потребуется обработать строку после того, как она выйдет из базы данных.

Я мог бы дать каждому пользователю свою собственную таблицу с макетом типа key => value, где бы я имел user => someuser, name => некоторый парень, права доступа => все, > 8, page_id => 12 и т. Д. Но это выглядит грязно и потребует дополнительных разрешений для пользователя mysql.

Предполагая, что количество страниц будет относительно небольшим (оно будет), я мог бы поместить поле типа «флаги» в таблицу пользователей, 32-битное INT (в этом не было бы более 32 «страниц»). реализация). но это позволило бы только включить / выключить привилегию.

Я также подумал о том, чтобы иметь пользовательскую таблицу, а затем каждую точку входа пользователя в таблицу разрешений для этого пользователя, в которой будет строка для каждой страницы с соответствующими разрешениями для этого пользователя - это чище, чем у другого " решение "таблица на пользователя", которое я перечислил, но опять-таки также требуются дополнительные привилегии для учетной записи mysql.

Есть еще идеи? Что, по вашему опыту, является наиболее безболезненным решением этой проблемы?

Ответы [ 3 ]

18 голосов
/ 23 октября 2009

многие <-> многие отношения обычно моделируются с помощью промежуточной таблицы. В вашем случае у вас будут следующие таблицы:

User        UserPage       Page
------      -----------    -------
UserID      UserID         PageID
...         PageID         ...

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

2 голосов
/ 23 октября 2009

каноническим способом является создание промежуточной таблицы, содержащей всего два поля: первичный ключ каждой из подключенных таблиц.

1 голос
/ 23 октября 2009

Вам нужен картографический стол.

ПОЛЬЗОВАТЕЛЬ ----- ----- СТРАНИЦЫ

Первичный ключ для новой таблицы - это составной ключ, состоящий из идентификатора пользователя и идентификатора страницы

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...