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

问题描述 投票:0回答:1

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

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

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

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

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

我还考虑过将整个树转储为一个深度嵌套的 JSON,但数据太大,无法成为 Mongo 文档。 GridFS 可用于存储它,但随后我会在 Web 应用程序中加载整个树,即使深层节点可能不感兴趣。

database mongodb data-structures tree bigdata
1个回答
5
投票

鉴于您的要求:

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

我会考虑以下内容。

以这个目录为例

C:\
C:\X\
C:\X\B\
C:\X\file.txt

在 JSON 中,它可能表示为:

{
    "C:": {
        "X": {
            "B": {},
            "file.txt": "file information..."
        }
    }
}

正如您所指出的,后者不能很好地适应大型目录结构。前者虽然类似于一些实际的文件系统并且在正确的上下文中高效,但与 JSON 相比使用起来很痛苦。

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

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

[
    {
        "id": "00000000-0000-0000-0000-000000000000",
        "type": "d",
        "name": "C:",
        "children": [
            "11111111-1111-1111-1111-111111111111"
        ]
    },
    {
        "id": "11111111-1111-1111-1111-111111111111",
        "type": "d",
        "name": "X",
        "children": [
            "33333333-3333-3333-3333-333333333333",
            "55555555-5555-5555-5555-555555555555"
        ]
    },
    {
        "id": "33333333-3333-3333-3333-333333333333",
        "type": "d",
        "name": "B",
        "children": []
    },
    {
        "id": "55555555-5555-5555-5555-555555555555",
        "type": "f",
        "name": "file.txt",
        "size": "1024"
    }
]

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

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

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

要点:tree_docs_cluster.js

© www.soinside.com 2019 - 2024. All rights reserved.