Извлечение значений из таблицы MySQL для объектов с различными отношениями: несколько запросов или один? - PullRequest
0 голосов
/ 26 октября 2011

Я создаю своего рода форум, поэтому мне нужно отображать сообщения.Каждому сообщению назначены комментарии и теги, а каждому сообщению назначен пользователь;также каждый комментарий присваивается пользователю.Так что мне нужно получить: пост, его комментарии и имена пользователей их авторов, теги и пользователя, которому назначен пост.Отображаемое сообщение выглядит примерно так:

post_title (submit_time)
tag1, tag2, tag3
user_name

    comment_text
    user_name

    comment_text
    user_name

    etc.

Проблема в том, что отношения между сообщениями, пользователями, комментариями и тегами различны.Сообщения для пользователей имеют отношение N: 1 (несколько сообщений для одного пользователя), сообщения для комментариев имеют отношение 1: N (несколько комментариев для одного сообщения), сообщения для тегов имеют отношение m: n (любое количество тегов для любого числа.сообщений).

Я разработал сложный запрос с большим количеством ЛЕВЫХ СОЕДИНЕНИЙ, который позволяет мне извлекать все данные для каждого объекта, но в нем много дублирующих строк (например, если есть 5 комментариев, данные оавтор поста будет извлечен 5 раз, с тегами становится еще хуже).Это не кажется очень рациональным.Кроме того, он по-прежнему заставляет меня делать еще один запрос для каждого комментария, чтобы найти имя пользователя его автора.

Я новичок в MySQL, поэтому я действительно не знаю, как решить эту проблему.

Вопрос в том, каков наилучший способ получения таких данных?Должен ли я сделать один большой запрос или множество мелких (получить комментарии и теги с различными запросами для каждого сообщения)?

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

1 Ответ

1 голос
/ 26 октября 2011

Иногда можно использовать несколько запросов для извлечения данных. В вашем случае вы МОЖЕТЕ использовать монолитный большой запрос для извлечения данных пользователя, всех его сообщений и всех комментариев, но, как вы говорите, много повторных данных. Если вы в конечном итоге отбрасываете большую часть результатов запроса, потому что это повторяющиеся данные, тогда это очень хороший кандидат для разделения:

1 query to fetch the user info
1 query to fetch the user's posts
1 query to fetch the posts' comments

В результате вы получаете информацию о пользователе только один раз. Предполагая, что у конкретного пользователя есть 20 постов с около 50 комментариями, ваш монолитный одиночный запрос будет извлекать 20x50 = 1000 копий сведений о пользователе и 50 копий сведений о посте, что приведет к выбрасыванию 999 + 30 = 1029 записей пользователя. / опубликовать данные.

Для сравнения, за счет выполнения 3 запросов вы получаете только 1 + 20 + 50 = 71 ряд данных, ни один из которых не является избыточным.

...