Иерархическая база данных: модель данных, структура и примеры

Иерархическая база данных: модель данных, структура и примеры Полезное

Иерархическая база данных — это модель данных, в которой записи организованы в виде дерева со связями родитель-потомок, причем у каждого потомка ровно один родитель. Так проще всего описывать вложенность: разделы и подразделы, папки и файлы, отделы и сотрудники. Ниже разберем, как устроено такое дерево, какие у модели связи и ограничения, где ее реально применяют (от IBM IMS до файловых систем и LDAP), в чем плюсы и минусы и чем она отличается от реляционной, сетевой и графовой моделей.

Как устроена иерархическая модель данных

Данные в иерархической модели хранятся как дерево из узлов. Один узел — это запись (в терминах IBM IMS — сегмент), то есть набор именованных полей. Узлы соединены связями по принципу «сверху вниз».

У дерева есть несколько обязательных элементов:

  • Корень (root) — единственный верхний узел, у него нет родителя. С него начинается любой обход дерева.
  • Родитель (parent) — узел, у которого есть подчиненные записи.
  • Потомок (child) — подчиненный узел. У него всегда ровно один родитель.
  • Лист (leaf) — узел без потомков, конец ветки.

Ключевое правило: у потомка может быть только один родитель, а у родителя — сколько угодно потомков. Поэтому иерархическая модель хорошо описывает строгую вложенность и плохо — ситуации, где один объект относится сразу к нескольким «владельцам».

Связи 1:N и почему нет «многие ко многим»

Связь в иерархии — это всегда «один ко многим» (1:N): один родитель, много детей. Прямой связи «многие ко многим» (M:N) модель не поддерживает. Например, если один студент ходит на несколько курсов, а на каждом курсе много студентов — это M:N, и в чистое дерево оно не укладывается: студенту пришлось бы иметь двух родителей.

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

Важное следствие 1:N — целостность связей: потомок не существует без родителя. Если удалить родительский узел, вместе с ним из базы исчезает вся его ветка (каскадное удаление). Это удобно, когда подчиненная запись бессмысленна в отрыве от главной (строки заказа без заказа), но требует внимания: удаление узла у корня стирает большое поддерево.

Примеры иерархических баз данных

Модель кажется архаичной, но деревья родитель-потомок окружают нас каждый день. Вот где иерархия работает на практике:

  • IBM IMS (Information Management System) — классическая иерархическая СУБД. Ее создали в 1960-х для программы «Аполлон», и IBM до сих пор поддерживает и развивает IMS — она обрабатывает транзакции в банках, страховых и логистике на мейнфреймах z/OS.
  • Файловая система — папки и вложенные папки с файлами. У каждого файла один родительский каталог, у каталога — много вложений. Это дерево в чистом виде.
  • Реестр Windows — ветки (HKEY_LOCAL_MACHINE и другие), разделы и параметры выстроены строго иерархически.
  • LDAP и Active Directory — службы каталогов хранят пользователей, группы и компьютеры в дереве (Directory Information Tree). Путь до объекта (Distinguished Name) — это и есть маршрут от корня.
  • DNS — доменные имена образуют дерево: корневая зона, домены верхнего уровня (.ru, .com), затем otus.ru и поддомены.
  • XML и JSON — форматы обмена данными хранят дерево: у элемента один родитель и любое число вложенных.

Как выглядит дерево в XML

Иерархию удобно показать разметкой. Возьмем упрощенную структуру школы: директор -> завуч -> учитель -> класс.

<school>
  <director name="Иванова">
    <deputy name="Петров">
      <teacher name="Сидоров">
        <class name="10А"/>
      </teacher>
    </deputy>
  </director>
</school>

Вложенность тегов и есть связи родитель-потомок. Корень тут — <school>, лист — <class>. Ни один тег не может лежать сразу в двух родителях — это и отражает правило одного родителя.

То же дерево в реляционной базе

В реляционной СУБД дерево обычно хранят одним из способов — через ссылку на родителя (adjacency list). Пример на SQL (проверяется в SQLite или PostgreSQL):

CREATE TABLE org (
    id        INTEGER PRIMARY KEY,
    name      TEXT NOT NULL,
    parent_id INTEGER REFERENCES org(id)  -- NULL только у корня
);

INSERT INTO org VALUES (1, 'Директор', NULL);
INSERT INTO org VALUES (2, 'Завуч',    1);
INSERT INTO org VALUES (3, 'Учитель',  2);

-- прямые потомки завуча (id = 2)
SELECT name FROM org WHERE parent_id = 2;   -- вернет: Учитель

Здесь иерархию задает столбец parent_id: он ссылается на id родителя, а у корня равен NULL. Разница с настоящей иерархической СУБД в том, что связь тут логическая (по значению ключа), а дерево собирается запросом. В IMS же дерево — это физическая структура хранения, и обход идет по ней напрямую, без соединения таблиц.

