3

ニュース サイトを作成しました: - 記事は日付順にフロント ページに表示されます。まずは最新のもの。- ニュースは、フィールド「id」、「タイトル」、「テキスト」およびその他のフィールドを持つテーブル「ニュース」にあります。- すべての記事には、1 ~ 5 個の関連するタグが付けられています。- タグは、フィールド「id」、「tag」、「article」およびその他のフィールドを持つテーブル「tags」にあります。・「tags」の「article」フィールドは「news」の「id」フィールドに収まります。

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

ユーザー Bob が "barack obama"、"nba"、"new jersey"、"dogs" というタグを気に入ったとします。これら 4 つのタグの少なくとも 1 つを含む記事のみが表示されるはずです。

これを実現する PHP/MySQL スクリプトをどのようにコーディングできますか? 私のデータベース構造は、この目的には十分ではないと思いますか? 次のような DB クエリを作成する必要があります。

"SELECT * FROM news WHERE id IN (SELECT article FROM tags WHERE tag IN ('barack obama', 'nba', 'new jersey', 'dogs'))"

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

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

4

2 に答える 2

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
于 2009-05-22T23:13:37.500 に答える
1

クエリのパフォーマンス(サブ選択アプローチであろうと、Frank Farmerのよりエレガントな結合ベースのアプローチであろうと)は、主にインデックスに依存します。MySQLはテーブルごとに1つのインデックスのみを使用し、適切なインデックスのセット(最適化するクエリに応じて)は常に非常に明白になることを覚えておいてください...

于 2009-05-23T04:57:02.930 に答える