MySQL « Проектирование базы данных для древовидных комментариев

Необходимо для сайта реализовать систему древовидных комментариев, т.е. чтобы можно было комментировать комментарии.
Подскажите, как лучше спроектировать базу и каким запросом получить дерево комментариев. Может есть подробная статья на эту тему?

Если же вопрос слишком большой, по подскажите, с чего начать. Стоит ли в записях кроме id отца указывать ещё и степень/уровень ответвления (уровень вложенности)?

Для начала имеется таблица:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .sql.geshi_code {font-family:monospace;} .sql.geshi_code .imp {font-weight: bold; color: red;} .sql.geshi_code .kw1 {color: #993333; font-weight: bold;} .sql.geshi_code .co1 {color: #808080; font-style: italic;} .sql.geshi_code .co2 {color: #808080; font-style: italic;} .sql.geshi_code .coMULTI {color: #808080; font-style: italic;} .sql.geshi_code .es0 {color: #000099; font-weight: bold;} .sql.geshi_code .br0 {color: #66cc66;} .sql.geshi_code .sy0 {color: #66cc66;} .sql.geshi_code .st0 {color: #ff0000;} .sql.geshi_code .nu0 {color: #cc66cc;} .sql.geshi_code span.xtra { display:block; }

+----+---------+---------+-------------------------------+---------------------+
| id | parrent | post_id | comm_text                     | dat                 |
+----+---------+---------+-------------------------------+---------------------+
|  1 |       0 |       1 | pervyj kommentarij            | 2010-07-04 11:28:48 |
|  2 |       1 |       1 | vtoroj kommentarij            | 2010-07-04 11:28:55 |
|  3 |       0 |       1 | tretij kommentarij            | 2010-07-04 11:29:13 |
|  4 |       1 |       1 | chetviortyj kommentarij       | 2010-07-04 11:29:23 |
|  6 |       2 |       1 | shestoj kommentarij           | 2010-07-04 11:29:42 |
|  7 |       6 |       1 | sedmoj kommentarij na shestoj | 2010-07-04 11:46:27 |
+----+---------+---------+-------------------------------+---------------------+
 

1 ответов


Думаю, лучшей стратегией для хранения комментариев является Materialized Path.
В данном случае нет необходимости во вставке комментариев в середину, только в конец, либо в новый нижний уровень, что позволяет не обращать внимания на недостаток метода и использовать только достоинства.
Пример: http://www.opennet.ru/docs/RUS/hierarchical_data/


ИМХО. Нужно использовать nested sets.
http://www.getinfo.ru/article610.html

Выигрыш - быстрые выборки.
Недостаток - нетривиальный пересчет ключей.

Для PHP уже написана куча готовых инструментов, поддерживающих этот алгоритм.