您将如何有效地将 1 行与数据库中的所有其他行进行比较


How would you compare 1 row to all other rows in a database efficiently

我有一个数据库,主要有3个表,(图像ID,图像名称),(图像ID |标记 ) 和 (标记 ID, 标记名称)

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

所有这些都是使用javascript,ajax和php在Web上完成的。感谢您对如何处理此问题的任何建议和提示!

编辑:

是的,我的sql

格式为 ( 表 ) 和 ( 行 |行 )

IMAGEID、TAGID 是主键

所以是的,有一个规范化的 IMAGEID 和 TAGID 索引来节省空间。

我正在尝试获取图像 A 是否具有与图像 B 共有的 10 个标签中的 10 个,它将返回高于具有 6 个共同标签中的 10 个的图像 C。

对不起,模棱两可。我正在开发网站,所以如果无法用我拥有的东西来做,我可以添加键、外键等。而且它不必在一个巨大的 SQL 语句中完成,我只是不想通过一次将我的第一行与其他每行 1 进行比较来陷入 o(n^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)

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