我正在根据已回答的问题在用户匹配的网站上工作。
每次用户(例如,访问其他用户个人资料页面)时,都会计算匹配百分比。因此,匹配百分比不会存储在数据库中,并且会一直重新计算。
现在我想建立一个用户可以搜索最佳匹配的搜索。
我的问题是,最有效的方法是什么?
如果我有50k用户,我必须按匹配百分比排序。我是否必须计算一个和另外50k用户之间的每个匹配百分比,然后创建一个列表?听起来对我来说效率低下。这不会大大减慢应用程序的速度吗?
我希望有人可以帮助我,因为这让我很头疼。
编辑: 为了清楚一点,这里是我的用户,问题,答案,user_answers和accepted_answers的数据库模型:
Tables:
Users(:id, :username, etc.)
Questions(:id, :text)
Answers(:id, :question_id, :text)
UserAnswers(:id, :user_id, :question_id, :answer_id, :importance)
AcceptedAnswers(:id, :user_answer_id, :answer_id)
Questions <-> Answers: one-to-many
Questions <-> UserAnswers: one-to-many
Users <-> UserAnswers: one-to-many
UserAnswers <-> AcceptableAnswers: one-to-many
因此,有一个问题列表(可能回答这个问题),用户将这些问题的“UserAnswers”分配给他们,分配问题对他们的重要程度以及他们从其他用户接受的答案。
然后,如果您使用User1和User2,您会查找常见的已回答问题,因此UserAnswers中的question_id是相同的。他们有10个共同的问题。 User1将重要性值10给予前五个问题,将重要性值20给予其他五个问题。用户2给出了两个20值和三个10值问题的可接受答案。共70分。最高可到达的分数当然是20x5 + 10x5 ...所以User2达到了70/150 * 100 = 46,66%......相反,User1达到了User2分配给这些问题的点的数量相同。然后通过几何平均值合并这两个百分比:百分比百分比1 *百分比2 ...这给出了最终匹配百分比
答案 0 :(得分:1)
我建议您保留数据库中所有用户的匹配百分比。创建一个表matches
,其中包含一对用户的匹配百分比。您无需为数据库中的所有用户对保存匹配百分比。仅当有两个用户已经接受其他用户的回答时,才会为两个用户计算有效匹配百分比。大多数用户不接受大多数其他用户的答案。
我建议您在用户访问其他用户个人资料时计算并保存匹配百分比。但是当用户接受其他用户的答案时。这将确保您不进行任何不必要的计算,并且对一对用户的匹配百分比始终新鲜。
答案 1 :(得分:1)
@ Wassem的答案似乎就在你的问题上。我还建议您采用一种方法,在新答案和新接受的答案上更新百分比。
我创建了一个仅限db的解决方案(gist),它可以工作,但是中间表的复杂性会增加。
理想情况下,您应该再创建两个表,一个用于重要性,另一个用于百分比匹配。当用户为答案分配/更新重要性或将某些答案标记为可接受时,您应该在这些表中创建/插入/删除行。您还可以利用delayed_job或rescue来更新特定操作的后台表格。
您可能需要运行sqls一次,同时在两个新表中同步数据,因为并发会导致不一致,并且在某些情况下也会由于更新操作的顺序。
接受答案的更新应该是直接的,因为您只需要更新一对。但是,如果有人重视某个问题,可能会有很多计算,很多百分比可能需要更新。为避免这种情况,您可以选择仅使用每对的重要性维护表,在需要时更新它并动态计算实际百分比(在db off-course中)。