Реляционные базы данных часто используются для хранения графов во всех их многочисленных вариантах (деревья, ориентированные графы, неориентированные графы и т. д.).
Почему же тогда ни одна из основных СУБД (Microsoft, MySql, Oracle, PostgreSQL, SqlLite, и это лишь некоторые из них в алфавитном порядке) не включает поддержку библиотек для обработки отношений как графов?
Некоторые желательные функции, например:
- Проверка ограничений (связность, ацикличность, планарность, ...)
- Обычно необходимые функции (кратчайший путь, минимальное остовное дерево, транзитивное замыкание, максимальный расход/минимальный разрез, обнаружение клики, гамильтоновы/эйлеровы циклы...)
- Вспомогательные структуры данных, необходимые для повышения производительности для любого из вышеперечисленных
Создание поддержки некоторых из этих вещей за пределами базы данных затруднено, потому что (среди прочего):
- Это по своей сути сложно (здесь помогают библиотеки)
- Короткие ответы часто подкрепляются большим количеством данных: внешний клиент, использующий алгоритм кратчайшего пути, должен либо быть очень «болтливым» с базой данных, либо должен получить гораздо больший, чем необходимо, объем данных; любой выбор вреден для сети
- Поддержание целостности, когда целостность зависит от теоретико-графового ограничения, требует доступа ко всем предлагаемым обновлениям, следовательно, к триггеру, а доступ к существующим библиотекам графов из триггеров во многих системах затруднен.
- Менеджер хранения и оптимизатор СУБД имеют уникальные возможности для решения вопроса о вспомогательных структурах данных, как и в случае с индексами.
Это не риторический вопрос, я действительно хочу знать, есть ли интересные технические (или исторические) причины.