Database 存储文件夹系统的数据库模式选择
我正在尝试实现一个基于SQLite的数据库,它可以存储一个100GB文件夹的完整结构和一个复杂的子结构(需要50-100K文件)。数据库的主要目的是快速查询该文件夹的各个方面(总大小、任何文件夹的大小、文件夹的历史记录及其所有内容等) 然而,我意识到,如果我只是用一个parent_directory字段创建一个“file”表,那么在没有递归查询的情况下,查找文件夹中的所有文件(包括其所有子文件夹)是不可能的。我认为这是我的代码中最重要的特性之一,所以我考虑了下面的两个模式选项,如下图所示。Database 存储文件夹系统的数据库模式选择,database,database-design,sqlite,schema,Database,Database Design,Sqlite,Schema,我正在尝试实现一个基于SQLite的数据库,它可以存储一个100GB文件夹的完整结构和一个复杂的子结构(需要50-100K文件)。数据库的主要目的是快速查询该文件夹的各个方面(总大小、任何文件夹的大小、文件夹的历史记录及其所有内容等) 然而,我意识到,如果我只是用一个parent_directory字段创建一个“file”表,那么在没有递归查询的情况下,查找文件夹中的所有文件(包括其所有子文件夹)是不可能的。我认为这是我的代码中最重要的特性之一,所以我考虑了下面的两个模式选项,如下图所示。 在模
FullPath
列上放置索引时,请使用区分大小写的BETWEEN
运算符进行查询,或在索引上或使用LIKE
请注意,此模式还存储所有父项,但ID(名称)都连接到一个值中
重命名目录需要更新其所有子树条目,但您提到了历史记录,因此旧条目可能保持不变关系ID
,是吗?)如果查找被正确索引,我也不会比其他人慢。我个人最喜欢的方法是这种方法,我认为它对您特别有用,因为它使对记录及其后代运行聚合查询变得非常容易。您可能会感兴趣,这正是我想要的!因此,我展示的第二个解决方案与他描述的有点类似,但他也描述了非常优雅的触发器,可以在没有任何外部代码清理的情况下保持所有数据完全正常!我想我会同意那个设计!感谢您对这3个想法的详细描述!事实上,我认为我会使用闭包表,它会让人感觉更加优雅,数据应该如何真正存在于数据库中(DirtSimple链接有一个看起来非常酷的触发器,它可以在数据库中完成所有的簿记工作,尽管我会花一些时间仔细思考)。虽然firs的想法看起来也不错,但我只是对字符串操作感到有点厌倦,觉得另一个选择可能更酷。不过我可能会做一些测试,空间也是我的一个限制,必须添加RelationshipID,因为MS Access不允许我创建没有主键的表,我发现它是创建关系图的最简单工具:)该表的“正确”主键应该是
DirID
和FileID
@CL的组合。你读过这两个吗塞尔科(2012年)-完全值得电子阅读器的价格-或(2012年)。它们都不会使更新在嵌套模型中看起来“毛茸茸的”。当我考虑实现这个设计时,是什么使得模型需要更新?只是需要额外的注意和思考吗?@Thomas“重新安排树的结构是很棘手的,因为计算(lft,rgt)嵌套集数需要在一棵大树上学习一点代数。”如果你有这本书,这会更容易。:)