Лучшие методы хранения и поиска комментариев в PHP / MYSQL - PullRequest
2 голосов
/ 01 июля 2011

У меня небольшая проблема, когда речь заходит о моей базе данных и дизайне запросов.Вот что я хотел бы иметь (Честно говоря, очень похоже на переполнение стека).:

  • У элемента много сообщений.
  • В сообщении много комментариев.
  • Комментарии могут быть помечены, понравились и не понравились.
  • Комментарии не могут иметь подкомментариев.

Структура таблицы следующая:

Items
-----
iid
desc
...

Posts
-----
pid
iid
uid
date
desc
...

Comments
-----
cid
pid
uid
date
desc
...

Логика для всего этого такова: получить все сообщения для элемента -> для каждого сообщения, получить все комментарии.Будет ли лучше сделать все это в одном запросе?Что лучше сделать один запрос, чтобы получить все сообщения, а затем отдельный запрос для каждого набора комментариев к каждому сообщению?

Если я сделаю один запрос, то у меня потенциально будет бегемот из 100 строк, где я будуесть тонна повторяющихся данных.Если я сделаю отдельный звонок для каждого поста, то у меня будет слишком много запросов.Adivce

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Я полагаю, что ваша система будет иметь 3 различных вида, и я бы структурировал ее следующим образом:

  1. Список элементов - показывающий описание элемента и количество сообщений, прикрепленных к этому элементу.например, SELECT i.desc, ...., COUNT(p.pid) FROM items i LEFT JOIN posts p ON i.iid = p.iid GROUP BY i.iid ORDER BY i.date DESC
  2. Список постов для выбранного элемента - с указанием постов и количества комментариев, сделанных для каждого поста, например, SELECT p.desc, ...., COUNT(c.cid) FROM posts p LEFT JOIN comments c ON p.pid = c.pid WHERE p.iid = $iid GROUP BY p.pid ORDER BY p.date DESC
  3. Страница поста, которая показывает пост, а затем комментариипод.Эта страница потребует двух запросов.Запрос для сбора информации о публикации, возвращающий ровно 1 строку базы данных.А затем запрос для сбора каждого отдельного комментария, прикрепленного к этому сообщению.Например, SELECT p.desc, ... FROM posts p WHERE p.pid = $pid LIMIT 1 и SELECT c.desc, ... FROM comments c WHERE c.pid = $pid ORDER BY c.date DESC.Здесь вы можете изменить порядок, чтобы имитировать, как stackOverflow упорядочивает данные по самым старым, голосам и т. Д.нужна каждая отображаемая сущность.

    Чтобы имитировать эту страницу, я использовал бы следующий код ...

    itemRs = mysql_query("SELECT i,iid, i.desc, ... FROM items i WHERE i.iid = $iid LIMIT 1");
    
    // all posts relating to the item
    postsRs = mysql_query("SELECT p.pid, p.desc, .... FROM posts p LEFT JOIN comments c ON p.pid = c.pid WHERE p.iid = $iid ORDER BY p.date DESC");
    
    // all comments for all posts relating to the item
    commentsRs = mysql_query("SELECT c.pid, c.cid, c.desc, .... FROM comments c INNER JOIN posts p ON p.pid = c.pid INNER JOIN items i ON p.iid = i.iid WHERE p.iid = $iid ORDER BY p.date DESC");
    

    Затем вам нужно будет создать метод для отображения этих данных.Возможно, инкапсулируйте все эти функциональные возможности в DAO (объект доступа к данным) с именем Item, который извлекает все эти необходимые данные перед вызовом метода display () для отображения данных в нужном формате.

0 голосов
/ 01 июля 2011

Назначение автоматического идентификатора для сообщения и комментария, а также элемента, а также получение сообщения и комментария относится к этому идентификатору элемента.

0 голосов
/ 01 июля 2011

Я бы сделал это в двух запросах: один запрос для получения всех сообщений определенного элемента и другой запрос для получения всех комментариев всех сообщений определенного элемента.Некоторые реализации ActiveRecord работают одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...