Частая ошибка новичка — удалить родителя и забыть про детей:

DELETE FROM org WHERE id = 2;   -- удалили завуча
-- строка 'Учитель' осталась с parent_id = 2, ссылка ведет в никуда

Результат: «висячая» запись-сирота, ссылающаяся на несуществующего родителя. Исправление — объявить каскадное удаление, чтобы ветка чистилась вместе с корнем поддерева:

parent_id INTEGER REFERENCES org(id) ON DELETE CASCADE

Плюсы и минусы иерархической модели

Сильные стороны:

  • Скорость на «своих» запросах. Обход по заранее известному пути (от корня вниз) очень быстрый — не нужны соединения таблиц. Поэтому IMS десятилетиями держит высоконагруженные транзакции.
  • Простая и понятная структура. Дерево наглядно ложится на реальную вложенность: оргструктуру, каталог, меню.
  • Встроенная целостность 1:N. Потомок не может «повиснуть» без родителя.

Слабые стороны:

  • Нет связей «многие ко многим» напрямую. Их приходится моделировать дублированием или ссылками, что ведет к избыточности.
  • Жесткость структуры. Изменить схему дерева задним числом трудно, а запросы «не по дереву» (найти всех по произвольному признаку) неудобны и медленны.
  • Дублирование данных. Один и тот же объект в разных ветках хранится копиями, их легко рассинхронизировать.

Вывод по применимости: иерархия уместна там, где данные древовидны по природе и читаются сверху вниз. Если связи между объектами богатые и разнонаправленные, лучше подойдет реляционная или графовая модель.

Сравнение с реляционной, сетевой и графовой моделями

Модель Как связаны данные Поддержка M:N Типичный пример Когда уместна
Иерархическая Дерево, потомок = один родитель Нет (только через обход) IBM IMS, файловая система, DNS Строгая вложенность, чтение сверху вниз
Сетевая Граф, у записи несколько родителей Да, но через жесткие наборы CODASYL, IDMS Сложные связи на мейнфреймах (исторически)
Реляционная Таблицы, связи по ключам Да, через таблицу-связку PostgreSQL, MySQL, Oracle Универсальные бизнес-данные, произвольные запросы
Графовая Узлы и ребра как равноправные сущности Да, естественно Neo4j, ArangoDB Соцсети, рекомендации, связи «всех со всеми»

Сетевая модель — прямое развитие иерархической: она разрешила потомку иметь несколько родителей и покрыла M:N, но осталась сложной в поддержке. Реляционная модель вытеснила обе за счет гибкости и SQL. Графовые базы — ответ на задачи с очень плотными связями, где дерево и таблицы неудобны.

Выводы

  • Иерархическая база данных хранит данные деревом: один корень, связи родитель-потомок, у каждого потомка ровно один родитель.
  • Основная связь — «один ко многим» (1:N); «многие ко многим» напрямую не поддерживается и требует обходных решений.
  • Целостность встроена: удаление родителя каскадно удаляет всю ветку, потомок без родителя не существует.
  • Модель быстрая на обходах по дереву, но жесткая и склонна к дублированию данных.
  • Иерархия жива и сегодня: IBM IMS, файловые системы, реестр Windows, LDAP/Active Directory, DNS, XML и JSON — все это деревья.
  • Для универсальных задач с произвольными связями выбирают реляционную модель, для плотных связей — графовую.

Где применяется / связь с практикой

Понимание разных моделей данных — база для любой работы с СУБД: выбирая хранилище под задачу, инженер сначала решает, какая модель ложится на данные (дерево, таблицы или граф), и лишь потом — конкретную систему. На практике чаще всего работают с реляционными базами и SQL, но знание иерархической и графовой моделей помогает не «натягивать» дерево на таблицы и наоборот.

Освойте тему на практике

Разобраться, как проектировать схемы, писать запросы и выбирать модель под задачу, можно на курсе subd. Чтобы попробовать формат и темы до старта, загляните на бесплатные вебинары — там разбирают реальные задачи по базам данных.

Смежные темы: Основы работы с базами данных, Работа с базами данных, База данных в мобильном приложении на примере Realm.

FAQ

Иерархическая база данных устарела — ее еще где-то используют?
Как отдельный класс СУБД она редка, но модель жива: IBM IMS работает в банках и страховых, а деревья лежат в основе файловых систем, DNS, LDAP и форматов XML/JSON.

Чем иерархическая модель отличается от сетевой?
В иерархической у потомка ровно один родитель (чистое дерево), в сетевой — несколько родителей (граф). Сетевая поэтому умеет «многие ко многим», но сложнее в поддержке.

Можно ли хранить дерево в обычной реляционной базе?
Да. Дерево моделируют столбцом-ссылкой на родителя (parent_id), схемой nested set или рекурсивными запросами (WITH RECURSIVE). Это стандартная практика в PostgreSQL и MySQL.

OTUS Журнал