Хранение деревьев в Mysql какие есть способы?

Мне нужно хранить в базе дерево причем нужно чтобы последовательность можно было менять.
т.е. была возможность сортировки.

Что то типа такого
Математика
 - Теория вероятностей
 - Логика
Юриспруденция
- Административное право
- Трудовое право
Язык
- Русский
- Английский
- Испанский


например можно поменять местами Математика, Юриспруденция, Язык
Ну и так же можно было бы менять внутреннюю структуру, например поменять порядок Русский, Английский, Испанский.
Вложенностей может быть больше.

Что посоветуете?

Может есть какой готовый класс на php на все случаи жизни для работы с деревьями.
Очень важна скорость.
  • Вопрос задан
  • 14112 просмотров
Решения вопроса 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Существует 4 основных способа хранения деревьев в реляционной БД:

Adjacency List - описан @Satanpit.

Matherialized Path - полный путь до узла хранится в виде строки типа 0035.0993.7324.1256 (т.е. узел верхнего уровня содержит строку 0035, узел второго уровня - строку 0035.0993 и т.д.)

Nested Set - для каждого узла хранятся 2 числа: левый и правый индексы. Причём левый индекс узла меньше левого индекса любого потомка этого узла, а правый индекс соответственно больше.

Closure Table - отдельно храним данные, отдельно иерархию.

А ещё есть комбинации этих способов.

По всем этим способам в рунете (в том числе на хабре) существует большое количество информации.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Satanpit
@Satanpit
Front-end developer
Структура БД примерно такая:
id - id категории
parent_id - id родительской категории (0 для категории первой вложенности)
sort_id
name

Для выборки в PHP используйте рекурсию.

Примеров в сети валом
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
У Joe Celko есть просто превосходная книга. Вообще он автор многих очень хороших книг по SQL.
Ответ написан
Комментировать
Читайте в сторону Nested Set. Вот небольшая статья на хабре
habrahabr.ru/post/153861
Я по этой изучал www.getinfo.ru/article610.html
Можно поискать готовые расширения, если вы пишете на фреймворке. Вот отлиное для Yii
https://github.com/yiiext/nested-set-behavior
Ответ написан
Комментировать
@Lemfidavr
Отношение многие ко многим.
habrahabr.ru/post/193380
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы