在数据库中存储深层目录树

Kfi*_*ods 5 database tree bigdata mongodb data-structures

我正在开发一个桌面应用程序,它很像WinDirStat或voidtools'Everything - 它映射硬盘驱动器,即从目录树中创建一个深层嵌套的字典.

然后,桌面应用程序应将目录树存储在某种数据库中,以便可以使用Web应用程序从根目录深度级别浏览它们.

假设两个应用程序暂时在同一台机器上本地运行.

我想到的问题是如何构建数据以及应该使用什么数据库,考虑:1)RAM消耗应该合理2)准备好在Web应用程序中查看目录所需的时间应该是最小

PS - 我的初始方法是将每个文件系统节点分别序列化为JSON并将每个节点插入到Mongo中,并将对象引用链接到它们的子节点.这样,Web应用程序可以根据用户需求轻松加载数据.但是,我担心为Mongo制作这么多(平均一百万个)独立插件需要花费很多时间; 如果我进行批量插入,这意味着我必须将每个批量保留在内存中.

我还考虑将整个树转储为一个深度嵌套的JSON,但数据太大而不能成为Mongo文档.GridFS可以用来存储它,但是我会在web应用程序中加载整个树,即使深层节点可能不感兴趣.

Ric*_*unn 5

鉴于您的要求:

  • A) 内存使用率低
  • B) 满足 Mongo 中的文件大小限制
  • C) 响应式用户界面

我会考虑以下内容。

以这个目录为例

C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js
Run Code Online (Sandbox Code Playgroud)

在 JSON 中,它可能表示为:

C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js
Run Code Online (Sandbox Code Playgroud)

正如您所指出的,后者不能很好地适应大型目录结构(我可以直接告诉您,浏览器不会欣赏 JSON blob,即使它代表的是具有数千个文件/文件夹的适度目录)。前者虽然类似于一些实际的文件系统并且在正确的上下文中高效,但与 JSON 之间的转换是一件痛苦的事情。

我的建议是将每个目录分解为一个单独的 JSON 文档,因为这将解决所有三个问题,但是没有什么是免费的,这会增加代码复杂性、每个会话的请求数量等。

上述结构可以分解为以下文件:

{
    "C:": {
        "X": {
            "B": {},
            "file.txt": "file information..."
        },
        "Y": {
            "file.pdf": "file information...",
            "R": {
                "file.js": "file information..."
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其中每个文档代表一个目录或文件及其(如果是目录)其直接子 ID。子项可以使用其 ID 进行延迟加载,并在 UI 中附加到其父项。实施良好的延迟加载可以将子节点预加载到所需的深度,从而创建响应速度非常快的 UI。RAM 使用量极小,因为您的服务器只需处理每个请求的少量有效负载。与单文档方法相比,请求数量确实大幅增加,但同样,一些巧妙的延迟加载可以聚集请求并减少总数。

更新1:我在回答之前忽略了你的倒数第二段,所以这可能或多或少是你的想法。为了解决文档过多的问题,文档内的某种级别的集群节点可能是合适的。我现在得走了,但我会考虑一下。

更新 2:我创建了我提到的集群概念的简化版本的要点。它不考虑文件,只考虑文件夹,并且不包含更新文档的代码。希望它能给你一些想法,我会根据自己的目的继续更新它。

要点:tree_docs_cluster.js