我正在Laravel的一个web应用程序中实现多登录系统。在应用程序中,用户可以在多个社交平台注册,所有这些帐户都应被视为一个帐户。
我有两种方法来实现这一点:
方法一:
users table
- id
- username
- email
- google_id
- facebook_id
- github_id
- twitter_id
- ...other columns
默认设置所有的google_id,facebook_id,twitter_idNULL
。根据用户通过应用程序向该平台注册的时间保存每个值。
方法二:
users table
id
username
email
.. other columns
social-login table
id
user_id
social_type //facebook or google or twitter etc
uid // unique identifier returned from each platform
使用方法I,我得到了更好的性能,因为我只需要在一个表上执行查询,但方式II提供了更好的表结构。
我应该使用哪种方法?考虑这样一个事实,即会有很多请求,在所有请求中,我们将使用uid
而不是user_id
来获取用户的任何信息。
查询如下:
SELECT * FROM users WHERE id=2;
SELECT * FROM `social-login` WHERE user_id=2;
SELECT * FROM users as U JOIN `social-login` as S ON S.user_id=U.id WHERE U.id=2
我会选择选项2。
原因
- 你总是可以"在不更改模式的情况下添加新的社交类型"而在第一个选项中,您必须为该CCD_ 4添加另一列
- 规范化数据库,因为它可以防止数据不一致
我想再补充一个建议。
创建另一个表
social_type table
id | name
1 Facebook
2 Google
并在社交登录表中引用它的id
id | user_id | social_type_id | uuid
的好处
数据库可以控制类型。使用此选项,用户只能选择系统中存在且对系统有效的选项。所以基本上你可以控制它。而早期的用户可以发送任何随机值
qawqdq
(毫无疑问,你可以进行其他检查(,它会存储它。对于前面的方法,可能存在一些行可能具有"0"的可能性;facebook";小写的"some";FACEBOOK";在大写中;FaceBook";。因此,这有助于在所有条目中保留一个特定值。
同样,性能会受到影响,因为它会添加额外的联接。所以它是完全可选的。如果绩效没有受到很大的影响,也没有那么大的问题,我建议你这样做。
我会选择选项2。
- 这是更清洁的结构
- 你可以更好地存储数据
我不认为时间损失会对你的表现造成那么大的问题。如果时间损失非常大,我只会选择选项1。