1

Тема: Ієрархічна структура в реляційній БД

Задача схожа на попередню тему.

Є організація, в ній відділи. Структура відділів багаторівнева, причому нерівна: є відділи верхнього рівня без підвідділів, є відділи, що містять відділи, що містять відділи. Глибина на практиці обмежується 4 рівнями, але ніхто не гарантує, що в майбутньому їх не буде більше. Відділи займаються роботою, по якій потім збирається статистика. Запити по статистиці можуть бути як по роботі співробітників відділу тільки верхнього рівня, так і по роботі всіх підвідділів на всю глибину. Як зберігати структуру відділів в БД?

Рішення, що по факту використовується в моїй організації: кожен відділ має свій номер, що розкладається по два десяткові розряди на рівень. Так, номер 310040000 означає 3 (відділ №3) - 10 (підвідділ №10) - 04 (підпідвідділ №4) - два вільні розряди. Запит по справах у підвідділі №10 і глибше робиться приблизно так:

...
WHERE `DivisionNumber` BETWEEN 310000000 AND 31999999

Які будуть думки, як це покращити?

2

Re: Ієрархічна структура в реляційній БД

Цікаве питання.
В Laravel я використовую baum для цього.
А він свою чергу використовує: https://en.wikipedia.org/wiki/Nested_set_model (українською).

Подякували: quez, koala, Yola, leofun014

3

Re: Ієрархічна структура в реляційній БД

Можливо на щось наштовхне..
Колись робив схожим способом
http://programmer-weekdays.ru/archives/187

Подякували: koala1

4 Востаннє редагувалося vitia444 (09.02.2016 16:59:30)

Re: Ієрархічна структура в реляційній БД

Така річ (ієрархія) зазвичай вирішується зв'язком таблиці на саму себе (іншими словами, є поле, яке вказує на свого предка, і відповідно є кортеж, який містить на місці предка NULL). Оброблювати таку структуру для БД важче, і здійснюється це рекурсивним запитом (він свій у Оракла, у всіх остальних - оператор WITH із SQL99 стандарту)

UPD: Ось на хабрі толково пояснюють

Подякували: koala, Yola, Engineer, leofun014

5

Re: Ієрархічна структура в реляційній БД

vitia444 написав:

Така річ (ієрархія) зазвичай вирішується зв'язком таблиці на саму себе (іншими словами, є поле, яке вказує на свого предка, і відповідно є кортеж, який містить на місці предка NULL). Оброблювати таку структуру для БД важче, і здійснюється це рекурсивним запитом (він свій у Оракла, у всіх остальних - оператор WITH із SQL99 стандарту)

UPD: Ось на хабрі толково пояснюють

О, воно!

6

Re: Ієрархічна структура в реляційній БД

Приклад рекурсивного запиту. що обчислює факторіали чисел від 0 до 9 такий:

WITH temp (n, fact) AS 
(SELECT 0, 1 -- Початковий запит
  UNION ALL 
 SELECT n+1, (n+1)*fact FROM temp -- Рекурсивний підзапит
        WHERE n < 9)
SELECT * FROM temp;
Подякували: 221VOLT, leofun012