我有一个数据库表,它使用以下定义保存文件/文件夹结构:
id parentid fileOrFolderName
111 222 aaa.txt
222 333 folderA
333 Root folderB
444 222 bbb.doc
...........
“Root”是预定义根文件夹的特殊ID。所以,上面的记录意味着:“Rootfolder \ folderB \ folderA \ aaa.txt”中有一个文件,其id为“111”。
现在,考虑到文件的完整路径,我想得到它的id。例如:
GetFileId(“RootFolder \ folderB \ folderA \ aaa.txt”)将返回“111”。
此表中有大约10-50,000条记录,如何正确且高效地编写GetFileId函数?
这个问题不仅限于任何语言或数据库,我需要的是正确的算法。提前致谢。
答案 0 :(得分: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
和fileOrFolderName
上的索引应该会有所帮助。这两个列上的covering index和id
列可能会更好一些。)