комментарии на сайте. вопрос к спецам.

M
На сайте с 15.03.2012
Offline
128
472

приветствую всех

есть сайт, на котором присутствуют различные сущности, такие как, например, товары, новости, статьи.

для каждого товара, новости, статьи имеется возможность оставить комментарий. Комментарии хранятся в единой таблице, принадлежность к сущности отражается в 2х полях, тип сущности и ID сущности.

Задача состоит в том чтобы вывести, к примеру, 10 последних комментариев с указанием названия сущности. Join мы не можем использовать по понятным причинам. Делать отдельный запрос на получение названия новости/статьи/товара для каждого комментария - не вариант.

Есть вариант использвать mysql view, то есть 1 раз создать представление (с использованием UNION) в котором хранились бы все комментарии с уже присоединенными доп. данными и делать выборку оттуда. Но что-то этот вариант мне не очень симпатичен.

TA
На сайте с 12.06.2009
Offline
116
TiA
#1

Один из самых разумных вариантов - это JOIN с условием и привязкой к типу. То есть нужно указать в условии, что если тип такой-то, то нужно с такой-то таблицей объединять и получать такие-то поля.

Еще один вариант - это денормализировать немного базу и хранить название сущности в таблице с комментариями. Это существенно упростит задачу, но придется немного поправить механизм редактирования самой сущности, добавить туда изменение имени в таблице с комментариями.

Профессиональная верстка и разработка сайтов на WordPress (http://www.maultalk.com/topic139110s0.html)
M
На сайте с 15.03.2012
Offline
128
#2
TiA:
Один из самых разумных вариантов - это JOIN с условием и привязкой к типу. То есть нужно указать в условии, что если тип такой-то, то нужно с такой-то таблицей объединять и получать такие-то поля.

что-то я не представляю как такой запрос будет выглядеть. можете написать пример?

TiA:
Еще один вариант - это денормализировать немного базу и хранить название сущности в таблице с комментариями. Это существенно упростит задачу, но придется немного поправить механизм редактирования самой сущности, добавить туда изменение имени в таблице с комментариями.

в теории такой вариант возможен, но на практике это нереально

Solmyr
На сайте с 10.09.2007
Offline
501
#3

Если нужно максимальное быстродействие - все нужные данные в одну таблицу. Если нужна максимальная гибкость (чтоб потом если что какую доп фичу добавить минимальным программированием) - то несколько запросов. Сначала один берет выборку а потом несколько других подгружают данные к этой выборке.

Я лично сделал бы второй вариант. Не будет там проблем с быстродействием если на страницу надо взять 20-30 записей а не 10000.

TA
На сайте с 12.06.2009
Offline
116
TiA
#4
Moltisanti:
что-то я не представляю как такой запрос будет выглядеть. можете написать пример?

Вот примерно ваш случай: http://stackoverflow.com/questions/1255492/conditional-join-in-mysql

Более подробно об условиях в JOIN - http://www.mysqldiary.com/conditional-joins-in-mysql/

Moltisanti:
в теории такой вариант возможен, но на практике это нереально

Это, к слову, самый производительный вариант. Второй вариант - это программно организовывать выборку нужных имен из базы данных по ID. Если правильно к вопросу подойти, то количество дополнительных запросов будет равно количеству используемых типов. Дополнительные запросы будут выполняться быстро, поскольку выборка там по ID, который часто PK.

siv1987
На сайте с 02.04.2009
Offline
427
#5
Moltisanti:
Join мы не можем использовать по понятным причинам.

Нам ваши понятные причины пока не очень понятны. JOIN'инть к чему? В чем проблемы одним запросом дернуть нужное количество коментариев для текущей сущности? Структуру бд запилите, на словах здесь не возможно понять что у вас там.

M
На сайте с 15.03.2012
Offline
128
#6

TiA, спасибо, conditional join - то что надо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий