2013-03-25 4 views
1

У меня есть следующий SQL Schema:конкатенация иерархических путей к файлам в sqlite3

CREATE TABLE Folders(
    id INTEGER PRIMARY KEY, 
    path TEXT NOT NULL, 
    level INTEGER DEFAULT 0, 
    parentId INTEGER) 

элемент с ParentID = NULL является корневым элементом и имеет полный путь в «путях». Вложенные папки сохраняются только по их имени и уровню, который описывает, насколько они ниже корневой папки. Теперь я хочу построить полные пути для всех элементов из этих данных.

КТР не доступен в SQLite, так что я создал этот запрос, чтобы принести полные пути элементов:

select f.id, ifnull(group_concat(p.path, '\')||'\', '')||f.path as path 
    from folders f 
    left outer join (select * from folders order by parentId, level) p on (p.parentId=f.parentId or p.id=f.parentId) and p.level < f.level 
    group by f.id 

Однако это, как представляется крайне неэффективным, когда я смотрю на этот план с «объяснить». Я создал индекс на parentId, пути и уровне, но это, похоже, не улучшилось.

Я пытался проверить http://www.sitepoint.com/article/hierarchical-data-database/, но у него есть проблема с перенаправлением.

ответ

1

Вы не можете этого сделать, если количество уровней между корнем и дочерними элементами является переменной. То, что вы сделали, неверно, и в лучшем случае вы можете присоединиться к корню с прямыми детьми.

Существуют различные решения для кодирования иерархических данных в таблицы и исключения необходимости в рекурсивных запросах. Например, см. https://communities.bmc.com/communities/docs/DOC-9902.

Поскольку одно из решений состоит в том, чтобы иметь материализованные пути, вы должны понимать, что на самом деле вам нужно иметь полный путь в каждой записи, который дает вам необходимые данные с помощью простого запроса.

+0

Да, вы правы, это край, я не видел. Сохраняя полный путь, тогда. Тем не менее, все еще поддерживаю parentId. – philk

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