Mysql 考虑到更快的执行速度和最优的结构,哪种表结构更好?
我正在Laravel的一个web应用程序中实现多登录系统。在应用程序中,用户可以在多个社交平台上注册,所有这些帐户都应视为一个 我有两种方法来实现这一点: 方法一:Mysql 考虑到更快的执行速度和最优的结构,哪种表结构更好?,mysql,laravel,database-design,Mysql,Laravel,Database Design,我正在Laravel的一个web应用程序中实现多登录系统。在应用程序中,用户可以在多个社交平台上注册,所有这些帐户都应视为一个 我有两种方法来实现这一点: 方法一: users table - id - username - email - google_id - facebook_id - github_id - twitter_id - ...other columns users table id username email .. oth
users table
- id
- username
- email
- google_id
- facebook_id
- github_id
- twitter_id
- ...other columns
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
默认设置所有google\u id、facebook\u id、twitter\u idNULL
。根据用户通过应用程序向该平台注册的时间保存每个值
方法二:
users table
- id
- username
- email
- google_id
- facebook_id
- github_id
- twitter_id
- ...other columns
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。我会选择选项2 理由
社交类型添加另一列
social_type table
id | name
1 Facebook
2 Google
并在社交登录表中引用它的id
id | user_id | social_type_id | uuid
利益
qawqdq
(毫无疑问,您可以进行其他检查),并将其存储
同样,性能也会受到影响,因为它会添加额外的连接。所以它是完全可选的。如果性能不受大量影响,并且对您来说也不是什么大问题,我建议您这样做。关系数据库第一范式禁止使用不适用的空值,因此为了拥有一个规范化的数据库,您需要使用方法II。规范化有助于防止数据不一致和更新异常。然而,规范化也会影响性能,这就是为什么数据经常被非规范化以提高性能,但有时会有不一致的数据。话虽如此,但要非常小心,不要成为过早优化的牺牲品。如果您打破规范化,使通常在2秒内运行的代码在1.95秒内运行,那么在表名(etc)中不会获得任何无效的特殊字符。考虑<代码>主键(UsSyid,SoalalSype)<代码>,并抛出<代码> ID >代码> <代码>社交登录> <代码>。使用方法二。您可能会添加TikTok,然后删除它并添加更多列--太麻烦了。为什么您认为第一种方法不更好?哪种方法更好?您的方法1或我在解决方案中陈述的第一种方法?如果是关于您的方法1,请阅读apokryfos在您的帖子中的评论以及我的理由中的第一点(
您始终可以在不更改模式的情况下添加新的社交类型。而在第一个选项中,您必须为该社交类型添加另一列
)。如果是关于我的第一种方法,我已经在解决方案中列出了第二种方法的好处。正如我前面所说的,如果性能不受大量影响,并且性能对您来说不是那么大的问题,那么应该使用这个选项。