2013-04-14 2 views
0

У меня есть таблица базы данных, которая сохраняет структуру файлов/папок со следующим определением:Как получить идентификатор локального файла

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

...........

«Корень» - это специальный идентификатор для предопределенной корневой папки. поэтому приведенные выше записи означают: есть файл, расположенный в «Rootfolder \ folderB \ folderA \ aaa.txt», а его идентификатор - «111».

Теперь, учитывая полный путь к файлу, я хотел бы получить его идентификатор. Например:

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 = ? 

Вы могли бы объединить все Lookups в один вложенный оператор:

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 колонка может быть немного лучше.)

+0

Спасибо CL, не очень понятно о «отдельном поиске на уровне», можете ли вы дать некоторый псевдокод? – skyfree

Смежные вопросы