Russian Qt Forum

Программирование => Базы данных => Тема начата: NetWorm от Сентябрь 21, 2012, 20:48



Название: Хранение дерева в mySQL
Отправлено: NetWorm от Сентябрь 21, 2012, 20:48
Вобщем имеется древовидная структура. Пример зал театра.

Основной зал
|-Амфитеатр левая сторона
    |-Ряд 01
    |-Ряд 02
    |-Ряд 03
|-Амфитеатр правая сторона
    |-Ряд 01
    |-Ряд 02
    |-Ряд 03

Вот суть такая. Это можно представить в виде одной таблицы с полями..
id, name, parent

В данном случае она будет выглядеть вот так
id|Name                            |parent
1|Основной зал                 |NULL - т.е. самый верхний уровень
2|Амфитеатр левая сторона|1 - ссылка на верхний уровень
3|Ряд 01                           |2 - ссылка на "Амфитеатр левая сторона"
4|Ряд 02                           |2 - ссылка на "Амфитеатр левая сторона"

Вопрос. Как мне получить данные например Ряд 01 | Основной зал. т.е. получить через Ряд 01 мы можем получить строку Амфитеатр, а через амфитеатр можем получить Основной зал.

Сложность в том что уровней может быть разное количество.




Название: Re: Хранение дерева в mySQL
Отправлено: trot от Сентябрь 22, 2012, 09:58
Рекурсивные запросы - with recursive ...., но в mysql к сожалению нет рекурсивных запросов. Посмотрите здесь - http://club.shelek.ru/viewart.php?id=306.


Название: Re: Хранение дерева в mySQL
Отправлено: xokc от Сентябрь 22, 2012, 18:04
Способов хранить иерархические данные в реляционной БД великое множество, начиная от примитива id-parent (как у тебя) до представления деревьев в виде XML и использования XPath индексов для доступа к данным (как у MSSQL). Всё зависит от того перечня действий с деревом, который тебе нужен. Если нужны всего лишь получение всех потомков и предков узла достаточно создать дополнительную таблицу, в которой хранить тройки id-parent-level для всех узлов (где level - уровень вложенности узла).