DataBase(datamodel)构建文件夹结构

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)

可以随机添加新文件夹.文件夹可以重命名.文件夹可以删除.

我的问题是:

这些文件夹详细信息将如何存储在数据库中?

同样,我正在寻找一种快速有效的方法来存储和检索这些信息.

Dil*_*nga 6

这是一个很好的问题,但没有很多细节,很难谈论"最佳"解决方案.

您可以将此映射到关于如何在关系数据库中存储n元树的抽象问题.

以下是一些影响问题的变量:

  1. 目录结构的总大小是多少?
  2. 有多少个单独的VM对结构执行写操作?
  3. 移动操作是否频繁?
  4. 整个子树的错误是一个重要的操作吗?
  5. 您的数据库是否支持树行走,或者您是否需要适用于任何合理关系数据库的解决方案?

以下假设您的数据库没有执行树遍历的特殊规定.

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.


Adr*_*hum 5

对于存储在数据库中,最简单,最直接的方法是为每个文件夹/节点都有一个parent_folder_id。在大多数情况下,这应该已经足够好了,特别是您将要构造文件夹对象结构并根据对象模型进行操作。

根据您的要求,有一种很常见的情况,您需要

  1. 找出特定文件夹下的所有子文件夹
  2. 通过SQL直接从数据库执行查找。

如果您要查找的是一种有趣的方法,则可以看看:每个数据库记录将有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)
  • 每个父节点的LEFT =第一个孩子的LEFT-1,而RIGHT =最后一个孩子的RIGHT + 1
  • 叶节点的LEFT和RIGHT为2个连续数字
  • 每个节点的LEFT应该是=上一个兄弟的LEFT + 1,RIGHT =下一个兄弟的LEFT-1

当您需要通过SQL查找特定节点(N)下的所有节点时,只需找出LEFT> N.LEFT并且RIGHT <N.RIGHT的所有节点

您可以通过批量更新相关节点来轻松地执行插入/删除操作(这不是一件容易的事,将其留给您:P)

这可能不是非常友好的面向对象,但是如果我提到的要求是您所需要的,则您可以考虑使用此方法。