Порадьте фреймворк для ієрархічних структур

Потрібно побудувати і впорядкувати ієрахічну структуру (з ~10 мілліонів дата рекордів) і алгоритмом пошуку по дереву і місця в структурі.

Після добалення ноди буде потрібна оптимізацiя і впорядкування дерева.

Бажана паралельність, можна розпреділеність на декілька серверів для побудови структури.

Після побудови треба буде забезпечити пошук, відображення нодів, добавлення нових елементів в структуру.

Не хочется платити за суперкомп чи хмару (шкільний проект), хочется проранати локально і деплойнути для демо

Який фреймворк краще використати?
Хтось робив щось подібне?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

берете якусь реалізацію b-tree і будуєте. нічого принципово відмінного не видумали ж. можна це засунути в реляційку або nosql, в основі буде те ж b-tree лежати у вигляді індексу.
ну і розмір ноди, глибину дерева, необхідну швидкодію ви не вказали (може у вас глибина в 1млн., на кой тоді дерево)

фреймвркам все равно какая там структура. Вообще на таксономию заточен друпал.
Что касается монго и прочего nosql барахла с всякими json — оно просто ляжет на больших данных — уже такое проходил на CouchDB.
Использую в таких случаях обычную таблицу в mysql например, организованую по materialized path. Позволяет делать любые манипуляции с деревом одним sql запросм

С прошитыми дереьвями их даже и в спредшитах крутить можно легко (не десятки млн конечно). Но добавлять новые ноды труднее, т.к. перестраивать надо. Но можно соптимизировать и это.

потому и materialized path чтобы ничего не перестраивть а просто вставлять запись.

library.bagrintsev.me/CPP/Sedzhvik.pdf
11.3 внешняя сортировка
16 внешний поиск

На фронтенді можна відобразити все, що завгодно, але за умови, що воно десь збережено і видається по АПІ :)

mongo, postgres вміє в json теж, треба дивитись наскільки глибока структура, можливо нормалізувати вийде в реляційну
ще можна графову бд спробувати, але не рекомендую neo4j, бо вона повільна на джоінах. en.wikipedia.org/wiki/OrientDB чув непогана (orientdb.com/orientdb-vs-neo4j)

Иерархическая база данных — это внезапно файловая система. Попробуйте btrfs

MongoDB внезапно. Там можно поддеревья вырезать в запросе.

Неочевидне рішення: не будувати ієрархічну структуру. Будувати лінійну, із створенням звичайного собі індексу, або декількох.

Чому так: бо єдина причина створення ієрархії — це наслідування реальної (природної) ієрархії даних. І не знаючи нічого про ті дані, не можна створити ефективної ієрархічної моделі. Тому краще збудувати лінійне сховище та індекс.

Оптимізація має бути окремою процедурою. Щоб додавання даних не породжувало складну перебудову всього індексу, а видалення — тяжкого переносу всіх даних.

Якщо дослідження не є теоретичним, тупо постав MySQL, створи звичайну таблицю із полем «ParentID» можеш навіть без ForeignKey (значення цією фічі значно перебільшене). Для перших рівнів ієрархії (груп), які зазвичай дуже стабільні, краще створити окрему таблицю — вона буде словником. Чому так: в ній не має бути елементів, по яких робиться пошук, лише групи. Наприклад, категорії товару — вони слугують лише рівнями ієрархії, саму категорію не шукають, шукають товар.

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

Підписатись на коментарі