Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于构建文件夹结构的数据库(datamodel)_Java_Algorithm_Directory - Fatal编程技术网

Java 用于构建文件夹结构的数据库(datamodel)

Java 用于构建文件夹结构的数据库(datamodel),java,algorithm,directory,Java,Algorithm,Directory,计划在Java中构建基于文件夹的结构 我将为GUI使用jquery插件,因此我不需要关于如何显示文件夹结构的信息 我正在寻找关于如何存储文件夹信息的后端逻辑,以便能够快速高效地检索它 每个文件夹将有多个子文件夹。 从叶文件夹中,我们应该能够快速有效地访问根目录 例如: +Folder1 |__SubFolder1_1 |__SubFolder1_2 |_SubSubFolder1_2_1 |_ +Folder2 |__SubFolder2_1

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

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

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

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

例如:

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

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

  • 查找特定文件夹下的所有子文件夹
  • 通过SQL直接从数据库执行查找
  • 如果这是您正在寻找的,那么有一个有趣的方法,您可以看看: 每个DB记录将有2个额外的数字字段,我们将其称为LEFT和RIGHT

    假设这样一棵树:

    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
    当您需要通过SQL查找特定节点(N)下的所有节点时,只需查找LEFT>N.LEFT和RIGHT 通过批量更新相关节点,您可以轻松执行插入/删除(这不是一项困难的任务,留给您:p)


    这可能不是很友好,但是如果我提到的需求是你需要的,你可以考虑使用这个方法。

    这是个好问题,但是没有很多细节,很难谈论“最好”的解决方案。 您可以将此映射到如何在关系数据库中存储n元树的抽象问题

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

  • 目录结构的总大小是多少
  • 有多少独立的虚拟机执行对结构的写入
  • 搬家作业频繁吗
  • 破坏整个子树也是一项重要的操作吗
  • 您的数据库是否支持树漫游,或者您是否需要一个与任何合理的关系数据库一起工作的解决方案
  • 以下假设您的数据库没有执行树漫游的特殊规定

    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提供的答案。由于我将更多地使用阿德里安的答案,我将把他标记为正确答案