ken*_*ohn 5 java directory algorithm
计划在Java中构建基于文件夹的结构.
我将使用jquery插件用于GUI,因此我不需要有关如何显示文件夹结构的信息.
我正在寻找关于如何存储文件夹信息的后端逻辑,以便可以快速有效地检索它.
每个文件夹都有多个子文件夹.从叶文件夹,我们应该能够快速有效地访问根
例:
+Folder1
|__SubFolder1_1
|__SubFolder1_2
|_SubSubFolder1_2_1
|_
+Folder2
|__SubFolder2_1
|_SubFolder2_1_1
|_SubFolder2_1_2
|_SubFolder2_1_2_1
Run Code Online (Sandbox Code Playgroud)
可以随机添加新文件夹.文件夹可以重命名.文件夹可以删除.
我的问题是:
这些文件夹详细信息将如何存储在数据库中?
同样,我正在寻找一种快速有效的方法来存储和检索这些信息.
这是一个很好的问题,但没有很多细节,很难谈论"最佳"解决方案.
您可以将此映射到关于如何在关系数据库中存储n元树的抽象问题.
以下是一些影响问题的变量:
以下假设您的数据库没有执行树遍历的特殊规定.
n-ary树有两种纯持久性模型.
第一种是简单地用父引用写每个节点:
| NodeId | ParentId | Name | ....
|--------|----------|------------|-----
Run Code Online (Sandbox Code Playgroud)
这种方法简化了文件夹的移动,但删除了对所有嵌套子文件夹的查询,并且查找根目录变得昂贵.
第二个纯模型是将每个祖先关系与文件夹细节分开
| NodeId | Name | ....
|--------|----------|------
...
| NodeId | AncestorId | Distance |
|--------|------------|----------|
...
Run Code Online (Sandbox Code Playgroud)
这里,文件夹/食品/乳制品/奶酪/切达干酪会产生
| NodeId | Name |
|--------|----------|
| #0 | (root) |
| #1 | food |
| #2 | dairy |
| #3 | cheese |
| #4 | cheddar |
| NodeId | AncestorId | Distance |
|--------|------------|----------|
| #1 | #0 | 1 |
| #2 | #0 | 2 |
| #2 | #1 | 1 |
| #3 | #0 | 3 |
| #3 | #1 | 2 |
| #3 | #2 | 1 |
| #4 | #0 | 4 |
| #4 | #1 | 3 |
| #4 | #2 | 2 |
| #4 | #3 | 1 |
Run Code Online (Sandbox Code Playgroud)
这种方法对于移动而言非常昂贵,并且新目录会导致d
插入,其中d
是与根的距离.但是子树列表是单个查询.祖先路径也是单个查询; 一个order by Distance desc
将让你快速到达根和第一个文件夹.
但是勉强阅读你的问题,第一种方法的一种变体,简单地添加root也可能是适合你的方法:
| NodeId | ParentId | RootId | Name | ....
|--------|----------|--------|------------|-----
Run Code Online (Sandbox Code Playgroud)
请注意,移动文件夹会很昂贵,因为您需要确定所有嵌套的子文件夹,并更新所有这些记录的RootId.
对于存储在数据库中,最简单,最直接的方法是为每个文件夹/节点都有一个parent_folder_id。在大多数情况下,这应该已经足够好了,特别是您将要构造文件夹对象结构并根据对象模型进行操作。
根据您的要求,有一种很常见的情况,您需要
如果您要查找的是一种有趣的方法,则可以看看:每个数据库记录将有2个额外的数字字段,我们将其称为LEFT和RIGHT
假设这样的树:
ROOT
+ A
| + A1
| + A2
+ B
+ B1
Run Code Online (Sandbox Code Playgroud)
将要存储在数据库中的是
Node LEFT RIGHT ... other fields
ROOT 1 12
A 2 7
A1 3 4
A2 5 6
B 8 11
B1 9 10
Run Code Online (Sandbox Code Playgroud)
当您需要通过SQL查找特定节点(N)下的所有节点时,只需找出LEFT> N.LEFT并且RIGHT <N.RIGHT的所有节点
您可以通过批量更新相关节点来轻松地执行插入/删除操作(这不是一件容易的事,将其留给您:P)
这可能不是非常友好的面向对象,但是如果我提到的要求是您所需要的,则您可以考虑使用此方法。