Сегодня множество проектов разрабатывается с использованием 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, где вы можете скачать исходники.
Документация есть и там и там.
Буду рад любым комментариям.
Хороших вам проектов и интересных задач.
ua9msn
Позволю себе совет. Перепишите на typescript. Ну и еще один, попросите опытных товарищей сделать codereview вашему коду. Я пробежался по диагонали, есть явные места где стоит чуть переделать, например
уверен что будут и более веские замечания.
orxtime Автор
Большое спасибо, обязательно займусь