mysql - 满足多种用户偏好的数据库设计?

标签 mysql database postgresql database-design

我正在为一个约会网站设计一个数据库,该网站要求用户选择合作伙伴偏好,从而驱动匹配过程。本质上,我想要的是用户能够为每个首选项设置单个或多个选项。例如,合作伙伴位置可以仅限于纽约,也可以是纽约、波士顿、迈阿密、洛杉矶等。我想知道我心中的想法是否是首选的做事方式。

这就是我想做的事情。

Users Table |    User_Options Table    |    Options Table    | Preferences Table
            |                          |                     |           
ID | Name   | ID | User_id | Option_ID | ID | Name | Pref_id | ID | Name 
1. | John   | 1. |  1.     |   1.      | 1. |  NY  |   1     | 1. | Location
            |                          |                     |

这样每个选项都有很多选项,每个选项都有很多用户。我已将选项表链接到首选项,以便我可以根据首选项类别调用用户。我希望 user.location 或类似的东西能给我用户选择的所有位置选项。我的偏好表将包括宗教、地点、饮食、饮酒习惯等。有更好的方法吗?

最佳答案

查看您的解释,我建议拆分两个实体,即:偏好和位置。如果您将在首选项表中包含位置,您可能需要标记列来标记此首选项是位置还是不是位置。我假设系统应该找到具有相同偏好的匹配,即爱好、宗教居住在理想的区域,而不是具有相同偏好居住在某些区域。因此我建议稍微改变一下架构。

enter image description here

然后,您可以简单地查询另一个用户喜欢的某个特定位置以及他选择的偏好的匹配项(如果我们正在根据他/她喜欢的位置和偏好查找 user_id 1 的用户的匹配项):

select r.user_id
from
(select uu.user_id from users u
right join user_location ul using (user_id)
right join users uu on uu.location_id = ul.location_id
where u.user_id = 1) r
inner join user_preference up on up.user_id = r.user_id
inner join user_preference up1 on up1.preference_id = up.preference_id and 
       up1.user_id = 1
group by r.user_id;

另一个问题:如果您在考试中使用像 User_Options 这样的联结表 - 则无需创建人工 key 。在这种情况下,复合主键(user_id 和 option_id)将更加合理。 (查看我的示例中的 2 个联结表 - user_locations 和 user_preferences)。

关于mysql - 满足多种用户偏好的数据库设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096724/

相关文章:

c# - mysql表转化为List

php - 使用自动增量值将一张表复制到mysql中的新表

c# - mongo C# 通过id删除多条记录

python - PyMongo 游标以最快的方式列出可能

postgresql - 在 PostgreSQL 中创建序列时出错

php - 是否可以制作单个 mysql 连接页面

java - 尝试将 MySQL 服务器连接到 Spring Boot App STS 时出现多个错误

sql - 如何在 sql server 2005 中使用检查约束

sql - 在Where in () 中传递查询

performance - Postgres 不在性能中