计划在Java中构建基于文件夹的结构。
我将为GUI使用jquery插件,因此我不需要有关如何显示文件夹结构的信息。
我正在寻找关于如何存储文件夹信息的后端逻辑,以便可以快速有效地检索它。
每个文件夹都有多个子文件夹。 从叶文件夹,我们应该能够快速有效地访问根
示例:
+Folder1
|__SubFolder1_1
|__SubFolder1_2
|_SubSubFolder1_2_1
|_
+Folder2
|__SubFolder2_1
|_SubFolder2_1_1
|_SubFolder2_1_2
|_SubFolder2_1_2_1
可以随机添加新文件夹。 文件夹可以重命名。 文件夹可以删除。
我的问题是:
这些文件夹详细信息将如何存储在数据库中?
同样,我正在寻找一种快速有效的方法来存储和检索这些信息。
答案 0 :(得分:6)
这是一个很好的问题,但如果没有很多细节,很难谈论“最佳”解决方案。
您可以将此映射到关于如何在关系数据库中存储n元树的抽象问题。
以下是影响问题的一些变量:
以下假设您的数据库没有执行树遍历的特殊规定。
n-ary树有两种纯持久性模型。
第一种是简单地用父引用编写每个节点:
| NodeId | ParentId | Name | ....
|--------|----------|------------|-----
此方法简化了文件夹的移动,但删除了所有嵌套子文件夹的查询并查找根目录变得昂贵。
第二个纯模型是将每个祖先关系与文件夹细节分开来保存
| NodeId | Name | ....
|--------|----------|------
...
| NodeId | AncestorId | Distance |
|--------|------------|----------|
...
这里,文件夹/食品/乳制品/奶酪/切达干酪会产生
| 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 |
此方法对于移动而言非常昂贵,并且新目录会导致d
插入,其中d
是与根的距离。但是子树列表是单个查询。祖先路径也是单个查询; order by Distance desc
将允许您快速访问根目录和第一个文件夹。
但是勉强阅读你的问题,第一种方法的变体,简单地添加root也可能是适合你的方法:
| NodeId | ParentId | RootId | Name | ....
|--------|----------|--------|------------|-----
请注意,移动文件夹会很昂贵,因为您需要确定所有嵌套的子文件夹,并更新所有这些记录的RootId。
答案 1 :(得分:4)
对于在DB中存储,最简单和最直接的方法是为每个文件夹/节点设置parent_folder_id。在大多数情况下,这应该足够好了,特别是你要构建文件夹对象结构并根据对象模型进行操作。
取决于您的要求,您需要
这是一个非常常见的案例如果它正是您所寻找的,那么您可以看一下有趣的方法: 每个DB记录将有2个额外的数字字段,我们称之为LEFT和RIGHT
假设这样一棵树:
ROOT
+ A
| + A1
| + A2
+ B
+ B1
将要存储在DB中的是
Node LEFT RIGHT ... other fields
ROOT 1 12
A 2 7
A1 3 4
A2 5 6
B 8 11
B1 9 10
当您需要通过SQL查找特定节点(N)下的所有节点时,只需找到LEFT>的所有节点。 N.LEFT和RIGHT< N.RIGHT
您可以通过批量更新相关节点轻松执行插入/删除(不是一项艰巨的任务,请留给您:P)
这可能不是非常友好,但如果我提到的要求是你需要的,你可以考虑使用这种方法。
答案 2 :(得分:1)
Linked List,在此处记录在Java API中:
http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html
作为一般的计算机科学结构,请阅读:
http://en.wikipedia.org/wiki/Linked_list
我希望它有所帮助
答案 3 :(得分:1)
对于数据库,请保持简单。一个名为folder的表 - 唯一的列是Id,Name,ParentId。现在每个文件夹都有一个父文件夹,有些文件夹会有子文件夹。加载儿童:
SELECT * FROM Folder WHERE Id == ParentFolderId