На любом современном сайте (да и на сайтах постарше) встречаются
вложенные структуры, иерархия объектов, деревья. Самый
распространенный пример каталог.
Сегодня множество проектов разрабатывается с использованием
Javascript. Как же хранить древовидные структцры в этом случае? Об
этом и хотелось бы поговорить.
Сейчас передо мной стоит задача на основе параметров продукции
составить иерархтческую структуру каталога.
Существуют различные алгоритмы для хранения деревьев и примером
таких алгоритмов могут послужить Adjacency List, Matherialized
Path, Nested Set и Closure Table.
Если посоветуете еще какие-то буду рад услышать и поучиться.
Когда я писал расширения для Joomla я часто использовал Nested Set.
Именно в этой CMS я впервые встретил эту модель. Но теперь стек
поменялся и сейчас это Javascript. Привычки остались, да и сайты на
Joomla тоже. Нужно переносить данные на новые сервисы и
проекты.
О Nested Sets довольно много информации в интернете и при желании
вы всегда сможете ее найти, но тем не менее пару слов о этой модели
данных я должен сказать.
Смысл Nested Set в том, что у каждого узла в иерархии существует
пара ключей левый ключ и правый ключ. В зависимости от их значений
осуществляется обход дерева. Положительными качествами алгоритма,
на мой взгляд, является быстрота выборки данных. В этом алгоритме
нет рекурсии. В то же время для изменения структуры дерева,
добавления, удаления и переноса узлов, необходимо пересчитывать все
ключи.
Чтобы использовать данные из Nested Set в проектах на Javascript
нужен модуль который умел бы работать с этой моделью.
Поискав через npm я нашел модули, функционалом которых была
выборка данных из структуры Nested Sets, т.е. все ключи уже должны
были быть проставлены. Была необходимость править структуру, но
такой возможности я не нашёл.
Еще одной проблемой является то, что в большинстве случаев и данные
и структура дерева хранятся в одной сущности, но на мой взгляд
гораздо эффективнее разделять эти вещи.
Таким образом одна и та же категория (данные категории) может
лежать в разных родителях. Это позволит пользователям находить то,
что они ищут быстрее при хорошо продуманной иерархии.
Хотя с точки зрения SEO появятся две страницы с разными URL и с
одинаковым контентом, но это можно решить каноническими
ссылками.
Если это не правильно прошу SEO-специалистов меня поправить.
В итоге я решил написать модуль и опубликовать его на
npmjs.com.
Если кому-то пригодится буду очень рад.
Сейчас я продолжаю работать над ним и в планах реализовать перенос
узла по дереву.
Вот ссылка на npm, где вы можете скачать
пакет.
Вот ссылка на github, где вы можете скачать
исходники.
Документация есть и там и там.
Буду рад любым комментариям.
Хороших вам проектов и интересных задач.