![]() |
1
17
在数据库中存储树是一个有许多不同解决方案的主题。这取决于你是否也想检索一个子层次结构(即项目X的所有子级),或者你是否只想获取整个层次结构集,并使用字典在内存中以O(n)的方式构建树。 您的表的优点是,通过对父帖子进行过滤,您可以一次性获取帖子的所有评论。由于您以教科书/天真的方式定义了评论的父级,因此必须在内存中构建树(见下文)。如果你想从数据库中获取树,你需要一种不同的方式来存储树: 请参阅我对基于预计算的方法的描述: http://www.llblgen.com/tinyforum/GotoMessage.aspx?MessageID=17746&ThreadID=3208 或通过 using balanced trees described by CELKO here : 或另一种方法: http://www.sqlteam.com/article/more-trees-hierarchies-in-sql 如果你在内存中获取层次结构中的所有内容并在那里构建树,那么由于查询非常简单:select,因此效率会更高。.from注释,其中ParentPost=@id ORDER BY ParentComment ASC 在该查询之后,您只需使用一个字典在内存中构建树,该字典跟踪元组CommentID-Comment。现在,您遍历结果集并动态构建树:您遇到的每个注释,都可以在字典中查找其父注释,然后将当前处理的注释也存储在该字典中。 |
![]() |
2
7
ltree PostgreSQL的模块。它应该使涉及树部分的数据库操作更快一些。它基本上允许您在表中设置一个字段,如下所示:
然而,它本身并不能确保任何形式的引用完整性。换言之,你可以拥有“Top.Science.Astronomy”的记录,而无需拥有“Top.Science”或“Top”的记录。但它让你做的是这样的事情:
或
如果结合使用存储过程的传统“comment_id”/“parent_id”方法,我认为你可以两全其美。您可以使用您的“路径”快速遍历数据库中的注释树,并且仍然可以通过“comment_id”/“parent_id”确保引用完整性。我设想的是:
注释的路径字符串如下
因此,comment_id为“1”的线程“102”的根注释的路径为:
不过我不知道——这可能会增加不必要的开销。另外,我不知道ltree保养得有多好。 |
![]() |
3
5
您当前的设计对于小层次结构(少于1000个项目)基本上是合适的 如果你想在某个级别或深度上获取,请在你的结构中添加一个“级别”项,并将其作为保存的一部分进行计算 如果性能有问题,请使用体面的缓存 |
![]() |
4
4
./亚历克斯 |
![]() |
Sweepy Dodo · JSON lite的格式化 8 月前 |
![]() |
giantjenga · 优化整数向量到二进制向量的转换 10 月前 |
![]() |
Zegarek · Postgresql递归查询未提供预期结果 10 月前 |
![]() |
Joe · 为什么这两个查询之间的性能存在如此大的差异? 1 年前 |
![]() |
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 1 年前 |