1

私はこのようなタグテーブルを持っています:

TAG ID | TAG_NAME | IMAGE_ID 

ex: 
1 | FUNNY | 10 <br />
2 | DOG   | 10
3 | SUNNY | 10 
4 | JULY  | 10 

また、画像テーブル内の画像に関連付けられているすべてのタグへの参照を保持します

IMAGE_ID | IMAGE_NAME | IMAGE_TAGS ( varchar(255) utf8_general_ci )     

ex: 
10 | dog.jpg | FUNNY,DOG,SUNNY,JULY 

画像テーブルのタグ列の理由は、画像が取得された場合、タグテーブルに浸かることなく、関連するすべてのタグも取得できるようにするためです。しかし、何らかの理由で私はそれを考え始めています冗長性を減らし、そのタグに関連付けられていることを確認するために、タグテーブルからすべての関連付けられたタグを取得するのが最善です(削除または削除された可能性がありますが、データが一致しません)-
しかし、私もそれを感じますタグの列を保持するのが有益かもしれません..列を保持するかドロップするかがわかりません..私はこれを考えすぎていますか?

4

2 に答える 2

4

はい、image_tags列を削除する必要があります。

カンマ区切りのデータを保存すると、データベースエンジンに付属しているすべてのインデックス作成と整合性の良さが失われます。これが、SQLアンチパターンと見なされる理由です。

タグテーブルにもimage_id列がない可能性があります。このスキーマの使用を検討してください。

tags
---
tag_id *
tag_name

images
---
image_id *
image_name 

imagetags
----
it_image_id *
it_tag_id *

各画像のタグはam:nテーブルに保持されますimagetags。外部キーの制約は、データの整合性をさらに強化するのに役立ちます。

于 2013-01-26T18:35:18.053 に答える
2

タグテーブルを再設計する必要があります。リレーショナルデータベースフォームでは、各列に1つの値のみを指定する必要があります。これは、各列に1つのタグのみを含める必要があることを意味します。リレーショナルデータベースはこのように作られています。画像に効率的JOINにタグを付けるためON

>画像
id | image_name
1 dog.jpg

> image_tag
image_id | 鬼ごっこ
1面白い
犬1匹
1晴れ

テーブルimage_id, tagにプライマリ複合キー()があるため、タグの代理キーは必要ありません。image_tag

于 2013-01-26T18:32:58.873 に答える