Положим есть единицы данных «content» и есть пользователи «user».
Пользователи могут создавать content и настраивать права доступа для других пользователей по нескольким правилам:
— доступно всем
— доступно друзьям
— доступно конкретному другу/списку друзей
Правила складываются через «или». Т.е. доступно, если доступно хотя бы по одному из правил.
content [id, user_id, name]
user [id, name]
user_friend [user_id, friend_user_id]
Как организовать хранение таких правил в БД с тем, чтобы можно было составить не фулскановый запрос на выборку всех (via pagination) «content», доступных для конкретного пользователя?
Простейшая нормализованная схема хранения:
content_share_wide [content_id, type] // всем или друзьям, где type = 1 - всем, type = 2 - друзьям
content_share_user [content_id, user_id] // контент, расшаренный на user_id
При такой схеме получается невозможным составить запрос кроме как с помощью UNION, что очень негативно сказывается на производительности.
Как сделать лучше? (как вообще сделать, потому что такой union и за работающий вариант считать не хочется)