2009-05-22 12 views
3

私はニュースサイトを構築しました: - 記事はフロントページの日付順に表示されます。最新のものが最初です。 - ニュースは、 "id"、 "title"、 "text"などのフィールドを持つニュース "テーブル"にあります。 - すべての記事に関連するタグが1〜5つタグ付きです。 - タグは、 "id"、 "tag"、 "article"などのフィールドを持つテーブル "tags"にあります。 - 「tags」のフィールド「article」は、「news」のフィールド「id」に適合します。ベストDB(MySQL)の構造:お気に入りのタグを含む記事

ここで、ユーザーに「お気に入りのタグリスト」にタグを追加する機会を与えたいと思います。次に、ユーザーは好評のタグの1つを含むニュース記事のみを表示する必要があります。

ユーザBobが「barack obama」、「nba」、「new jersey」および「dogs」というタグを好んでいると仮定します。彼はこれらの4つのタグの少なくとも1つを含む記事だけを見るべきです。

これを実現するPHP/MySQLスクリプトをどのようにコード化できますか?私のデータベース構造はこの目的には十分ではないと思いますか?

"SELECT * FROM news WHERE ID IN( 'barack obama'、 'nba'、 'new jersey'、 'dogs')のようなDBクエリを作成する必要があります。 "

このクエリは長い間実行されるでしょうか?私よりも適切なデータベース構造が必要です。この問題のアイデアはありますか?どのDB構造が必要なのか、どんなクエリを使用する必要がありますか?

私があなたを助けてくれることを願っています。前もって感謝します!

答えて

8

以下は完全なものではありませんが、正しい方向に進むはずです。

テーブル:

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 
+0

この素早く良い答えをありがとうございます。私は最後の質問があります:どのフィールドにインデックスを設定すべきですか?私は、「ニュース」のプライマリとして「id」を、プライマリとして「id」、プライマリとして「tag」、「tag_id、news_id」を一意に「tag」、「tag_map」を「news_id」、 、最後に "user_id、tag_id"をプライマリ、 "tag_id"を "favorite_tags"に設定します。これは正しいです? – caw

+0

大雑把な表情だが、テーブルを作成して「EXPLAIN SELECT」などを行うことで二重にチェックする。 –

+0

これは、tag_map.tag_id、news.id、およびfavorite_tags.user_idにインデックスを付けたいと思うクエリ。 –

1

クエリのパフォーマンス(かどうか、あなたのサブ選択的アプローチ、またはフランク・ファーマーズで、よりエレガントに参加ベースの1)を主指標に依存します。 MySQLはテーブルごとに1つのインデックスしか使用しないことを覚えておいてください。最適化するクエリに応じてインデックスの適切なセットが常に明らかになります。

+0

ありがとう、私はフランクファーマーの答えにインデックスに関する質問を追加しました。 – caw

関連する問題