我有一个需要存储在数据库中的文件夹结构。每个文件夹都有其父文件夹的名称、主键和外键。所以一个文件夹可以有子文件夹。
我遇到的问题是当用户想要向上或向下移动或添加新的子文件夹(添加子文件夹添加在树的末尾)并且我想记录子文件夹的顺序时。
如何在表格中记录用户订购?
因此,如果我在 A 下(按该顺序)有子文件夹 B、C 和 D,并且我将 D 向上移动,那么顺序是 B、D,然后是 C。您如何在数据库中反映这一点?
我有一个需要存储在数据库中的文件夹结构。每个文件夹都有其父文件夹的名称、主键和外键。所以一个文件夹可以有子文件夹。
我遇到的问题是当用户想要向上或向下移动或添加新的子文件夹(添加子文件夹添加在树的末尾)并且我想记录子文件夹的顺序时。
如何在表格中记录用户订购?
因此,如果我在 A 下(按该顺序)有子文件夹 B、C 和 D,并且我将 D 向上移动,那么顺序是 B、D,然后是 C。您如何在数据库中反映这一点?
如果您正在寻找创建子层次结构,您可以应用带有整数的 order by 子句进行排序。例如
ID, ParentID, SortOrder, Name
哪里SortOrder
是 0 和 foldercount-1 之间的整数,然后只需应用
ORDER BY SortOrder ASC
我还建议您在表中添加一个 Lineage 和 Depth 字段,这样您就可以轻松地更快地上下遍历树,而无需进行昂贵的查询。看看这篇文章。
有另一种方法可以将层次结构保存在一个表中,称为嵌套集。该模型允许通过交替树的价格更快地查询子节点或父节点。
考虑表
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
也许您正在寻找的是分层查询。这使您能够自动对分层表进行深度优先查询,并在层次结构的任何级别上定义排序顺序(以便对每个文件夹进行排序,但在每个项目之后,您将在获得下一个项目之前获得其子项目该文件夹中的项目)。
你考虑过HierarchyID
数据类型吗?