我正在创建一个约会门户网站,我们将在其中询问用户大约 40-50 个问题,例如宗教、种姓、出生日期、食物偏好、吸烟/不吸烟。
我在询问有关用户偏好的类似问题,例如年龄范围、宗教偏好、吸烟偏好。
我有大约 30-40 个这样的偏好。
现在我想根据偏好集向用户显示匹配项。
我想知道应该如何设计 MySQL 表和索引。
我是否应该创建 1 个 user_preferences 大表并拥有所有偏好索引。
应该是多列索引还是合并索引。
我应该在不同的表中保留一组问题并在获取数据时加入它们吗?
米
我认为这可能是 EAV 的情况:
您应该能够按降序(从最匹配到最不匹配)获得匹配的用户对,类似于:
SELECT *
FROM (
SELECT U1.USER_ID, U2.USER_ID, COUNT(*) MATCH_COUNT
FROM USER U1
JOIN USER_PREFERENCE P1
ON (U1.USER_ID = P1.USER_ID)
JOIN USER_PREFERENCE P2
ON (P1.NAME = P2.NAME AND P1.VALUE = P2.VALUE)
JOIN USER U2
ON (P2.USER_ID = U2.USER_ID)
WHERE U1.USER_ID < U2.USER_ID -- To avoid matching the user with herself and duplicated pairs with flipped user IDs.
GROUP BY U1.USER_ID, U2.USER_ID
) Q
ORDER BY MATCH_COUNT DESC
这只是根据偏好的确切值匹配偏好。您可能希望为范围或类似枚举的值创建额外的“首选项”表,并相应地替换 P1.VALUE = P2.VALUE
。如果匹配的是USER表中的数据(比如用户的年龄是否在其他用户的首选年龄范围内),则可能还需要特殊处理。
请注意 {NAME, VALUE}
上的索引,它旨在帮助 P1.NAME = P2.NAME AND P1.VALUE = P2.VALUE
。 InnoDB 表是 clustered ,一个结果是二级索引包含 PK 字段的副本 - 在这种情况下导致索引 I1
完全 cover table 。 MySQL 是否会实际使用它是另一回事 - 一如既往地查看查询计划并衡量代表性数据......