2013-04-14 110 views
0

我有一个数据库表,它与下面的定义保存文件/文件夹结构的ID:如何获得本地文件

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

...........

“根”是预定义根文件夹的特殊标识。因此,上述记录意味着:“Rootfolder \ folderB \ folderA \ aaa.txt”中有一个文件,其ID为“111”。

现在,考虑到文件的完整路径,我想获得它的ID。例如:

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

本表中有大约10-50万条记录,我怎样才能正确有效地编写GetFileId函数?

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

+0

的GetFileId功能是由C#编写(或Java或任何其他语言),并且在这个函数内部调用sql语句。请指教,谢谢。 – skyfree

回答

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' 

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


为了使速度更快,请使用适当的索引。 (在两列parentidfileOrFolderName应该帮助索引。这两个一covering indexid列可能会更好一点。)

+0

感谢CL,对于“单独查找每个级别”不是很清楚,你可以给一些伪代码吗? – skyfree