Как сохранить древовидную структуру в 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 описаны два метода.
Мой любимый путь - материализованный, очень простой и способный.
Надеюсь, поможет.