Stalker_RED, у пользователя специфичность больше, чем у роли; у роли больше, чем у сервера.
Можно определить это числом URS, где U, R и S - битовые флаги, показывающие, заданы ли указанные критерии для для пользователя, роли и сервера соответственно.
Для пользователя на каком-то сервере (U="some_id_here", R=null, S="some_id_here") => 101.
Для роли на сервере(U=null, R="some_id_here", S="some_id_here") => 011.
101 > 011.
При наличии триггеров можно сделать отдельное поле, в которое при обновлении записывать эти числа и организовывать сортировку по этому полю.
НО даже так, как сделать корректную выборку по этим параметрам в одном запросе - вопрос.
Stalker_RED, все те, что имеют максимальное значение специфичности. Например, если для для одной роли на сервере задано сразу 4 шаблона, то получаем их все.
Нагрузка планируется небольшая.
Каждый сервер ежедневно для себя формирует список своих участников, специфичный для конкретного дня,
роли каждого пользователя известны, затем сервер для каждого пользователя из списка запрашивает подходящие шаблоны, фильтруя по описанным критериям. Из полученного списка "подходящих" шаблонов случайно выбирается один. Всё.
А есть ли вообще хоть какая-то возможность удалить за раз все ссылки на объект?
Например, у меня есть класс User. Происходит login и создается экземпляр для текущего пользователя, ссылки на который разлетаются по разным участкам другим объектам.
Во время logout было бы намного удобнее вызвать что-то наподобие delete someUser;, чтобы не лезть в другие объекты и не присваивать null.