Проблема организации базы

Oddinn

Новичок
Проблема организации базы

Добрый день! У меня есть стандартная задача проверки прав доступа пользователя к материалам, и я хотел бы посоветоваться, правильно ли я организовал базу.
У меня материалы сайта (статьи) лежат в таблице (20 - 30 тысяч записей, около 50 Мб), каждый материал может относится к одной или нескольким группам доступа. Авторизованный пользователь может относится к одной или нескольким группам пользователей. Между группами доступа и группами пользователей существует связующая таблица, определающая права на совершение определенных операций (просмотр в списке, просмотр целиком, комментирование, редактирование, удаление и т.п.). Количество операций потенциально неограничено, также как и количество групп доступа и групп пользователей. Группа доступа у статьи и группы пользователей у полльзователя записываются по ID в поле VARCHAR(255) через запятую.
Такая организация позволяет достаточно гибко управлять доступом, но есть и обратная сторона. Для того, чтобы получить список статей для данного доступа, надо выполнить достаточно сложный SQL-запрос с использованием FIND_IN_SET и нескольких JOIN'ов, что естесственно весьма серьезно тормозит (до 0.5 секунды на запрос). Может кто-нибудь сталкивался с таким и знает более рациональный путь организауции управления доступом?
 

Фанат

oncle terrible
Команда форума
- Количество операций потенциально неограничено, также как и количество групп доступа и групп пользователей.
- Группа доступа у статьи и группы пользователей у полльзователя записываются по ID в поле VARCHAR(255) через запятую.
эти два положения, мягко говоря, противоречат друг другу.

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

Oddinn

Новичок
Автор оригинала: Фанат
эти два положения, мягко говоря, противоречат друг другу.


гмм. почему бы не выполнить два запроса?
один выяснит, к каким группам относится юзер
а второй запросит статьи, относящиеся к этим группам
Не противоречат. Я имел ввиду, что вообще количество групп неограниченно. Но каждый пользователь входит не более, чем в (например) пять групп. Также как и статья.
Запросе действительно делаю два, но FIND_IN_SET приходится выполнять столько раз, сколько групп у пользовтеля (их получаю заранее).
Автор оригинала: Panchous
уже неверно.
Ваши варианты? Если бы было ограниченное количество групп, я бы вписывал их побитово например в int, (0 - входит, 1 - не входит), но количество групп может быть много больше 10, что препятствует реализации такого подхода.
 

Фанат

oncle terrible
Команда форума
вписывать никого никуда не надо.
у тебя РЕЛЯЦИОННАЯ база данных.
в которой ты можешь устанавливать СВЯЗИ между таблицами.
сделав промежуточную таблицу между юзерами и правами.
таблицу, в которой можно будет использовать ИНДЕКСЫ.
 

Oddinn

Новичок
Автор оригинала: Фанат
вписывать никого никуда не надо.
у тебя РЕЛЯЦИОННАЯ база данных.
в которой ты можешь устанавливать СВЯЗИ между таблицами.
сделав промежуточную таблицу между юзерами и правами.
таблицу, в которой можно будет использовать ИНДЕКСЫ.
Согласен, но права у меня выставляются не юзерам, а группам. И, если я правильно понимаю, такой подход не избавляет от необходимости создавать у статьи поле с перечислением групп, к которым она относится. Или я не прав?
 

Panchous

Павел
ты же сделал связь многие-ко-многим для групп и пользователей...
здесь аналогичная ситуация - зачем воротить что-то?..
 

Oddinn

Новичок
Автор оригинала: Panchous
ты же сделал связь многие-ко-многим для групп и пользователей...
здесь аналогичная ситуация - зачем воротить что-то?..
Видимо я не вполне правильно объясняю. Согласен. Да, у меня есть связбь многие-ко-многим для пользователей и групп пользователей, а также связь многие-ко-многим для статей и "групп доступа". И мне надо выяснить, доступна ли операция просмотра данной статьи для данного доступа. Вопрос в том, можно ли это реализовать как-либо, кроме хранения списка ID групп доступа для каждой статьи и использования достаточно медленной функции FIND_IN_SET? на мой взгляд, этот подход противоречит идеологии SQL, но другого я придумать не могу.
 

Panchous

Павел
сделай таблицу: id_группы id_статьи уровень_доступа

уровень_доступа - либо ENUM, либо id из таблицы с возможными уровнями

в чем проблема?
 

Oddinn

Новичок
Автор оригинала: Panchous
сделай таблицу: id_группы id_статьи уровень_доступа

уровень_доступа - либо ENUM, либо id из таблицы с возможными уровнями

в чем проблема?
В том, что уровень доступа назначается не для статьи, а для группы доступа. А статья может принадлежать ко многим группам доступа. Собственно в этом вся проблема.
 

Oddinn

Новичок
Автор оригинала: Panchous
ИМХО что-то здесь не так...уровень доступа к чему?
Есть группа доступа, к которой назначаются права доступа для групп пользователей. Каждая статья относится к одной или нескольким группам доступа. Если пользователь относится к группе, имеющий права на производимую операцию для хотя бы одной из групп доступа, к которым относится статья - значит операция разрешена. Неужели это такой уникальный случай?
 

Panchous

Павел
не вижу проблемы:
1. многие-ко-многим: права-группа_доступа
2. многие-ко-многим: группа_доступа-группа_юзеров
3. многие-ко-многим: группа_юзеров-юзер
4. многие-ко-многим: статья-группа_доступа
 

Oddinn

Новичок
Автор оригинала: Panchous
не вижу проблемы:
1. многие-ко-многим: права-группа_доступа
2. многие-ко-многим: группа_доступа-группа_юзеров
3. многие-ко-многим: группа_юзеров-юзер
4. многие-ко-многим: статья-группа_доступа
Т.е. ты предлагаешь распихать это все по отдельным таблицам? Это же будет куча JOIN'ов, если сделать запрос на получение списка 20 статей, которые доступны для данного пользователя. Не будет ли это медленнее?
 

ТопольМ

Новичок со стажем
правильно, делаешь столько табличек сколько надо, чтобы задать кто кому принадлежит и что кому разрешено
 

Фанат

oncle terrible
Команда форума
Oddinn
даавай ты прочитаешь моё сообщение?
причём напишешь только то, что там написано, а не то, что ты увидел через мутное стекло своих фантазий?
 

Oddinn

Новичок
Автор оригинала: Фанат
Oddinn
даавай ты прочитаешь моё сообщение?
причём напишешь только то, что там написано, а не то, что ты увидел через мутное стекло своих фантазий?
Ок. Всем спасибо. Буду пробовать.
 
Сверху