Я бы запихнул все это в базу данных:
- Выполнение этого в базе данных через JOINs будет намного быстрее, чем фильтрация вещей в вашем PHP.
- Выполнение этого в базе данных позволит вам правильно разбивать страницы на части без необходимости перепрыгивать через обручи, например, извлекать больше данных, чем вам нужно (и затем извлекать еще больше, если вы в итоге выбрасываете слишком много).
Я могу вспомнить две широкие стратегии, которые вы могли бы использовать для управления ACL.
Вы можете установить явные ACL в базе данных с одной таблицей вроде этого:
id
: идентификатор предмета (книги, рисунка, ...), о котором идет речь.
id_type
: тип или таблица, из которой идет идентификатор.
user
: пользователь, который может смотреть на вещь.
Пара (id
, id_type
) дает вам псевдо-FK, который можно использовать для проверки работоспособности вашей базы данных, а id_type
можно использовать для выбора класса, чтобы обеспечить необходимый клей для взаимодействия с специфичные для типа части списков ACL и добавление фрагментов SQL в запросы для правильного объединения таблицы ACL.
В качестве альтернативы, вы можете использовать соглашение об именах, чтобы присоединить таблицу вспомогательных таблиц ACL к каждой таблице, для которой требуется ACL. Для таблицы t
вы можете иметь таблицу t_acl
с такими столбцами, как:
id
: идентификатор вещи в t
(с реальным внешним ключом для целостности).
user
: пользователь может посмотреть на вещь.
Тогда у вас может быть один класс ACL, который может корректировать ваш SQL с учетом имени базовой таблицы.
Основным преимуществом первого подхода является то, что у вас есть единое хранилище ACL для всего, поэтому легко ответить на такие вопросы, как «на что может смотреть пользователь X?». Основным преимуществом второго подхода является то, что вы можете иметь реальную ссылочную целостность и меньше кода (благодаря соглашениям об именах) для склеивания всего этого вместе.
Надеюсь, что вышесказанное поможет вам думать.