2

主に (ImageID, imageName)、( ImageID | Tags )、および (tagID, tagName) の 3 つのテーブルを持つデータベースがあります。

そのため、各画像には多くのタグを関​​連付けることができます。1 つの画像を選択して効率的にスケーリングし、最も類似した次の x 画像を見つけるにはどうすればよいですか (同じタグが関連付けられています)。

これらはすべて、javascript、ajax、および php を使用して Web 上で行われます。これにアプローチする方法についての提案やヒントをありがとう!

編集:

はいMysql

形式は ( Table ) および ( ROW | ROW ) でした

IMAGEID、TAGID は主キー

そうです、スペースを節約するために IMAGEIDS と TAGIDS の正規化されたインデックスがあります。

画像 A に画像 B と共通の 10 個のタグのうち 10 個があるかどうかを取得しようとしています。10 個のタグのうち 6 個が共通している画像 C よりも高く返されます。

あいまいで申し訳ありません.私はサイトを開発しているので、私が持っているものでそれを行うことが不可能な場合は、キー、外部キーなどを追加できます. そして、それは1つの巨大なSQLステートメントで実行する必要はありません。最初の行を他のすべての行と一度に1つずつ比較して、ao(n ^ 2)の状況に陥りたくないだけです。

4

2 に答える 2

2

残念ながら、この設計は実際にはあまりスケーラブルではありません。ある画像のタグを他のほとんどすべての画像のタグと実際に比較するからです。

それはコード化可能であり、過度にスケーラブルではありません。(数百枚の画像?すばらしい!数万枚?検索速度を測定できるようになります。)

SELECT
  allImage.ImageID,
  COUNT(*)           AS commonTags
FROM
  image_tag    AS allImage
INNER JOIN
  image_tag    AS myImage
    ON allImage.TagID = myImage.TagID
WHERE
  myImage.ImageID = 123
GROUP BY
  allImage.ImageID
ORDER BY
  COUNT(*) DESC

次に、LIMITまたはTOP(SQLのフレーバーに応じて)を使用して、最初の(N)画像のみを選択します。

注:これは、1行の1つのフィールドに保持されている文字列内の画像のすべてのタグがないことを前提としています。その場合、実際にはデータを正規化して(ImageID,TagID)行ごとに1つにする必要があります。

于 2012-04-27T17:00:46.693 に答える
1

速度を上げるために、最初の 2 つのテーブルに ImageID のインデックスを作成します。次に、単純な SELECT WHERE クエリを使用します。

于 2012-04-27T16:54:50.513 に答える