如何在sql中存储树结构?

时间:2015-04-17 04:17:15

标签: python sql database sqlite database-design

这是我使用sqlite的架构,我不确定这是否是在sql中创建树结构的好方法,因为我必须遍历很多时间来获取整个树,而不是基于顶层注释提取整个树基础并在python中构造树。有人可以给我一些建议。

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 个答案:

答案 0 :(得分:2)

您的示例是在关系数据库中表示分层数据的正确方法。您应该使用Recursive Common Table Expressions(R CTE)来查询表。

过去,您必须使用嵌套集或物化路径,但R CTE是专门用于修复其缺陷的,所以请使用它。

SQLite支持递归CTE,它是SQL:1999标准的一部分。

以下是一个示例查询:

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

答案 1 :(得分:0)

由于数据结构在关系数据库中没有自然表示,因此有几种方法可以根据用例和数据库来存储它们。

this presentation中,从幻灯片48开始,描述了两种方法。

我最喜欢的是materialized path,这非常简单且有能力。

希望它有所帮助。

答案 2 :(得分:0)

是的,在关系数据库中表示树的传统方法与在示例中一样:让树中的每个节点都有一个ID和一个parent_ID。在两者上创建索引以便快速检索。

RDB中树的问题不是创建它们,而是有效地检索它们。标准SQL中没有查询将检索整个树或子树。你必须写一个循环。