【问题标题】:How would you compare 1 row to all other rows in a database efficiently您如何有效地将 1 行与数据库中的所有其他行进行比较
【发布时间】:2012-04-27 16:49:27
【问题描述】:

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

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

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

编辑:

是Mysql

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

IMAGEID、TAGID 为主键

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

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

抱歉含糊不清。我正在开发网站,所以如果无法使用我所拥有的东西,我可以添加键、外键等。而且它不必在一个巨大的 SQL 语句中完成,我只是不想通过一次将我的第一行与每隔一行 1 进行比较而陷入 o(n^2) 的情况。

【问题讨论】:

  • 每个表有哪些索引和外键可用?
  • 我认为您需要更清楚地了解“下一张最相似的图片”。您是否只想按共同标签的数量对图像进行排名?或者更复杂的东西?或者,如果许多图像具有相同数量的共同标签,那么这些图像应该如何优先排序?
  • 第二张表 ( ImageID | Tags ) 中有什么内容。标签是否包含以空格分隔的标签名称列表?如果是这样,你就在一个糟糕的地方

标签: php sql


【解决方案1】:

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

它是可编码的,只是不太可扩展。 (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)

【讨论】:

  • 我正在写一个非常相似的查询,但我认为标签被去规范化
  • @ConradFrix - 我在回答的最后已经注意到了这一点。如果是,我不会写替代查询;)
  • 什么??先生,即使您不知道 OP 正在使用什么数据库或者它甚至需要它(谁知道 image_tag.Tags 中的内容),您也不想将拆分功能合并到您的答案中,这很令人愤慨;)跨度>
【解决方案2】:

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

【讨论】:

  • 您想编写这个“简单的 SELECT WHERE 查询”来演示吗?除非我误解了,否则它并不像你暗示的那么简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
相关资源
最近更新 更多