0

我有一个数据库表,它使用以下定义保存文件/文件夹结构:

id    parentid     fileOrFolderName
111    222          aaa.txt
222    333          folderA
333    Root         folderB
444    222          bbb.doc

............

“根”是预定义根文件夹的特殊 ID。所以,以上记录的意思是:“Rootfolder\folderB\folderA\aaa.txt”中有一个文件,其id为“111”。

现在,给定文件的完整路径,我想获取它的 ID。例如:

GetFileId("RootFolder\folderB\folderA\aaa.txt") 将返回“111”。

该表中大约有 10 到 5 万条记录,如何正确高效地编写 GetFileId 函数?

这个问题不限于任何语言或数据库,我需要的是正确的算法。提前致谢。

4

1 回答 1

1

使用这种数据结构,显而易见的算法(每个级别进行一次单独的查找)是唯一有效的算法。

对于目录层次结构中的每个级别,请执行以下操作:

SELECT id FROM MyTable WHERE parentid = ? AND fileOrFolderName = ?

您可以将所有查找合并到一个嵌套语句中:

SELECT id FROM MyTable
WHERE parentid =
   (SELECT id FROM MyTable
    WHERE parentid =
       (SELECT id FROM MyTable
        WHERE parentid = 'Root'
          AND fileOrFolderName = 'folderB')
      AND fileOrFolderName = 'folderA')
  AND fileOrFolderName = 'aaa.txt'

但是,这不会更快,但会使查询构造更加复杂。


为了使其更快,请使用适当的索引。(两列上的索引应该会有所帮助。这两列和列上的覆盖parentid索引可能会更好一些。)fileOrFolderNameid

于 2013-04-14T11:55:13.313 回答