gpt4 book ai didi

materialized-path-pattern - 为物化路径树结构生成路径模式的最佳方法

转载 作者:行者123 更新时间:2023-12-04 08:44:30 28 4
gpt4 key购买 nike

浏览整个网络中的示例,我可以看到人们使用诸如“ 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?中所解释的,对tree_id使用零填充使按创建顺序对其进行排序变得容易。

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


使用这样的固定长度字符串还可以使我轻松计算级别-length(tree_id)/ 5。我担心的是它将限制我最多9999个用户,而不是每个分支9999个用户。我在这里吗?

9999  | Tar | 0001.9999
10000 | Tor | 0001.??

最佳答案

您是正确的-每个节点ID零填充将使您非常简单地对整个树进行排序。但是,您必须使填充宽度与ID字段的数字上限匹配,如您在上一个示例中所指出的。例如,如果您使用int unsigned字段作为ID,则最大值为4,294,967,295。这是十位数字,这意味着您上一个示例中的记录集可能看起来像:

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字段必须填充为一定的长度(不幸的是,在您的示例中,每个名称似乎都是三个字符长),并且会占用很多空间。

总而言之,鉴于上述问题,我发现进行这种排序的最通用的方法是在您的应用程序逻辑中简单地执行此操作-例如,使用构建嵌套数组的递归函数对每个子级进行排序节点。

关于materialized-path-pattern - 为物化路径树结构生成路径模式的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020356/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com