约会门户的Mysql表和索引设计

标签 mysql database database-design solr indexing

<分区>

我正在创建一个约会门户网站,我们将在其中询问用户大约 40-50 个问题,例如宗教、种姓、出生日期、食物偏好、吸烟/不吸烟。

我在询问有关用户偏好的类似问题,例如年龄范围、宗教偏好、吸烟偏好。

我有大约 30-40 个这样的偏好。

现在我想根据偏好集向用户显示匹配项。 我想知道应该如何设计 MySQL 表和索引。

我是否应该创建 1 个 user_preferences 大表并拥有所有偏好索引。 应该是多列索引还是合并索引。

我应该在不同的表中保留一组问题并在获取数据时加入它们吗? 米

最佳答案

我认为这可能是 EAV 的情况:

enter image description here

您应该能够按降序(从最匹配到最不匹配)获得匹配的用户对,类似于:

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 是否会实际使用它是另一回事 - 一如既往地查看查询计划并衡量代表性数据......

关于约会门户的Mysql表和索引设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18780884/

相关文章:

javascript - php 数组(数组)到 javascript

database - Prolog 数据库查询

mysql - 通过 tressshold 时触发 (MySQL)

php - 无法将从数据库中检索到的信息插入到表单中

design-patterns - 合并数据的数据库架构设计模式

mysql - MySQL表结构推荐

mysql - 如何一次插入和更新多个值

sql - MySQL:如何为所有时区选择 UTC 偏移量和 DST?

php - 如何在保持查询清晰有效的同时实现动态属性

MySQL查询设计问题