Как определить иерархическую настройку модели данных, которая сделает поиск эффективным (по умолчанию-организация-отдел) - PullRequest
0 голосов
/ 12 апреля 2020

Я не совсем уверен, что слово "иерархический" здесь подходит. Мне нужна таблица 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, чтобы затем легко / более последовательно применять поиск / нумерацию страниц.

...