1

我有一个需要存储在数据库中的文件夹结构。每个文件夹都有其父文件夹的名称、主键和外键。所以一个文件夹可以有子文件夹。

我遇到的问题是当用户想要向上或向下移动或添加新的子文件夹(添加子文件夹添加在树的末尾)并且我想记录子文件夹的顺序时。

如何在表格中记录用户订购?

因此,如果我在 A 下(按该顺序)有子文件夹 B、C 和 D,并且我将 D 向上移动,那么顺序是 B、D,然后是 C。您如何在数据库中反映这一点?

4

4 回答 4

2

如果您正在寻找创建子层次结构,您可以应用带有整数的 order by 子句进行排序。例如

ID, ParentID, SortOrder, Name

哪里SortOrder是 0 和 foldercount-1 之间的整数,然后只需应用

ORDER BY SortOrder ASC

我还建议您在表中添加一个 Lineage 和 Depth 字段,这样您就可以轻松地更快地上下遍历树,而无需进行昂贵的查询。看看这篇文章

于 2012-07-27T14:53:53.030 回答
2

有另一种方法可以将层次结构保存在一个表中,称为嵌套集。该模型允许通过交替树的价格更快地查询子节点或父节点。

考虑表

id    left    right    node

0     0       9        root node
1     1       4        left node
2     5       8        right node
3     2       3        left sub node

.... ETC

为了得到节点 N 的所有父节点,我们需要找到 (left-i; right-i) 将包含集合 (letf-N; right-N) 的所有记录

为了获取节点 N 的所有子节点,您需要找到 (left-i; right-i) 包含在 (left-N; right-N) 中的所有记录

因此嵌套集模型允许在没有递归的情况下进行简单的分层查询。

这是关于嵌套集模型的wiki

于 2012-07-27T14:56:20.547 回答
0

也许您正在寻找的是分层查询。这使您能够自动对分层表进行深度优先查询,并在层次结构的任何级别上定义排序顺序(以便对每个文件夹进行排序,但在每个项目之后,您将在获得下一个项目之前获得其子项目该文件夹中的项目)。

于 2012-07-27T15:00:28.217 回答
0

你考虑过HierarchyID数据类型吗?

http://msdn.microsoft.com/en-us/library/bb677290

请参阅http://msdn.microsoft.com/en-us/magazine/cc794278.aspx

于 2012-07-27T14:58:02.907 回答