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 |
+----+---------+---------+-------------------------------+---------------------+
Подскажите, как лучше спроектировать базу и каким запросом получить дерево комментариев. Может есть подробная статья на эту тему?
Если же вопрос слишком большой, по подскажите, с чего начать. Стоит ли в записях кроме 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 уже написана куча готовых инструментов, поддерживающих этот алгоритм.