Как сохранить древовидную структуру в sql?

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

BEGIN;
CREATE TABLE "tree_comment" 
    ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
     "text" text NOT NULL, 
     "parent_id" integer NULL REFERENCES "tree_comment" ("id"));
CREATE INDEX "tree_comment_6be37982" ON "tree_comment" ("parent_id");

COMMIT;

3 ответа

Ваш пример - это правильный способ представления иерархических данных в реляционной базе данных. Вы должны использовать Рекурсивные Общие Табличные Выражения (R CTE) для запроса таблицы.

В прошлом вы должны были использовать Nested Set или Materialized Path, но R CTE был специально создан для исправления их недостатков, так что используйте его.

SQLite поддерживает Recursive CTE и является частью стандарта SQL:1999.

Вот пример запроса:

http://blog.databasepatterns.com/2014/02/trees-paths-recursive-cte-postgresql.html

Да, обычный способ представления дерева в реляционной базе данных такой же, как вы делали это в своем примере: пусть каждый узел в дереве имеет идентификатор и parent_ID. Создайте индексы для быстрого поиска.

Проблема с деревьями в RDB заключается не в их создании, а в их эффективном извлечении. В стандартном SQL нет запроса, который бы извлекал все дерево или поддерево. Вы должны написать цикл.

Поскольку структура данных не имеет естественного представления в реляционных базах данных, существует несколько способов их хранения в зависимости от варианта использования и базы данных.

В этой презентации со слайда 48 описаны два метода.

Мой любимый путь - материализованный, очень простой и способный.

Надеюсь, поможет.

Другие вопросы по тегам