1

実際の「クラウド」自体ではなく、データベース スキームに関するヘルプを探しています。

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

私が考えていた

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 のタグから * を選択します。

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

4

5 に答える 5

3

1 つは画像用、もう 1 つはタグ用、3 番目のテーブルは画像 ID とタグ ID の組み合わせを含む 2 つのテーブル間に HABTM (has and belongs to many) 関係を持つ必要があります。このようにして、画像が持つことができるタグの数やタグが属することができる画像の数を制限せず、重複がありません.

于 2009-07-11T21:21:44.127 に答える
3

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

私が検討したい小さな最適化の 1 つは、列の順序です。'int' をグループ化します。MySQL では固定幅であるため、int varchar int よりもその順序でわずかに高速に検索できます。

于 2009-07-11T21:22:36.247 に答える
1

別のタグ テーブルを使用します。 TABLE タグ: tag_id- int(11)、unique、auto_incremenet タグ - varchar(20)

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

次に、タグが既に存在するかどうかを調べて、ID のみを挿入します。

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

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

于 2009-07-11T21:24:07.570 に答える
1

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

于 2009-07-11T21:29:12.240 に答える