Использование set('ru', 'rg', ro', 'wu', 'wg', 'wo', 'xu', 'xg', 'xo', 'sgid', 'suid', 't')
Это оптимизировано по битам.
Однако, если вам нужно отфильтровать отдельные разрешения (например, «выбрать всех пользователей, которые могут читать отсюда»), вылучше реализовать его в виде простых таблиц «многие ко многим»:
user_permissions (object_id, user_id, permission ENUM ('r', 'w', 'x'))
group_permissions (object_id, group_id, permission ENUM ('r', 'w', 'x'))
other_permissions (object_id, permission ENUM('r', 'w', 'x', 'sgid', 'suid', 't'))
с каждым разрешением в отдельной записи, создать ограничения PRIMARY KEY
:
object_id, permission, user_id
object_id, permission, group_id,
object_id, permission
и запрос:
SELECT u.id
FROM user_permissions up
JOIN users u
ON u.id = up.user_id
WHERE object_id = $object
AND permission = 'r'
UNION
SELECT g.user_id
FROM group_permissions gp
JOIN user_groups ug
ON ug.group_id = gp.group_id
WHERE object_id = $object
AND permission = 'r'
UNION
SELECT u.id
FROM users u
JOIN other_permissions op
ON object_id = $object
AND permission = 'r'