2009-07-11 10 views
1

私は実際の "クラウド"ではなく、データベーススキームのヘルプを探しています。PHPタグクラウド

ユーザーが画像を送信して画像にタグを付けるサイトでは、最適なパフォーマンスを得るためにデータベースをどのように設定する必要がありますか?

私は

ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

を考えていたので、私は、画像をアップロードすると仮定し、「トロント、寿司、夏」それをタグ付け。

クエリは次のようになります。

INSERT INTO tags (tag, imageID) VALUES ('$tag[0]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[1]', $imageID); 
INSERT INTO tags (tag, imageID) VALUES ('$tag[2]', $imageID); 

次に取得するために、私はIMAGEID = $ imagIDタグから*を選択すると思います。

これに欠陥がありますか?

答えて

3

イメージ用の1つ、タグ用のテーブル、イメージIDとタグIDの組み合わせを持つ第3のテーブルの2つのテーブルの間に、HABTM(has has and many to many)の関係が必要です。この方法では、イメージが持つことができるタグの数や、タグが属することができるイメージの数を制限することはなく、重複はありません。

+0

私はこれをやってしまった。主に私はこれがSoFのやり方であると感じているので、そのタグを最初に作成したユーザーなど、そのテーブルに追加の列を追加することができます。 – sqram

3

このアプローチでは、同じタグを共有する画像以外にデータベースに重複したエントリがある以外は、実際の問題はありません。しかし、正規化しようとすると、タグそのものを保持する別のテーブルへの重複した参照を含むテーブルになります。この場合、時間の無駄に見えます(MySQLのコーディング、結合、およびトラバーステーブル)。

私はあなたの列の順序ですが、私は考えていた小さな最適化を1つ。 'int'をグループ化すると、MySQLの幅が固定されているので、int varchar intよりもその速さで少しずつ検索することができます。

1

私は別のタグテーブルを使用します。 TABLEタグ: tag_id- int型(11)、ユニークな、auto_incremenet タグ - VARCHAR(20)

TABLE image tags: 
ID - int(11), unique, auto_incremenet 
tag - varchar(20) 
imageID - int(11) 

をタグであるならば、私はアップになります既に存在し、IDのみを挿入します。

INSERT INTOタグ(タグ、imageID)VALUES( '$ tag_id [0]'、$ imageID); INSERT INTOタグ(タグ、画像ID)VALUES( '$ tag_id [1]'、$ imageID); INSERT INTOタグ(タグ、イメージID)VALUES( '$ tag_id [2]'、$ imageID);

このように、同じタグが付いている画像は、同一のタグIDを共有するだけでなく、同じvarcharコンテンツを共有するため、簡単に見つけることができます。 もちろん、タグを小文字に変換して特殊文字などを置き換える必要があります。

1

imageIDフィールドにインデックスがあることを確認してください。

2

タグフィールドをchar(20)に変更すると、パフォーマンスが向上しますか?テーブル全体が固定幅になり、固定幅テーブルで実行されるクエリは一般的に高速になります。そのため、最近のDB設計の研究を信じるようになりました。

20文字に固定すると、テーブルが占有する領域のオーバーヘッドが少なくなりますが、このような小さなテーブルでも、ファイルサイズが少し大きくなることは大きな問題ではありません。

実際には非常に小さなテーブルなので、varchar(20)とchar(20)の違いを見る前に、たくさんのデータが必要になると思います。

単なる考えです。 :)

関連する問題