Java 用于构建文件夹结构的数据库(datamodel)
计划在Java中构建基于文件夹的结构 我将为GUI使用jquery插件,因此我不需要关于如何显示文件夹结构的信息 我正在寻找关于如何存储文件夹信息的后端逻辑,以便能够快速高效地检索它 每个文件夹将有多个子文件夹。 从叶文件夹中,我们应该能够快速有效地访问根目录 例如:Java 用于构建文件夹结构的数据库(datamodel),java,algorithm,directory,Java,Algorithm,Directory,计划在Java中构建基于文件夹的结构 我将为GUI使用jquery插件,因此我不需要关于如何显示文件夹结构的信息 我正在寻找关于如何存储文件夹信息的后端逻辑,以便能够快速高效地检索它 每个文件夹将有多个子文件夹。 从叶文件夹中,我们应该能够快速有效地访问根目录 例如: +Folder1 |__SubFolder1_1 |__SubFolder1_2 |_SubSubFolder1_2_1 |_ +Folder2 |__SubFolder2_1
+Folder1
|__SubFolder1_1
|__SubFolder1_2
|_SubSubFolder1_2_1
|_
+Folder2
|__SubFolder2_1
|_SubFolder2_1_1
|_SubFolder2_1_2
|_SubFolder2_1_2_1
可以随机添加新文件夹。
文件夹可以重命名。
可以删除文件夹
我的问题是:这些文件夹详细信息如何存储在数据库中
同样,我正在寻找一种快速有效的方法来存储和检索这些信息 链表,在Java API中记录如下: 作为一般计算机科学结构,请阅读以下内容:
我希望它对数据库有所帮助,保持简单。名为folder的表-唯一的列是Id、Name、ParentId。现在,每个文件夹都将有一个父文件夹,有些文件夹将有子文件夹。要加载子对象,请执行以下操作:
SELECT * FROM Folder WHERE Id == ParentFolderId
对于在DB中存储,最简单、最直接的方法是为每个文件夹/节点设置一个父文件夹id。在大多数情况下,这应该足够好了,尤其是要构建文件夹对象结构并基于对象模型进行操作 根据您的需求,有一种非常常见的情况需要
ROOT
+ A
| + A1
| + A2
+ B
+ B1
数据库中要存储的内容是
Node LEFT RIGHT ... other fields
ROOT 1 12
A 2 7
A1 3 4
A2 5 6
B 8 11
B1 9 10
- 每个父节点的左=第一个子节点的左-1,右=最后一个子节点的右+1
- 叶节点的左侧和右侧为2个连续数字
- 每个节点的左边应该是=上一个同级的右边+1,右边=下一个同级的左边-1
这可能不是很友好,但是如果我提到的需求是你需要的,你可以考虑使用这个方法。
这是个好问题,但是没有很多细节,很难谈论“最好”的解决方案。 您可以将此映射到如何在关系数据库中存储n元树的抽象问题
以下是影响问题的一些变量:| NodeId | ParentId | Name | ....
|--------|----------|------------|-----
这种方法简化了文件夹的移动,但删除、查询所有嵌套的子文件夹和查找根目录会变得非常昂贵
第二个纯模型是将每个祖先关系与文件夹细节分开保存
| NodeId | Name | ....
|--------|----------|------
...
| NodeId | AncestorId | Distance |
|--------|------------|----------|
...
在这里,文件夹/food/dairy/cheese/cheddar将生成
| 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
是到根的距离。但子树列表是单个查询。祖先路径也是一个查询;通过距离描述的订单
可以让您快速找到根文件夹和第一个文件夹
但仔细阅读您的问题,这是第一种方法的一种变体,简单地添加root也可能是适合您的方法:
| NodeId | ParentId | RootId | Name | ....
|--------|----------|--------|------------|-----
请注意,移动文件夹会很昂贵,因为您需要确定所有嵌套的子文件夹,并更新所有记录的RootId。实际上更多的是一棵树,如“目录树”。@DaveNewton谢谢,但我正在寻找有关如何将信息存储在数据库中的信息(数据模型)所以我可以快速存储/检索数据。@kensenjohn是的,“快速”取决于您试图检索的方式/内容。从一片叶子快速访问根是什么意思?根目录,或该文件夹包含的文件夹?在任何情况下,似乎一个正常的家长id机制都会起作用,但如果不知道你在做什么样的操作,就很难说如何高效地完成它。你认为它需要多快?既然您提到jQuery,它听起来就像一个web应用程序。网络速度将使基于索引ID的DB查找相形见绌。谢谢,我将结合使用您的答案和@AdrianShum提供的答案。由于我将更多地使用阿德里安的答案,我将把他标记为正确答案