【发布时间】:2011-09-22 15:40:58
【问题描述】:
我有数百万首歌曲,每首歌曲都有其唯一的歌曲 ID。对应于每个歌曲 ID,我有一些属性,如歌曲名称、艺术家姓名、专辑名称、年份等。
现在,我已经实现了一种机制来找出两首歌之间的相似度。 它给了我一个介于 0 - 100 之间的值。
所以,我需要向用户展示类似的音乐,而这不能在运行时完成。我需要对每首歌曲之间的相似度值进行预处理。
因此,如果我创建一个具有三个属性的数据库,
song1, song2, similarity
我将拥有 n*n 条记录,其中 n 是歌曲的数量。
每当我想获取相似的音乐时,我都需要执行这个查询:
SELECT song2 WHERE song1 = x AND similarity > 80 ORDER BY similarity DESC;
请提出一些建议来维护这些信息。
谢谢。
【问题讨论】:
-
那么你能预见到每次检索顺序小于80的歌曲的需要吗?如果没有,为什么要记录呢?如果低于 80 怎么办?
-
我可以,但是因为我有这个函数 getSIMILARITY(songid1, songid2),它给了我相似性。但是如果我在运行时这样做,将会有很多数据库查询。因为我需要找到前 20 首相似的歌曲。为此,我需要提取每首歌曲的每个相似性。
-
我认为最好预先计算歌曲之间的相似度值,但它不会是 n*n 记录,因为您需要为每一对计算一次相似度。换句话说,如果你已经计算了song1-song2之间的相似度,你就不需要对song2-song1进行计算了。而且你也不需要自己计算歌曲。
标签: php mysql database database-design data-structures