Хранение дерева в линейной таблице

программирование php базы данных

Линейная таблица - значит простая таблица. Как минимум должна содержать поля id, parent_id и несколько полей для хранения данных (например, title, message, is_active, insert_timestamp и так далее - не суть важно).
Чтобы хранить дерево, нужно соблюдать следующий принцип: у всех "корневых" элементов parent_id = 0. У всех некорневых элементов parent_id должен содержать id того элемента, веткой которого он является.

Лучше я нарисую. Пусть у нас есть дерево:

Авто
Форд
аааа
бббб
Тойота
ттттт
ooooo
Опель
99999
Мото
Сузуки
йцукенг
ЯП
PHP
Zend
C++
ANSI
Java
Android
JWeb

Вот как можно записать это дерево в линейной таблице

id, parent_id, title
1 0 Авто
2 1 Форд
3 2 аааа
4 2 бббб
5 1 Тойота
6 5 ттттт
7 5 ooooo
8 1 Опель
9 8 99999
10 0 Мото
11 10 Сузуки
12 11 йцукенг
13 0 ЯП
14 13 PHP
15 14 Zend
16 13 C++
17 16 ANSI
18 13 Java
19 18 Android
20 18 JWeb

Так и Вам для построения структуры форума достаточно условиться, что все корневые элементы - это разделы, все "листья" - это топики, остальные элементы - это форумы и подфорумы. У них может быть неограниченное количество вложенностей.

Обрабатывать такие деревья очень удобно рекурсивными функциями.

Теперь понятно ? (это вопрос, кто не увидел в сообщении вопроса :)


Примечание:
#1
2 человекпакет

У nested set тоже есть ограничения, в частности добавление или удаление элемента (не говоря уже о переносе ветки к другому родителю) требует усилий. Хотя в некоторых случаях Nested Set действительно эффективнее.

Примечание:
Очень хорошая статья, тоже рекомендую почитать
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.