我有一个数据库,主要包含 3 个表:(ImageID, imageName)、( ImageID | Tags) 和 (tagID, tagName)
因此每个图像可以有许多与其关联的标签。我如何有效且可缩放地选择 1 个图像并找到下一个最相似的 x 个图像(具有与其关联的相同标签)
所有操作均使用 javascript、ajax 和 php 在网络上完成。感谢您提供有关如何解决此问题的任何建议和提示!
编辑:
是Mysql
格式为(表)和(行 | 行)
IMAGEID、TAGID为主键
所以,是的,有一个 IMAGEIDS 和 TAGIDS 的标准化索引来节省空间。
我试图确定,如果图像 A 与图像 B 的 10 个标签中有 10 个相同,则返回的值将高于图像 C,而图像 C 的 10 个标签中有 6 个相同。
很抱歉含糊不清。我正在开发该网站,因此如果无法用我所拥有的来做到这一点,我可以添加键、外键等。而且它不必在一个巨大的 SQL 语句中完成,我只是不想通过一次将我的第一行与每隔一行 1 进行比较而陷入 o(n^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) 个图像。
注意:这假设您没有在一行的一个字段中保存的字符串中包含图像的所有标签。如果这样做,您确实应该将数据规范化为每行一个(ImageID,TagID)
,
关于php - 如何有效地将 1 行与数据库中的所有其他行进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10354733/