Хранение древовидной структуры в бд
От: drosan http://www.ravil.su
Дата: 19.06.09 01:53
Оценка:
Здравствуйте.
Есть полуабстрактная задача — хранить некую древовидную структуру (к примеру, директории) в базе. СУБД — PostgreSQL.
Главными условиеми являются высокая производительность и возможность горизонтального масштабирования.
Ну остальное тривиально — поиск, "уровень" от корня для каждой ноды, "разворачивание" при выборке на произвольный уровень.

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

Основная таблица — поля id, parent_id, nlevel, title (ну тут, думаю, всё понятно).
Вспомогательная таблица — поля node, ancestor. В ней для каждой ноды указаны все её родители вплоть до самого "верхнего".

При такой схеме получается, что insert — довольно дорогая операция, хоть я и затолкал всё это в хранимки, но при больших уровнях вложенности, наверное таки будет не ахти. С другой стороны — это куда быстрее "классической" схемы с полями nleft/nright, для них при каждой модификации дерева нужно пересчитывать эти значения почти для всей базы.

Отказался от хранения предков отдельных полях записи, потому что вложенность неограничена.
Отказался от хранения предков в одном поле с разделителями, потому что имхо ни разу не flexible — придётся парсить строку, но самое плохое — при изменении узловой ноды нужно будет перезаписывать огромную тучу строк, что явно медленней перезаписи integer.

Подскажите, пожалуйста, может быть есть какие-то хитрые-прехитрые схемы, о которых я не знаю? И над чем ещё тут можно подумать?

19.06.09 13:06: Перенесено модератором из 'Алгоритмы' — Кодт
"Для того чтобы быть человеком, надо им какое-то время не быть." ©Ю. А. Бригадир.
postgresql database tree
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.