хочется поменьше запросов...

Novice

Новичок
хочется поменьше запросов...

Имеем на сайте новости. Так как структура их динамическая (неизвестно заранее сколько полей будет содержать новость), то сделал такую структуру таблиц в БД:

таблица articles:

id - INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
article_name - VARCHAR(255)

таблица articles_fields:

id - INT UNSIGNED
var_name - VARCHAR(255)
var_value - TEXT

Например в таблице articles имеем:

id | article_name
---------------------------
1 | Всех с Новым Годом!
2 | Сайт скоро переезжает

А в articles_fields соответственно:

id | var_name | var_value
------------------------------------------
1 | author | Иванов Иван
1 | date | 1105120771
2 | author | Петров Петр
2 | date | 1105120664


Теперь для вывода всех новостей в раскрытом виде я делаю
N+1 запросов к БД, где N - количество новостей.

то есть чтобы получить для вывода массив вида:

array(
0 => array('id'=>1, 'article_name'=>'Всех с Новым Годом!', author=>'Иванов Иван', 'date'=>'1105120771'),

1 => array('id'=>2, 'article_name'=>'Сайт скоро переезжает', author=>'Петров Петр', 'date'=>'1105120664')
............
)

Либо я выбрал не лучшую структуру таблиц, либо не умею писать запросы. Кто что может предложить?

Спасибо.
 

SiMM

Новичок
Re: хочется поменьше запросов...

Автор оригинала: Novice
структура их динамическая (неизвестно заранее сколько полей будет содержать новость
ИМХО, это заблуждение номер раз.
 

Фанат

oncle terrible
Команда форума
которое надо, во всяком случае, веско аргументировать.
 

SiMM

Новичок
articles: id title date author_id
authors: id value
Понадобиться ещё что-то - сделаешь
images:
id article_id ...
downloads:
id article_id ...
Ну и т.д.
PS: как раз собирался расписать ;)
 

untied

Сдвинутый новичок
Ну, случаи, как известно, разные бывают. Может так надо... :D

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

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

Novice

Новичок
Originally posted by SiMM
articles: id title date author_id
authors: id value
Понадобиться ещё что-то - сделаешь
images:
id article_id ...
downloads:
id article_id ...
Ну и т.д.
PS: как раз собирался расписать ;)
Это конечно все красиво и просто. Представь сайт хотя бы с 20 каталогами... Итого имеем ~60 таблиц?
А так настраиваем структуру для каждого из 20 и имеем 2 таблицы, с которыми конечно не совсем удобно работать.
Вот и спрашивал как оптимизировать такой подход.

-~{}~ 07.01.05 21:22:

Originally posted by untied
захешируй их в многомерном массиве (ключ хеша -- это идентификатор новости).
Каким образом хешировать?
 

neko

tеam neko
тебя чем-то пугают числа в которых присутствует цифра шесть?

но насчет удобства это да
неудобно будет как не крути
 

Novice

Новичок
это нормально?

То есть это нормально иметь 60 таблиц?
Такой подход конечно приходил первым на ум, да и с точки проектирование БД он правильный...

Но пугала цифра "6" :)
 

neko

tеam neko
по этому вопросу имеет смысл проконсультироваться у священника
 

Фанат

oncle terrible
Команда форума
Это конечно все красиво и просто. Представь сайт хотя бы с 20 каталогами... Итого имеем ~60 таблиц?
это шутка такая?

о каких каталогах идет речь?
если это разделы новостей, то таблиц - ДВЕ.
 

Novice

Новичок
поиск...

С поиском по сайту тут конечно кисло выходит, нужно просматривать все таблицы :( Как тут поступать, если не смотреть в сторону кеширования данных?
 

SiMM

Новичок
Автор оригинала: Novice
Это конечно все красиво и просто. Представь сайт хотя бы с 20 каталогами... Итого имеем ~60 таблиц?
Итого количество таблиц не изменяется. Просто в articles добавляется поле cat_id. Ну может добавиться ещё одна табличка - catalogs: id title
Каким образом хешировать?
Никак. Бредит человек - последствия праздников.
 

untied

Сдвинутый новичок
Каким образом хешировать?
Сохрани в ассоциативном массиве, говоря иначе. Хранить надо двумерный массив (имя поля, значение) на каждую запись в ассоциативном массиве (сиречь, хеше).

SiMM, ну конечно, конечно я брежу... Куда уж нам до великих и могутных... Гы-гы.
 

Novice

Новичок
Всем спасибо

Извините мужики, я тупил...
Все-таки нельзя на праздники работать :)

Особенно с хешем прогнал :)

Всем спасибо, разобрался, тред закрыт
 

neko

tеam neko
ничего страшного, ты в этом треде не единственный кто с ним прогнал
 
Сверху