Структура Best DB (MySQL): статьи, содержащие избранные теги - PullRequest
3 голосов
/ 23 мая 2009

Я создал новостной сайт: - Статьи показаны на первой странице, упорядочены по дате. Сначала самый новый. - Новости находятся в таблице «новости» с полями «id», «title», «text» и некоторыми другими. - Все статьи помечены 1-5 соответствующими тегами. - Теги находятся в таблице «теги» с полями «id», «tag», «article» и некоторыми другими. - Поле "article" of "tags" соответствует полю "id" of "news".

Теперь я хочу дать пользователю возможность добавлять теги в его «список избранных тегов». Тогда пользователь должен видеть только новостные статьи, содержащие один из избранных тегов.

Предполагая, что пользователь Боб выбрал теги "Барак Обама", "НБА", "Нью-Джерси" и "Собаки". Он должен видеть только статьи, содержащие хотя бы один из этих четырех тегов.

Как я могу написать скрипт PHP / MySQL, который этого добивается? Я думаю, что моя структура базы данных не подходит для этой цели, не так ли? Я должен был бы сделать запросы к БД, как это:

"ВЫБРАТЬ * ИЗ НОВОСТЕЙ, ГДЕ ИДЕНТИФИКАЦИЯ (ВЫБРАТЬ статью из тегов ГДЕ тег ВНУТРИ ('barack obama', 'nba', 'new jersey', 'dogs'))"

Этот запрос будет выполняться долго, не так ли? Должна быть структура базы данных, которая будет более подходящей, чем моя. У вас есть идея для этой проблемы? Какая структура БД мне нужна и какие запросы я должен использовать?

Надеюсь, вы мне поможете. Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 23 мая 2009

Следующее ни в коем случае не является исчерпывающим / окончательным, но оно должно привести вас в правильном направлении.

Таблица:

news
=====
id
title
text

tag
===
id
tag

tag_map
=======
tag_id
news_id

favorite_tags
=============
user_id
tag_id

Запрос

SELECT * 
FROM favorite_tags
JOIN tag_map ON favorite_tags.tag_id = tag_map.tag_id
JOIN news ON tag_map.news_id = news.id
WHERE favorite_tags.user_id = $userid
1 голос
/ 23 мая 2009

Производительность запроса (будь то в вашем подходе под-выбора или более элегантном подходе Фрэнка Фармера на основе соединений) будет в основном зависеть от индексов. Просто помните, что MySQL использует только один индекс на таблицу, и правильный набор индексов (в зависимости от запроса, который вы хотите оптимизировать) неизменно становится довольно очевидным ...

...