LINUX.ORG.RU

Как лучше хранить дерево директорий в SQL-базе?


0

0

ещё такой вопрос. допустим что дерево будет храниться вот так:

id | path |
1 | /root |
2 | /root/docs |
3 | /root/img |
4 | /root/docs/1 |
5 | /lib/obj/ |
6 | /lib |


то есть в колонке path будет храниться полный путь (получается, что тип данных будет примерно TEXT, если дерево большое).

плюс в том, что проверить путь можно всего одним sql-запросом... и получить id тоже можно одним запросом (id соответственно используется в других таблицах чтобы указать принадлежность к директории).
ещё нужно каким-то образом получать листинг директорий, которые находятся в директории с определённым id.

собственно, это все планируемые операции над такой таблицей. Так что интересно узнать насколько подходит такое хранение. И главное, как оно будет по скорости с другими возможными методами

а ещё интересно, если дадите каких-нибудь полезных ссылок, где про это можно почитать. желательно что-нибудь новомодное )


ну наверное стандартно

lft
rght
parent_id


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

Slavaz ★★★★★
()

nested sets думаю подойдет.

Спокойно одним запросам можно получить {полный путь от корня до нужного узла | список узлов на требуемом уровне | родителя узла любой степени отступа от текущего | список потомков на первом уровне от заданного | просто список потомков на любом уровне}

OldFornit
()

А потом операция «переименовать каталог /root в /toor» будет выглядеть как «update name set name=replace(substr(name,1,length('/root')),'/root','/toor')||substr(name,length('/root')) where name like '/root/%' or name = '/root', так что-ли?

no-dashi ★★★★★
()

(id, parent_id) или nested set в зависимости от того, как дальше будет использоваться и от движка базы. В случае (id,parent_id) нужно будет делать рекурсивные запросы. В случае nested set все вышеперечисленные операции можно делать одним запросом (кроме получение id по пути вида /path/to/dir, но его можно и хранимой процедурой сделать)

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

А разумно для удобства хранить отображени реальной ФС сайта в базе? Т.е. как бы данные привязаны по бд, а файл создаются как контроллеры по какому-то грубо говоря шаблону.

Megamozg
()
Ответ на: комментарий от Megamozg

Ну во многих cms так и делается, ИМХО вполне нормальный вариант если нужно изменять контент/шаблон/что-либо ещё на сайте, при этом не имея доступа к реальной фс. В общем вопрос дискуссионный, есть плюсы есть минусы.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Хм, смущает то что, если контроллеров много или они отличаются часто, то дубоировать в бд дерево нету смысла наверно, а если большую часть страниц можно обработать через однотипный контроллер, то наверно удобней - сразу его загрузил и походу кидаешь ему порции данных из бд, полученных из дерева в этой же самой бд...
Немного не по теме - Полюбому ведь в большинстве случаев приходится что-то писать в файлы, например те же шаблоны или их тоже хранить как текст в бд, запутался слегка.
Спасибо.

Megamozg
()
Ответ на: комментарий от Megamozg

Не вижу проблемы, хранить структуру и тип контроллера, вытаскивать по пути запись и контроллер, которым данную страницу формировать. Т.е. есть 1 контроллер он по пути получает (в каком-либо виде) информацию о реальном контроллере данной странице и запускает его. Дальше уже реальный контроллер обрабатывает страницу как ему надо, беря нужные данные из БД.

В файлах надо хранить то, что не надо часто менять, или то, что не будет менять конечный пользователь. Т.е. если есть желание сделать мегаконструктор, с полным управлением из админке, то придётся хранить в БД. ИМХО в фс проще. Видел оба варианта, но пока не берусь судить когда, что лучше.

На быдлохабре вообще был вариант с полным хранением даже кода в БД, так что можно и до такого абсолютного случая доползти.

P.S. я бы Крона пнул, он вроде как шарящий, может что умное скажет ^_^

qnikst ★★★★★
()
Ответ на: комментарий от JFreeM

всем спасибо за инфо.. посмотрел там на графики и тесты.. очень познавательно.

все алгоритмы со своими граблями. но похоже, что Adjacency List нужно применять, когда очень большое дерево. с другой стороны в этом алгоритме очень дешёвые операции перемещения и удаления, что тоже является плюсом.

в общем есть над чем подумать ))

none
() автор топика
Ответ на: комментарий от Slavaz

мм.. а можно подробней? не обязательно вдаваться в детали.. просто мне стало интересно, как этот кэш будет строиться. кэш - это хорошо :) ... только я к сожалению не понял о каком кэшэ идёт речь? что будет кэшироваться?

none
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.