Я создал новостной сайт: – статьи показаны на первой странице, упорядоченной по дате. Новейший первый. – Новости находятся в таблице «новости» с полями «id», «title», «text» и некоторыми другими. – Все статьи отмечены 1-5 соответствующими тегами. – Теги находятся в таблице «теги» с полями «id», «tag», «article» и некоторыми другими. – Поле «статья» «тегов» подходит к полю «id» из «новостей».
Теперь я хочу дать пользователю возможность добавлять теги в свой список избранных тегов. Тогда пользователь должен видеть только статьи новостей, содержащие один из предпочтительных тегов.
Предполагая, что пользователь Боб предпочитает теги «barack obama», «nba», «new jersey» и «dogs». Он должен видеть только статьи, содержащие хотя бы один из этих четырех тегов.
Как я могу кодировать скрипт PHP / MySQL, который достигает этого? Я думаю, что моя структура базы данных не подходит для этой цели, не так ли? Я должен был бы сделать запросы БД следующим образом:
"SELECT * FROM news WHERE id IN (SELECT article FROM tags WHERE tag IN ('barack obama', 'nba', 'new jersey', 'dogs'))"
Этот запрос длится долго, не так ли? Должна быть структура базы данных, которая более подходит, чем моя. У вас есть идея по этой проблеме? Какая структура БД мне нужна и какие запросы я должен использовать?
Я надеюсь, что вы можете мне помочь. Заранее спасибо!
Следующее отнюдь не является исчерпывающим / окончательным, но оно должно заставить вас двигаться в правильном направлении.
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
Производительность запроса (будь то в подходе подбора или в более элегантном соединении Фрэнка Фармера) будет в основном зависеть от индексов. Просто помните, что MySQL использует только один индекс для таблицы, и правильный набор индексов (в зависимости от запроса, который вы хотите оптимизировать) неизменно становится довольно очевидным …