DataBase(数据模型)构建文件夹结构

时间:2011-09-23 03:15:13

标签: java algorithm directory

计划在Java中构建基于文件夹的结构。

我将为GUI使用jquery插件,因此我不需要有关如何显示文件夹结构的信息。

我正在寻找关于如何存储文件夹信息的后端逻辑,以便可以快速有效地检索它。

每个文件夹都有多个子文件夹。 从叶文件夹,我们应该能够快速有效地访问根

示例:

+Folder1
  |__SubFolder1_1
  |__SubFolder1_2
        |_SubSubFolder1_2_1
        |_
+Folder2
  |__SubFolder2_1
        |_SubFolder2_1_1
        |_SubFolder2_1_2
             |_SubFolder2_1_2_1

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

我的问题是:

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

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

4 个答案:

答案 0 :(得分:6)

这是一个很好的问题,但如果没有很多细节,很难谈论“最佳”解决方案。

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

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

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

    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。在大多数情况下,这应该足够好了,特别是你要构建文件夹对象结构并根据对象模型进行操作。

取决于您的要求,您需要

这是一个非常常见的案例
  1. 找出特定文件夹
  2. 下的所有子文件夹
  3. 通过SQL直接从DB执行查找。
  4. 如果它正是您所寻找的,那么您可以看一下有趣的方法: 每个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
    
    • 每个父节点都有LEFT =第一个孩子的LEFT - 1,RIGHT =最后一个孩子的RIGHT + 1
    • 叶子节点将具有LEFT和RIGHT为2个连续数字
    • 每个节点的左边应该是=先前兄弟的右边+ 1,右边=下一个兄弟的左边 - 1

    当您需要通过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