我目前正在开发一个网站,用户可以在其中根据属性(年龄、身高、城镇、教育等)搜索其他用户。我现在想在用户配置文件之间实现某种评级。评级是通过其自己的算法根据 2 个给定配置文件之间的相似性计算的。例如,用户 A 对用户 B 的评级“匹配评级”为 85,对用户 C 的评级“匹配评级”为 79。B 和 C 的评分为 94,依此类推....
用户应该能够搜索某些属性并按评级过滤结果。
由于评级因个人资料而异,而且还取决于进行搜索的用户,所以我不能简单地在我的用户表中添加一个字段并使用 ORDER BY。到目前为止,我想出了2个解决方案:
我的第一个解决方案是每晚进行一次批处理作业,计算每个可能的用户组合的评分并将其存储在单独的表中(user1、user2、rating)。然后我可以将此表与用户表连接起来,并按评级对结果进行排序。在做了一些数学运算后,我发现这个解决方案不能很好地扩展。
根据公式 n * (n - 1) / 2,10 个用户有 45 种可能的组合。对于 1.000 个用户,我突然不得不在我的评分表中插入 499.500 个评分组合。
第二种解决方案是让 MySQL 保持不变,并在我的应用程序中即时计算评级。这也不能很好地扩展。假设搜索应该只向 UI 返回 100 个结果(最高评分在顶部)。如果我有 10.000 个用户,并且我想搜索居住在纽约的每个用户(按评分排序),我必须将居住在纽约的每个用户加载到我的应用程序中(比如说 3.000),应用算法然后只返回前 100 名给用户。通过这种方式,我从数据库中加载了 2.900 个无用的用户对象,并在算法上浪费了 CPU,而没有对其进行任何操作。
有什么想法可以在我的 MySQL 数据库或 Web 应用程序中进行设计,以便用户可以与其他每个用户进行单独评分,从而使系统扩展到几千个用户之外?