@drboboev

Какой подход выбрать для иерархической таблицы?

Добрый день, знатоки.

Дано - большое множество торговых точек, раскиданных по регионам. Каждое утро менеджер в каждом регионе собирает данные по продажам всех точек региона за прошедший день. В центральном офисе компании сидит начальник, который хочет видеть все продажи с разбивкой по регионам. То есть, должна быть таблица со списком регионов, регионы раскрываются, видим список торговых точек с продажами каждой точки. Соответственно, все точки должны суммироваться на регион и отображать общую цифру за регион. В данной задаче только 2 уровня, но нужно предусмотреть возможность увеличения количества уровней (не более 10).

В чем собственно вопрос? Как более правильно, с точки зрения проектировки, построить базу данных для этой задачи. И как более грамотно и конечно же быстро выгружать данные из БД и выводить на экран в виде таблицы.

Была идея подгружать данные в момент раскрытия региона. Изначальная загрузка будет быстрее, но при каждом раскрытии/сворачивании нужно будет дополнительно обращаться к БД.

Думал о подходе потомок-родитель с рекурсивным запросом к БД. Но как потом правильно выводить данные на страницу пока идей нет, потому что прямой перебор массива может нарушить иерархию.

Буду рад любым теориям, а идеальным будет готовое решение.

Спасибо
  • Вопрос задан
  • 287 просмотров
Пригласить эксперта
Ответы на вопрос 4
NestedSet покроет задачу полностью, есть масса библиотек для работы с данным множеством, также данная задача наверняка подразумевает под собой рост дерева как в глубину так и в ширь.
Ответ написан
@LiguidCool
https://en.wikipedia.org/wiki/Nested_set_model
А вообще обсасывалось не единожды, поиск в помощь.
Ответ написан
Комментировать
@RaulDuke
Приветствую. Я бы думал что-то в эту сторону.

regions: {
  {
    id: 111,
    name: 'ЦФО'
  },
  {
    id: 222,
    name: 'Юг'
  }
},

sales_point: {
  {
    id: 5555,
    name: 'ИП Иванов',
    region: 111
  },
  {
    id: 6666,
    name: 'ИП Сидоров',
    region: 222
  },
  {
    id: 7777,
    name: 'ООО Рога',
    region: 222
  }
}


При рендере первого уровня (с отображением регионов) мы берем записи из "regions" и формируем список с id. Отображаем и следом делаем запрос на данные из sales_point по id регионов (не дожидаемся по раскроют список). Думаю, что делал бы примерно так.
Ответ написан
copist
@copist
Empower people to give
> Буду рад любым теориям
Несколько вариантов:
  • Nested Sets
  • Parent-Child
  • Materialized Paths
  • Иерархические БД
  • Специальный синтаксис SQL-1999 для WITH recursive
  • Специальный синтаксис Oracle для START WITH ... CONNECT BY


Ссылки:
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы