Database 存储文件夹系统的数据库模式选择

Database 存储文件夹系统的数据库模式选择,database,database-design,sqlite,schema,Database,Database Design,Sqlite,Schema,我正在尝试实现一个基于SQLite的数据库,它可以存储一个100GB文件夹的完整结构和一个复杂的子结构(需要50-100K文件)。数据库的主要目的是快速查询该文件夹的各个方面(总大小、任何文件夹的大小、文件夹的历史记录及其所有内容等) 然而,我意识到,如果我只是用一个parent_directory字段创建一个“file”表,那么在没有递归查询的情况下,查找文件夹中的所有文件(包括其所有子文件夹)是不可能的。我认为这是我的代码中最重要的特性之一,所以我考虑了下面的两个模式选项,如下图所示。 在模

我正在尝试实现一个基于SQLite的数据库,它可以存储一个100GB文件夹的完整结构和一个复杂的子结构(需要50-100K文件)。数据库的主要目的是快速查询该文件夹的各个方面(总大小、任何文件夹的大小、文件夹的历史记录及其所有内容等)

然而,我意识到,如果我只是用一个parent_directory字段创建一个“file”表,那么在没有递归查询的情况下,查找文件夹中的所有文件(包括其所有子文件夹)是不可能的。我认为这是我的代码中最重要的特性之一,所以我考虑了下面的两个模式选项,如下图所示。

  • 在模式1中,我将所有文件名存储在一个表中,将目录名存储在另一个表中。它们都有一个“parentdir”项,但也有一个名为“FullPath”的文本(显然text/blob在sqlite中是相同的)字段,该字段将保存从根目录到特定文件/目录的整个路径(如/etc/abc/def/wow/longpath/test.txt)。我并没有假设子文件夹的最大限制,所以理论上这个字段最多允许30K个字符。我的想法是,如果我想要所有的文件或目录属于任何一个父级,我只需在这个字段中查询父级的完整路径,并获取文件ID

  • 在模式2中,我分别在目录和文件表中只存储文件名、fileid和dirname、dirid。但是在第三个名为“祖先”的表中,我为每个文件存储了它的祖先目录的一组条目(因此在上面的示例中,test.txt将有5个条目,分别指向文件夹等的dirid、abc、def、wow和longpath)。然后,如果我想要任何文件夹的完整内容,我只需在这个表中查找DirID并获取所有fileid

  • 我可以看到,在模式1中,主要限制可能是对可变长度文本列的全文搜索,而在模式2中,主要限制是,我可能必须为深埋在100个目录或其他目录中的文件添加大量条目

    这些解决方案中最好的是什么?有没有我没有想到的更好的解决办法

  • 您的第一个模式将很好地工作。 在
    FullPath
    列上放置索引时,请使用区分大小写的
    BETWEEN
    运算符进行查询,或在索引上或使用
    LIKE

    请注意,此模式还存储所有父项,但ID(名称)都连接到一个值中

    重命名目录需要更新其所有子树条目,但您提到了历史记录,因此旧条目可能保持不变

  • 您的第二个模式本质上是Dan D的评论中提到的模式。 注意不要忘记深度0的条目

    这将存储大量数据,但作为ID,值不应太大

    (您实际上不需要
    关系ID
    ,是吗?)

  • 存储树的另一种选择是,或类似的嵌套区间模型。 嵌套集模型允许通过查询时间间隔来检索子树,但是更新很麻烦。 嵌套区间模型使用分数,分数不是本机数据类型,因此无法编制索引

  • 我估计第一种选择最容易使用。
    如果查找被正确索引,我也不会比其他人慢。

    我个人最喜欢的方法是这种方法,我认为它对您特别有用,因为它使对记录及其后代运行聚合查询变得非常容易。

    您可能会感兴趣,这正是我想要的!因此,我展示的第二个解决方案与他描述的有点类似,但他也描述了非常优雅的触发器,可以在没有任何外部代码清理的情况下保持所有数据完全正常!我想我会同意那个设计!感谢您对这3个想法的详细描述!事实上,我认为我会使用闭包表,它会让人感觉更加优雅,数据应该如何真正存在于数据库中(DirtSimple链接有一个看起来非常酷的触发器,它可以在数据库中完成所有的簿记工作,尽管我会花一些时间仔细思考)。虽然firs的想法看起来也不错,但我只是对字符串操作感到有点厌倦,觉得另一个选择可能更酷。不过我可能会做一些测试,空间也是我的一个限制,必须添加RelationshipID,因为MS Access不允许我创建没有主键的表,我发现它是创建关系图的最简单工具:)该表的“正确”主键应该是
    DirID
    FileID
    @CL的组合。你读过这两个吗塞尔科(2012年)-完全值得电子阅读器的价格-或(2012年)。它们都不会使更新在嵌套模型中看起来“毛茸茸的”。当我考虑实现这个设计时,是什么使得模型需要更新?只是需要额外的注意和思考吗?@Thomas“重新安排树的结构是很棘手的,因为计算(lft,rgt)嵌套集数需要在一棵大树上学习一点代数。”如果你有这本书,这会更容易。:)