我有一个User
表,用户可以使用Google或Facebook登录。为了让他们再次登录,我想保存一个social_id
列,一个用于Google,另一个用于Facebook,以便用户可以再次登录。
并非每个用户都会使用其社交帐户登录,因此存在传统的电子邮件密码选项。
在性能,存储和可扩展性方面,最好是:
social_id
表中的User
列是可选的
有一个名为Social
的新表,其中包含一个主键,两个social_id
,一个用于Facebook,一个用于Google,一个外键用于链接主键在User
表中。
感谢。
答案 0 :(得分:1)
我会选择下面指出的第二个选项,因为user
到social 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 ...
我建议强烈反对在表格的每一行为两个不同的社交网络添加两列。因为,有三个或更多的社交网络。