2

我有一个主要包含 3 个表的数据库,(ImageID,imageName),(ImageID | Tags)和(tagID,tagName)

因此,每个图像都可以有许多与之关联的标签。我将如何有效且可扩展地选择 1 张图像并找到最相似的下 x 张图像(具有与其关联的相同标签)

全部使用 javascript、ajax 和 php 在网络上完成。感谢您提供有关如何解决此问题的任何建议和提示!

编辑:

是的

格式为 ( Table ) 和 ( ROW | ROW )

IMAGEID、TAGID 为主键

所以是的,有一个 IMAGEIDS 和 TAGIDS 的标准化索引来节省空间。

我想知道如果图像 A 与图像 B 有 10 个标签中的 10 个,它的返回值将高于图像 C,它有 10 个标签中的 6 个。

很抱歉模棱两可。我正在开发网站,所以我可以添加键、外键等,如果它不可能用我拥有的东西来做的话。而且它不必在一个巨大的 SQL 语句中完成,我只是不想通过一次将我的第一行与每隔一行 1 进行比较来进入 ao(n^2) 的情况。

4

2 回答 2

2

不幸的是,这种设计实际上并不是非常可扩展的。仅仅是因为您确实会将一张图像的标签与几乎所有其他图像的标签进行比较。

它是可编码的,只是不太可扩展。(100 张图片?太棒了!数万张?您将能够测量查找速度。)

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) 个图像。

注意:这假设您没有将字符串中的图像的所有标签保存在一行的一个字段中。如果你这样做了,你真的应该将数据标准化为(ImageID,TagID)每行一个,

于 2012-04-27T17:00:46.693 回答
1

我会在前两个表中创建 ImageID 的索引以提高速度。然后使用一个简单的 SELECT WHERE 查询。

于 2012-04-27T16:54:50.513 回答