7

画像タグの可変サイズのリストをSQLデータベースに保存し、タグに基づいて画像をデータベースで検索できるようにしたい。現在、データベースからタグリストを取得し、クエリタグが配列に含まれているかどうかを確認しています。タグを引き出した後にphpで行うのではなく、これらをSQLクエリとしてフォーマットする方法はありますか?

リストは、次の形式のコンマ区切り値として保存されます。

「晴れ、ビーチ、手のひら」-im1

「手のひら、雨、雲」-im2

「冬、雪、雪だるま、盗品」-img

クエリタグの和集合を取得できるようにしたいと思います。「beach、palms」のクエリはim1とim2を返す必要があります。

ありがとう

4

2 に答える 2

13

データベース内の区切りリストは避けたいと思うでしょう。これは、データベースを使用して構造化データを格納することの利点を打ち消します。代わりに、行ごとに1つのタグを使用して新しいテーブルを作成し、メインの画像テーブルから外部キーを使用してそのテーブルを参照する必要があります。

画像

  • id
  • image_name

タグテーブル

  • id
  • タグ名

Image_Tagsテーブル

  • image_id(画像テーブルの主キーを参照)
  • tag_id(タグテーブルの主キーを参照)

このようにして、次のようなクエリを実行できるようになります。

SELECT t.tag_name, i.image_name FROM image_tags it
    INNER JOIN images i on it.image_id = i.id
    INNER JOIN tags t on it.tag_id = t.id
WHERE t.tag_name in ('beach', 'palms')
于 2012-04-23T02:06:47.597 に答える
5

@dbasemanは良い答え(+1)を提供しましたが、それは少しやり過ぎかもしれません。タグについて知りたいのはその名前だけだとすると、テーブルが2つしかないモデルは、実際にはおそらくより適切に動作します(JOINが1つ少なくなり、データのクラスタリングが向上します)。

画像表:

  • id PK
  • image_name

image_tagテーブル:

  • tag_name PK
  • image_id PK、FK-> image

image_tagのPK内のフィールドの順序は重要です。{tag_name, image_id}クエリに必要なとおりに、データを適切にクラスター化する(つまり、同じタグを持つ画像を一緒に保持する)ために保持する場合は、次のようになります。

SELECT DISTINCT image.*
FROM image JOIN image_tag ON (image.id = image_tag.image_id)
WHERE image_tag.tag_name IN ('beach', 'palms') 

一方、タグの説明、タグの作成者なども必要な場合は、@ dbasemanのモデルで問題ありません。ただし、Image_Tags PKのフィールドの順序を入れ替えることを検討する場合を除きます(上記と同じクラスタリングの理由で)。

于 2012-04-23T21:54:35.160 に答える