Если нужно блок с коментами сохранить в БД....

интернет программирование веб

И при этом комменты могут быть к самому посту и к другим комментам - то есть древовидная структура. Как это поэффективнее сделать? Или тупо на каждую запись в блоге комменты к ней выгребать отдельным запросом? Тогда список записей будет выгребаться десятками запросов. Очень неэффективно получается. Подскажите как лучше сделать.

Примечание:
У меня PHP и MySQL :)
Ответы:
ну, если вы хотите сворачивать/разворачивать коммент(-ы), то на такую операцию по любому придется отдельный запрос реализовывать (конечно, для эффективности, можно с кешированием на сервере, например, если на java, то делаем аля cacheЧто-тотам-ежббин). а если вы у вас есть сущность - пост, т.е. таблица с комментами, где сам первый пост - это тоже коммент - , то в таком случае делают доп.поля ссылки на пост - parentId (у головного поста-коммента он будет равен 0). не знаю, что за база у вас. но вот в оракле такие игрушки (начиная, вроде с 9ой или 10ой версии) реализуются с помощью специальных встроенных средств - посмотрите примеры с ф-цией RPAD (с указанием ей LEVEL), конструкциями "CONNECT_BY_ISLEAF as IsLeaf", "start with вашеПолеParent_ID = 1 " и слова "siblings". собственно RPAD и siblings в оракле дают возможность построить иерархический запрос. в других субд будет что-то свое (если они такие продвинутые окажутся)
Не все так страшно. Конечно, отсутствие в MySQL ораклевой конструкции connect by prior немного усложняет, но только немного.
Далее - в том, чтобы делать несколько запросов к базе тоже ничего страшного нет. Кроме того, логически пост от комментария ничем не отличается, и там и там текст, дата, автор. Поэтому, ориентируемся по трем полям: идентификатор сообщения, ссылка на родительское сообщение (если NULL - то это корень, то есть пост и сквозная ссылка на пост)
Каждая запись имеет идентификатор +  ссылку на родителя.  Далее, вытаскивать по рекурсии:
Вытащить корневые сообщения: select pole1,pole2,.. from my_table where parent_id is null
вытащить комменты первого уровня для корневого сообщения - select pole1,pole2 from my_table where parent_id = чему_то там
вытащить весь блок:  select pole1,pole2,.. from my_table where trend_id = чему_то там
при этом parent_id - ссылка на идентификатор родительского коммента, NULL для корня.
trend_id - ссылка на корень


15 лет назад

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

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

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