代码之家  ›  专栏  ›  技术社区  ›  k4ml

生成物化路径树结构路径模式的最佳方法

  •  3
  • k4ml  · 技术社区  · 15 年前

    浏览整个网络上的例子,我可以看到人们使用类似“parent-id.node-id”的东西生成路径。示例:-

    uid | name | tree_id
    --------------------
     1  | Ali  |   1.
     2  | Abu  |   2.
     3  | Ita  |   1.3.
     4  | Ira  |   1.3.
     5  | Yui  |   1.3.4
    

    但正如这个问题所解释的- Sorting tree with a materialized path? ,使用树id的零填充可以方便地按创建顺序对其排序。

    uid | name | tree_id
    --------------------
     1  | Ali  |   0001.
     2  | Abu  |   0002.
     3  | Ita  |   0001.0003.
     4  | Ira  |   0001.0003.
     5  | Yui  |   0001.0003.0004
    

    像这样使用固定长度的字符串也使我很容易计算级别长度(tree_id)/5。我担心的是它会限制我最多9999个用户,而不是每个分支9999个。我就在这里吗?

    9999  | Tar | 0001.9999
    10000 | Tor | 0001.??
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    您是正确的——对每个节点ID进行零填充将允许您对整个树进行非常简单的排序。但是,您必须使填充宽度与ID字段的数字上限匹配,正如您在上一个示例中指出的那样。E、 如果你用的是 int unsigned 字段中,您的ID的最大值为4294967295。这是10位数字,这意味着上一个示例中的记录集可能如下所示:

    uid   | name | tree_id
    9999  | Tar  | 0000000001.0000009999
    10000 | Tor  | 0000000001.0000010000
    

    只要你知道你不需要把你的ID字段改成 bigint unsigned 在未来,这将继续工作,尽管这可能是一个有点数据饥渴取决于您的表有多大。通过将值存储为十六进制,可以减少每个节点ID的两个字节,十六进制值仍将以字符串排序的方式正确排序:

    uid   | name | tree_id
    9999  | Tar  | 00000001.0000270F
    10000 | Tor  | 00000001.00002710
    

    不过,我可以想象,当尝试更新路径(修剪节点等)时,这会让事情变得非常头疼。

    您还可以创建用于排序的额外字段,例如:

    uid   | name | tree_id           | name_sort
    9999  | Tar  | 00000001.0000270F | Ali.Tar
    10000 | Tor  | 00000001.00002710 | Ali.Tor
    

    但是,有一些限制,如 this guy's answer to a similar materialized path sorting question . 这个 name 字段必须填充到一个设置的长度(幸运的是,在您的示例中,每个名称似乎都有三个字符长),这将占用大量空间。

    总之,考虑到上述问题,我发现最通用的排序方法是在应用程序逻辑中简单地进行排序——比如,使用递归函数构建嵌套数组,对每个节点的子节点进行排序。

    推荐文章