2013-04-14 34 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