parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Хорошо ли использовать много обращений к MySQL или лучше...

kechinoff 23.01.2007 13:31

Ситуация такая. Есть БД. В ней много объявлений. У каждого объявления есть такие параметры, как, например, "Категория", "Коробка передач", "Тип кузова", "Марка" и т.д. Их может быть 20.
Естественно, если эти параметры (поля) будут текстовыми, типа "Марка" будет равна "Tayota", то когда добавится 5000 объявлений и я выясню, что Тойота оказывается пишется "Toyota", а не "Tayota", мне станет грустно. Можно, конечно, сделать UPDATE table SET mark = ..., но все-равно неприятно, я, к примеру, хочу, чтобы юзер выбирал марку из списка, и все, больше никак. Ну и реляционный подход и все такое. В общем чтобы все было грамотно.
Поэтому все такие параметры в табличке BULLETIN заданы цифрами, а для каждого типа параметра существует своя табличка, например mark (ID INT, TITLE VARCHAR(50) ...).
Суть такова.
1. Я выбираю из БД 300-500 объявлений. Вернее идентификаторов объявлений (поле ID INT). = $list
2. Делаю цикл, в котором помещаю в переменную tBulletin результат запроса SELECT * FROM bulletin WHERE ID = $list.ID
3. Начинаю потрошить объявление и забивать его в табличку. Т.е. табличка, пример:
Наименование: $tBulletin.Title
Марка: ^DB:Mark[$tBulletin.Mark]
Кузов: ^DB:Body[$tBulletin.Body]
...
И таких параметров штук, ну, хотя бы 10.
Ну, так что получается. 300 итераций цикла по $list, в котором выбирается информация об объявлении и потом еще 10 запросов к БД по части параметров. Итого 300*11 = много. Вот так вот много обращений к БД на обычном хостинге - это сильно плохо для сайта? Т.к. у меня сайт при попытке вывести 300 объявлений грустно говорит "out of memory (while expanding string)".

Получается выход - в начале обработки скриптов, сделать в табличные переменные выборки всех параметров, типа $tMark будет содержать все марки автомобилей, $tBody будет содержать все типы кузова. Выборку по категории ($list) делать не только ID, а вообще все поля таблицы bulletin, тогда не придется делать переменную tBulletin в каждой итерации цикла, и т.д.

Это выход? Или может быть можно придумать еще что-то более цивилизованное?

LIMIT 0, 50 в данном случае не подходит, т.к. все объявления нужно выдать одним рулоном.