如何最好地将目录树存储在数据库中?

duf*_*far 5 tree database-design

我想以某种格式表示我的目录结构(目前我只是使用 JSON。)

这是示例 JSON 的外观。对于那些好奇的人,它是使用 unix tree 命令生成的:tree /path/to/folder -J --noreport -h.

{
    ...
    "type":"directory",
    "name":"dev",
    "size":4096,
    "contents":[
        {"type":"directory","name":"protocols","size":4096, "contents":[]},
        {"type":"file","name":"architecture.txt","size":4716},
        {"type":"file","name":"exceptions.py","size":31263},
        {"type":"file","name":"models.js","size":101882},
        {"type":"file","name":"proxy.cpp","size":29097},
        {"type":"file","name":"keylogfile.xyz","size":7889},
        {"type":"file","name":"Readme.txt","size":8857},
    ]
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以这只是将某些路径的整个文件夹结构表示为 JSON。

我可以有许多这样的单独 JSON 文件,每个文件代表一个目录树。这些文件之间没有关联/链接。

在标准 Windows“C:\”分区上运行 tree 命令时,我得到一个大约 30 MB 的 JSON 文件。所以我认为我们可以假设用户上传的最大文件大小约为 100 MB。


存储文件后,这些是我计划对文件进行的操作:

  1. 获取整个文件。
  2. 给定一条路径,获取它的直接子项(类似于ls在这条路径上做的事情。)
  3. 给定路径,获取路径的完整子树。
  4. 修改某个项目的元数据,比如更改其名称或添加新的名称note

2 和 3 是我最希望发生的操作。


以下是我提出的存储这些数据的方法:

  1. 没有数据库:

    • 将文件按原样存储在磁盘 ( /home/forest/<uuid>.json)
    • 操作 1 变得快速而简单 - 只需发送整个文件
    • 但其他的可能会变慢,因为它们都涉及首先解析整个 JSON,然后对其进行迭代。
  2. 没有 SQL

    • 我以前从未使用过任何 SQL 数据库(只阅读了一些关于它们的用例等的帖子)
    • 我认为 op 1(读取整个文件)会很快
    • 但不知道与仅使用文件相比,其他操作是否会有任何改进。
  3. 关系型数据库管理系统

    • 我以前使用过关系数据库,但不认为我的数据与表有任何关系
    • 不过我用谷歌搜索了一下,发现 postgres 有一种ltree存储分层数据的类型,但我不确定这是否是我需要的。
      • 如果是,我将如何获取数据?
  4. 图数据库?

    • 同样,之前没有这些经验,只是在黑暗中拍摄
    • 归根结底,目录只是一棵树
    • 而不是创建一个普通的 JSON,也许我可以生成一个 Graph DB 可以读入的格式

    • 一旦我有了一些图形数据库对象,也许所有的操作都会变得足够快。


我的问题是:对于我的用例,存储数据的最佳方式是什么?


回复评论。

为什么你认为你需要一个数据库呢?

根据您尝试执行的操作,您可能根本不需要将数据存储在 db 中。

老实说,我不知道我是否需要数据库,我知道我希望这些数据以一种允许我相当快地执行上述定义的操作的格式存储。

你想通过将它放入数据库来实现什么?报告?分析?它会被应用程序使用吗?

我正在为 Web 应用程序执行此操作。一旦数据以我满意的方式存储,我计划创建一个 Web API(可能基于 JSON)来执行我上面列出的操作。数据将发送到客户端,并以某种方式显示在前端。

你想要每个文件 1 行吗?您还想存储哪些其他元数据?尺寸?日期?文件所有者?

是的,我想要通常与文件相关联的元数据。


一个朋友问这个,所以我在这里清理它:我不只有 1 个 JSON 文件(代表一棵树)。我可以有 n 个这样的树(它们基本上是由用户上传的,我希望它们的大小小于 100 MB。)

小智 1

我也是一个数据库菜鸟,我记得 postresql 有 json 数据类型来存储 JSON 结构。也许您可以查看postgresql 文档并决定它是否适合您。