考虑到更快的执行和最优的结构,哪种表结构会更好



我正在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。

原因

  1. 你总是可以"在不更改模式的情况下添加新的社交类型"而在第一个选项中,您必须为该CCD_ 4添加另一列
  2. 规范化数据库,因为它可以防止数据不一致

我想再补充一个建议。

创建另一个表

social_type table
id  |   name
1      Facebook
2      Google

并在社交登录表中引用它的id

id   | user_id | social_type_id | uuid

的好处

  1. 数据库可以控制类型。使用此选项,用户只能选择系统中存在且对系统有效的选项。所以基本上你可以控制它。而早期的用户可以发送任何随机值qawqdq(毫无疑问,你可以进行其他检查(,它会存储它。

  2. 对于前面的方法,可能存在一些行可能具有"0"的可能性;facebook";小写的"some";FACEBOOK";在大写中;FaceBook";。因此,这有助于在所有条目中保留一个特定值。

同样,性能会受到影响,因为它会添加额外的联接。所以它是完全可选的。如果绩效没有受到很大的影响,也没有那么大的问题,我建议你这样做。

我会选择选项2。

  1. 这是更清洁的结构
  2. 你可以更好地存储数据

我不认为时间损失会对你的表现造成那么大的问题。如果时间损失非常大,我只会选择选项1

最新更新