我看到这样的东西:
questions 是要回答的问题列表。 question_type 是一个枚举,指示预期的答案类型(例如,从 question_choices 查找、日期、数字、文本等) - 您希望输入的任何类型的数据。这与此表中的其他列一起,可以驱动您的输入表单。
question_answers 包含预定义的问题答案列表(例如预定义的宗教列表、头发颜色或眼睛颜色等)。这可用于在您的输入表单上构建值的下拉列表。
users 很容易解释。
user_characteristics 包含我对问卷的回答列表。 weight 列表明寻找我的人有相同的答案对我来说有多重要。如果答案来自从question_choices 表构建的选择列表,则将填充question_choices_id。否则 question_choices_id 将为 NULL。 value 列的情况正好相反。如果答案来自从question_choices 表构建的选择列表,value 将为 NULL。否则,value 将包含用户手工制作的问题答案。
user_preferences 包含我正在寻找的问卷的答案。 weight 列表明我正在寻找的人有相同的答案对我来说是多么重要。 question_choices_id 和 value 列的行为与 user_characteristics 表中的行为相同。
查找匹配项的 SQL 可能类似于:
SELECT uc.id
,SUM(up.weight) AS my_weighted_score_of_them
,SUM(uc.weight) AS their_weighted_score_of_me
,SUM(up.weight) + SUM(uc.weight) AS combined_weighted_score
FROM user_preferences up
JOIN user_characteristics uc
ON uc.questions_id = up.questions_id
AND uc.question_choices_id = up.question_choices_id
AND uc.value = up.value
AND uc.users_id != up.users_id
WHERE up.users_id = me.id
GROUP BY uc.id
ORDER BY SUM(up.weight) + SUM(uc.weight) DESC
,SUM(up.weight) DESC
,SUM(uc.weight) DESC
出于性能原因,建议使用关于 user_characteristics(id、question_id、question_choices_id、value 和 user_id)的索引和关于 user_preferences(id、question_id、question_choices_id、value 和 user_id)的索引。
请注意,上述 SQL 将为每个用户返回一行,但发出请求的用户除外。这当然是不可取的。因此,可能会考虑添加HAVING SUM(up.weight) + SUM(uc.weight) > :some_minimum_value - 或其他方式来进一步过滤结果。
进一步的调整可能包括只返回与我一样重视答案的人(即他们的特征体重>=我的体重偏好体重。