【问题标题】:Relational database structure for storing multiple hobbies of a user存储用户多个爱好的关系型数据库结构
【发布时间】:2019-09-30 12:46:47
【问题描述】:

我正在尝试使用用户名/电子邮件、密码等基本详细信息以及他们各自的爱好(如阅读、运动、舞蹈等)来注册一些用户,然后再展示具有类似爱好的用户。当前架构看起来像这样。

Users

 - id 
 - email 
 - password 
 - country 
 - hobbies_id
hobbies

 - id 
 - user_id 
 - sports(values true/false) 
 - reading(values true/false)
 - dance(values true/false)

每个爱好在爱好表中作为一列放置。

如果我将爱好的数量从 3 个增加到 20 个,最优化的架构是什么? 另外,有人可以帮我查询以选择具有相似爱好/爱好的用户吗?例如,如果 John 喜欢阅读和运动,而 Kim 喜欢运动和舞蹈,那么他们的共同爱好就是运动。

提前致谢。

【问题讨论】:

  • 从用户表中删除 hobby_id。同样从爱好表中删除user_id。爱好本身就是一个实体,应该只存储与爱好相关的信息。创建用户和爱好之间的多对多映射表
  • 创建多个“相似”(爱好实体)列是一种 SQL 反模式。理想情况下,爱好表格应该有两件事(根据您当前的要求):hobby_idhobby_name

标签: mysql sql node.js database foreign-keys


【解决方案1】:

跟进@Madhur Bhaiya 的 cmets,我会用 3 张桌子来解决这个问题:

users
 - id 
 - email 
 - password 
 - country 

hobbies
 - id
 - name (sports, reading, dance, ...)

user_hobbies
 - user_id
 - hobbie_id

users 表是用户的主表(每个用户一条记录)。

hobbies 表是爱好的主表(每个爱好一条记录)。当新的爱好产生时,您不需要创建新的列,只需添加新的行即可。

user_hobbies 表将用户映射到爱好:它包含每个 user_id/hobbie_id 元组的一条记录。

【讨论】:

  • 对于这种情况,这显然是一个很好的解决方案,但我面临着类似的问题(为了简单起见,我将保留问题的架构)。现在您将如何设计它以便用户也可以创建新的爱好。那么在选择数据的时候,确保每个用户既能看到一般爱好,也能看到自己创造的爱好呢?
【解决方案2】:

我们可以用两个解决方案::

  • @GMB的解决方案
  • 删除了爱好表并将爱好数据仅保存到用户表中,采用 json 数据类型。

【讨论】:

  • 如果我们把它保存为json,那么获取它会不会需要很长时间?而且我已经考虑过存储在 JSON 中,但我在 stackoverflow 本身中读到这不是一个好方法。
  • 不,不需要很长时间来获取。什么是mysql版本?我正在使用 mysql 8。dev.mysql.com/doc/refman/8.0/en/json-function-reference.html
【解决方案3】:

为此,我建议您查看Database Normalization。这个问题应该通过实施第三范式(TNF)来解决。为此,您应该从users 表中删除hobby_id,并从hobbies 表中删除user_id。此问题的一种解决方案的规范化示例是创建一个使用user_idhobby_id 作为复合键的新表。见下文:

users:
  - id
  - email
  - password
  - country

user_hobby:
  - user_id
  - hobby_id

hobbies:
  - id
  - description
  - type

在这种情况下,user_hobby 表在usershobbies 之间将具有多对多关系。如果用户有多个爱好,他们将在user_hobby 表中将多个爱好链接到他们的 ID,但每个用户和爱好应该在各自的表中仅列出一次

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 2014-05-18
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多