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

  • Автор темы Автор темы Novice
  • Дата начала Дата начала

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')
............
)

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

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

Автор оригинала: Novice
структура их динамическая (неизвестно заранее сколько полей будет содержать новость
ИМХО, это заблуждение номер раз.
 
которое надо, во всяком случае, веско аргументировать.
 
articles: id title date author_id
authors: id value
Понадобиться ещё что-то - сделаешь
images:
id article_id ...
downloads:
id article_id ...
Ну и т.д.
PS: как раз собирался расписать ;)
 
Ну, случаи, как известно, разные бывают. Может так надо... :D

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

Если же вывод постранично делается, то для начала получи из первой таблицы список всех идентификаторов, которые нужно вывести на текущей странице. Потом из второй таблицы получи по полученному списку идентификаторов все нужные поля. И опять же захешируй их в многомерный массив.
 
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
захешируй их в многомерном массиве (ключ хеша -- это идентификатор новости).
Каким образом хешировать?
 
тебя чем-то пугают числа в которых присутствует цифра шесть?

но насчет удобства это да
неудобно будет как не крути
 
это нормально?

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

Но пугала цифра "6" :)
 
по этому вопросу имеет смысл проконсультироваться у священника
 
Это конечно все красиво и просто. Представь сайт хотя бы с 20 каталогами... Итого имеем ~60 таблиц?
это шутка такая?

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

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

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

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

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

Всем спасибо, разобрался, тред закрыт
 
ничего страшного, ты в этом треде не единственный кто с ним прогнал
 
Сверху