В Web консоле администратор добавляет пользователя в проект и предоставляет доступ к папкам одним их следующих способов: "Доступ ко всем папкам", "Доступ ко всем кроме", "Доступ только к".
Соответственно при выборе одного из 2х последних пунктов, добавляется окно для выбора папок. Таким образом мы имеем тип доступа и список папок.
На данный момент созрело только одно решение:
Добавить в таблицу project_user поле folder_access_type(int) - 0,1,2
И создать таблицу project_user_folder - [project_id, user_id, folder_id] в которой собственно и хранить список папок.
Соответственно списком доступных пользователю папок, при folder_access_type = 1 будут все папки проекта минус папки из таблицы project_user_folder, а если folder_access_type = 2 то просто все папки из таблицы project_user_folder.
Решение не кажется очень лаконичным, по этому решил задать вопрос здесь, как лучше организовать структуру таблиц при данном подходе к разграничению доступа?
Вообще норм решение у вас. Только если у вас будут появляться еще объекты в проекте, вам придется постоянно добавлять колонки для каждого объекта в таблицу PROJECT_USER.
Еще интересно, какая БД. Как вариант можно прям в таблице PROJECT_USER вместо folder_access_type хранить json например с типом доступа и списком id папок, на которые у него есть или нет доступа. Целостность в данном случае будет нарушена, если у вас папки будут удаляться из базы и id будут невалидны. Но на стороне приложения можно просто делать сверку с теми id, которые вы получите по проекту, а те, что уже не актуальны, будут игнориться. Ну и в зависимости от того, как часто будет меняться структура папок, можно запускать раз в день/неделю/месяц джоб по актуализации идентификаторов папок.
Почему я спросил про базу, потому что в PostgreSQL есть поддержка работы с JSON на стороне БД, что может облегчить реализацию. В ином случае вам придется парсить все на уровне приложения, что собственно тоже не плохо.
Foo Bar: Я рассматривал вариант с хранением json'а или списка id через запятую, но отказался именно по причине ивалидности удаленных id. В данный момент разрабатывается прототип, по этому база пока MySQL. Там кстати тоже есть поддержка JSON начиная с версии 5.7. В данный момент использую свой же вышеописанный вариант.
Спасибо за комментарий!