На стороне базы
Есть таблица, содержащая шаблоны сообщений бота Discord:
Для каждого шаблона задаётся область применения (специфичность), с использованием колонок
server_id (далее S),
role_id (далее R),
user_id (далее U) (
не является уникальным ключом).
Могут быть заданы:
- общесерверные шаблоны (S=null, R=null, U=null);
- для конкретного пользователя (S=null, R=null, U="some_id_here");
- для пользователя на каком-то сервере (S="some_id_here", R=null, U="some_id_here");
- для роли на сервере (S="some_id_here", R="some_id_here", U=null);
- для конкретного пользователя с установленной специальной ролью (S=null, R="some_id_here", U="some_id_here");
- и так далее.
Понятно, что специфичность столбцов по-отдельности задаётся как S<R<U,
но вкупе, например, (S="some_id_here", R=null, U="some_id_here") > (S=null, R=null, U="some_id_here").
На стороне бота
Со стороны бота нам известны сервер -
ServerID, адресат -
UserID, список ролей адресата -
UserRoles[].
Имея этот набор данных, требуется выбрать из базы
все шаблоны, подпадающие под них и имеющие
максимальную специфичность.
Ограничения
Бот написан на
TypeScript, обращение к базе осуществляется через библиотеку
Knex.js.
В связи с этим есть ряд ограничений. Бот должен уметь сам создавать таблицу в случае её отсутствия, поэтому таблица должна быть максимально проста. Триггеры отпадают.
Вопрос
Как организовать такую выборку?
Вообще, она осуществима в рамках заданных ограничений?
P.S. Бот написан не мной, связи с разработчиком нет. Я пишу модуль для него, и лезть в структуру бота не могу, поэтому ограничен его api.