データエンティティを、それらが何であるか、そしてそれらが何を意味するかによって分離するだけです。 title
の場合 、tags
およびfile
2つのエンティティがあるようです:
Picture
----------
ID
Title
File
Tag
----------
ID
Name
つまり、title
およびfile
(あなたの場合、それをファイルシステム上のファイルへのパスとして保存していると思いますが、これは問題ありません)1つのエンティティとtag
独自の独立したエンティティです。各Picture
複数のtags
を持つことができます sおよび各tags
複数のPicture
に関連付けることができます s、それは多対多の関係です。したがって、通常、データベースでそれらをリンクするためのサポートする非エンティティテーブルを作成します。
PictureTagRelationship
----------
PictureID
TagID
これにより、Picture
を取得できます :
SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id
とそのタグ:
SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id
(1つのクエリでいくつかの方法でそれを行うこともできます。簡単にするために2つに分割します。2つのクエリは大したことではありませんが、データベースアクセスのオーバーヘッドを高度に最適化する必要がある場合、または本当に単一のクエリにしたいので、何かできると確信しています。)
または、特定のタグのすべての写真を取得できます:
SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id
この設計に加えることができる他の微調整や、データを表示およびレポートするための他の多くの方法があります。しかし、これらすべてにおいて1つの重要なポイントがあります:
データの保存にカンマ区切りのリストを使用しないでください。 各データエンティティを独自の構造に正規化し、それに応じて保存します。リレーショナルデータベースは、そのようなことには最適です。ただし、個別のデータ要素を区切り文字列として格納すると、それらの要素の分離が失われます。これにより、そのデータの報告がより困難になり、データとのやり取りがより困難になります。ロット 更新するのがより難しく、それをサポートする必要のある他の人には直感的ではありません。
データベース内の1つのフィールドには、1つの情報のみを格納する必要があることを覚えておいてください。 1つの情報。複数の情報を1つのフィールドに詰め込む必要がある場合は、リレーショナルデータベースを適切に使用していません。