Я не совсем уверен, что слово "иерархический" здесь подходит. Мне нужна таблица settings
, которая будет содержать настройки по умолчанию, которые могут быть переопределены на уровне организации и / или отдела.
Мы используем рельсы, но я думаю, что это довольно общий вопрос моделирования базы данных.
Итак, наша модель данных выглядит примерно так:
string :name
string :value
string :parent_type
string :parent_id
У нас есть полиморф c ссылка на parent
, который может быть либо организацией, либо отделом. Когда настройки переопределяются, мы определяем настройку с тем же именем и связываем их с правильной организацией / отделом.
На данный момент, чтобы найти все необходимые настройки для отдела, мой запрос выглядит следующим образом:
select source, id, name, value from
(
(
select 'department' as source, id, name, value from settings
where parent_type = 'Department' and parent_id = #{department.id}
) union (
select 'organisation' as source, id, name, value from settings
where parent_type = 'Organisation' and parent_id = #{department.organisation_id}
and name not in (select name from settings where parent_type='Department' and parent_id=#{project.id})
) union (
select 'default' as source, id, name, value from settings
where parent_type is null and parent_id is null
and name not in (
select name from settings where parent_type='Department' and parent_id=#{department.id}
union
select name from settings where parent_type='Organisation' and parent_id=#{department.organisation_id}
)
)
) as combined_settings order by name asc
Это работает, но кажется слишком сложным, а также очень сложным для того, чтобы добавить поиск или разбиение на страницы (более сложный, чем, например, добавление в простую таблицу или представление).
В пользовательском интерфейсе я могу показать, где определены настройки (default-org-dept), которые затем можно переопределить на уровне отдела если так хочется.
Так что я ломаю голову над тем, как мне пришлось бы адаптировать структуру данных, чтобы упростить поиск параметров для определенного c отдела или организации в более простом запросе.
Я думал, что должен / мог бы определить sql представление, но потом я продолжаю зацикливаться на том, как определение вида сделает это проще? Я также думал об иерархических данных и о том, как я мог бы преобразовать представление данных в иерархическое дерево (например, настройка по умолчанию -> org -> dept), но оно не подходит полностью, потому что:
- настройка по умолчанию действительна на всех уровнях, если только она не отменена
- настройка может быть отменена на уровне отдела, а не на уровне организации
- теоретически настройка может быть определена без установки по умолчанию в все
Я пытался применить вложенные наборы, три дерева, материализованные пути, но ни один из них, похоже, не подходит, или, по крайней мере, я не собираюсь применять его.
Я чувствую, что должен быть лучший путь, и это также кажется общей проблемой, с которой столкнется больше людей. Так как ты решил это? Любые советы и / или подсказки приветствуются.
Или, как альтернатива, как я могу использовать запрос sql в качестве основы для модели Rails ActiveRecord, чтобы затем легко / более последовательно применять поиск / нумерацию страниц.