将可选数据存储在单独的表中或作为列存储

时间:2015-08-17 13:13:09

标签: mysql sql database

我有一个User表,用户可以使用Google或Facebook登录。为了让他们再次登录,我想保存一个social_id列,一个用于Google,另一个用于Facebook,以便用户可以再次登录。

并非每个用户都会使用其社交帐户登录,因此存在传统的电子邮件密码选项。

在性能,存储和可扩展性方面,最好是:

  • social_id表中的User列是可选的

  • 有一个名为Social的新表,其中包含一个主键,两个social_id,一个用于Facebook,一个用于Google,一个外键用于链接主键在User表中。

感谢。

2 个答案:

答案 0 :(得分:1)

我会选择下面指出的第二个选项,因为usersocial media主要是一对多的关系;因为一个用户可能有许多社交媒体注册,例如facebook / Google,并且可能选择使用不同的社交媒体身份验证进行登录。

有一个名为Social的新表,其中包含一个主键,social_id和一个链接User表中主键的外键。

另一方面,如果用户只能使用一个社交媒体帐户进行登录,那么在user表格中设置可选的可为空的列非常有意义(这是您的第一选择)。

答案 1 :(得分:1)

您的social_id :: user关系是0-n :: 1(多对一)。这种情况需要一个单独的表(除非你要对你的另一个表进行反规范化,这不是一个好主意。)。

因此,您需要一个包含以下列的social表:

user_id      (FK to the Users table)
social_type  (1 = fb, 2 = goog, 3 = linked in etc).
social_id    the id from the network mentioned in social_type

前两列合在一起将是您的主键。要获取特定用户的Facebook ID,您将使用此查询

 SELECT s.social_id
   FROM Users
   LEFT JOIN social ON Users.user_id = social.user_id AND social.social_type=1
  WHERE Users.name = 'zuck'

如果指定用户没有适当的social_id或您需要的值,则会返回NULL。

我建议不要在social表中添加额外的主键id列,因为组合主ID更有效。例如,它允许您使用MySQL的upsert更改社交值:INSERT .... ON DUPLICATE KEY UPDATE ...

我建议强烈反对在表格的每一行为两个不同的社交网络添加两列。因为,有三个或更多的社交网络。