4

我有一个数据组织问题。我正在开发一个客户端/服务器项目,其中服务器必须在驻留在服务器上的数据库中维护客户端文件系统结构的副本。这个想法是在 AJAX 化的 Web 界面中显示服务器端的文件系统内容。现在,我只是将文件列表上传到按顺序转储文件的数据库。问题是一旦它们在数据库中,如何在服务器端重新捕获文件系统结构。通过遍历一个巨大的文件列表来重建服务器端的父->子结构似乎并不可行。但是,当文件对象没有相互引用时,这似乎是唯一的选择。

我不完全确定如何处理。据我所知,我需要在服务器端复制某种类型的文件系统数据结构(也许在 Btree 中?),对象维护指向其父和/或子的指针。我想知道是否有人可以分享任何类似的过去经历,或者可能有一些有用的资源可以为我指明正确的方向。

4

2 回答 2

2

我建议遵循Unix方式。每个文件都被认为是一个字节流,不多也不少。每个文件在技术上由称为i-node(索引节点)的单个结构表示,该结构保存与数据物理流相关的所有信息(包括属性、所有权等)。

i 节点不包含有关可读名称的任何内容。每个 i 节点都有一个唯一的编号(永远),作为文件的技术名称。您可以使用类似的数字来为数据库中的字节流赋予其唯一标识。i-node 存储在磁盘上一个单独的连续部分中——想想 i-node 结构的数组(在抽象意义上),或者数据库中的单独表。

回到文件。这样,它由唯一的数字表示。对于您的数据库表示,该数字将是唯一键。如果您需要其他索引节点信息(文件属性),您可以将其他列添加到表中。一列将是 blob 类型,它将表示文件的内容(字节流)。对于 AJAX,我认为文件会很小;所以,你不应该对 blob 的大小限制有问题。

到目前为止,文件存储为平面结构(物理磁盘和关系数据库一样)。

目录名的结构和文件的文件名分别保存在另一个文件中(与其他文件一起保存在相同的结构中,也由它们的 i 节点表示)。基本上,目录文件捕获 tuples (bare_name, i-node number)。(这种方式硬链接在 Unix 中实现——两个名称与相同的 i-none 编号配对。)根目录文件必须有一个固定的技术标识——即保留的 i-node 编号。

于 2012-07-19T06:06:08.133 回答
2

如果“数据库”是指 SQL 数据库,那么您正在寻找的神奇词是“自引用表”,或者“修改的预排序树遍历”(MPTT)

基本上,第一种方法处理具有 和 属性的“节点id” 。因此,要选择根级目录,您可以执行类似的操作parent_idname

SELECT id, name from mytable WHERE parent_id IS NULL AND kind="directory";

让我们假设返回你

[(1, "Documents and Settings"), (2, "Program Files"), (3, "Windows")]

然后,要获取“文档和设置”中的目录,请发出另一个查询:

SELECT id, name from mytable WHERE parent_id=1 AND kind="directory";

等等。简单的!

MPTT 有点棘手,但您会找到一个很好的教程,例如,在 Wikipedia 中。这种方法对于诸如“查找给定节点的所有子节点”、“此目录中有多少文件,包括子目录”等查询非常有效,并且当树发生更改时效率较低,因为您需要重新排序所有节点。

由于您使用的是 Python,因此您必须使用 ORM,您不会手动构建这些查询,对吗?SQLAlchemy 能够对自引用关系进行建模,包括通过单个查询将树“急切地加载”到一定深度。

于 2012-07-19T06:55:51.970 回答