Метод, который вы описали - индивидуальные привилегии, хранящиеся в столбцах, - прост за счет гибкости (как вы заметили).
Метод Зуула еще более прост и по сути такой же, как у вас, за исключением того, что он избегает необходимости каких-либо операторов "ALTER TABLE". Однако он не нормализуется, не легко запрашивается и не самодокументируется.
Другая проблема, связанная с обоими этими методами, заключается в том, что по мере роста вашей пользовательской базы вам будет все труднее поддерживать правильность всех привилегий. Вы окажетесь с большим количеством пользователей, которым нужны точно такие же привилегии. Тем не менее, чтобы изменить привилегии пользователя, например, добавить новую привилегию, вам нужно будет войти и добавить эту привилегию каждому пользователю, который нуждается в ней индивидуально. Major PITA.
Для форума маловероятно, что вам понадобится управление привилегиями для каждого пользователя. Скорее всего, у вас будут определенные классы пользователей, такие как анонимные пользователи, вошедшие в систему пользователи, модераторы, администраторы и т. Д. Это сделает его подходящим для управления доступом на основе ролей (RBAC). В этой системе вы назначаете каждому пользователю роль и предоставляете ей привилегии. Привилегии будут храниться в виде строк в таблице «привилегий». поэтому упрощенная схема базы данных будет выглядеть так:
PRIVILEGE
int id (primary key)
varchar description
ROLE_PRIVILEGE_JOIN
privilege_id (foreign key)
role_id (foreign key)
ROLE
int id (primary key)
varchar description
USER
int id (primary key)
int role_id (foreign key)
Этот шаблон используется во многих приложениях, которые имеют дело с привилегиями пользователя. Добавьте каждую привилегию, которую кто-либо может иметь в виде строки в таблице привилегий; добавить каждую роль, которую любой пользователь может иметь в таблице ролей; и связать их соответствующим образом в таблице role_privilege_join.
Единственный реальный недостаток заключается в том, что поскольку используется таблица соединения, запрос «может пользователь X сделать Y» будет несколько медленнее.