【问题标题】:Modeling a fixed-depth tree in SQL在 SQL 中建模固定深度的树
【发布时间】:2017-06-11 21:51:45
【问题描述】:

我正在创建一个 SQL 模式来表示树状层次结构,但我知道这棵树的深度永远不会超过 N 级(其中 N 在应用程序设计时已知,很可能大约是 4 或 5)。

如果这棵树的深度是固定的,那么通过将树的每一层建模为一个表格来设计应用程序会更好吗?还是以任意深度来处理它会更好(例如邻接列表或嵌套集)?

我纯粹是从可查询性的角度来问的,例如报告树的各个级别。

【问题讨论】:

    标签: sql postgresql database-design tree


    【解决方案1】:

    使用具有众所周知的分层结构(node_id, parent_id) 和附加列depth 的单个表。该列理论上是多余的,但在查询特定树级别时非常有用。当然,这样的结构可以很容易地使用递归查询从上到下(反之亦然)遍历树。

    create table a_tree(
        node_id int primary key, 
        parent_id int, 
        depth int
    --  other columns
    );
    

    作为奖励,您可以在 SO 上为此类表找到许多现成的解决方案。

    【讨论】:

    • 如果我知道树的深度永远不会增长,是否有任何查询 缺点 使用单个表与 5 个表?
    • 您仍然可以使用单个表并只需将其连接 5 次,而不是使用 5 个表。不过,根据我自己的经验,它可能会在未来增长,这种方法让您可以使用 WITH RECURSIVE 查询进行扩展,并为您节省磁盘空间。
    • @J3Y - 相反,我发现使用多个表而不是一个表会带来很多不便。例如,考虑定义应该影响您的数据的视图、函数、触发器等。
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多