Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 考虑到更快的执行速度和最优的结构,哪种表结构更好?_Mysql_Laravel_Database Design - Fatal编程技术网

Mysql 考虑到更快的执行速度和最优的结构,哪种表结构更好?

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

我正在Laravel的一个web应用程序中实现多登录系统。在应用程序中,用户可以在多个社交平台上注册,所有这些帐户都应视为一个

我有两种方法来实现这一点:

方法一:

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 id
NULL
。根据用户通过应用程序向该平台注册的时间保存每个值

方法二:

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
    (毫无疑问,您可以进行其他检查),并将其存储

  • 在前面的方法中,可能有些行的小写字母是“facebook”,有些大写字母是“facebook”,有些是“facebook”。因此,这有助于在所有条目中保留一个特定值


  • 同样,性能也会受到影响,因为它会添加额外的连接。所以它是完全可选的。如果性能不受大量影响,并且对您来说也不是什么大问题,我建议您这样做。

    关系数据库第一范式禁止使用不适用的空值,因此为了拥有一个规范化的数据库,您需要使用方法II。规范化有助于防止数据不一致和更新异常。然而,规范化也会影响性能,这就是为什么数据经常被非规范化以提高性能,但有时会有不一致的数据。话虽如此,但要非常小心,不要成为过早优化的牺牲品。如果您打破规范化,使通常在2秒内运行的代码在1.95秒内运行,那么在表名(etc)中不会获得任何无效的特殊字符。考虑<代码>主键(UsSyid,SoalalSype)<代码>,并抛出<代码> ID >代码> <代码>社交登录> <代码>。使用方法二。您可能会添加TikTok,然后删除它并添加更多列--太麻烦了。为什么您认为第一种方法不更好?哪种方法更好?您的方法1或我在解决方案中陈述的第一种方法?如果是关于您的方法1,请阅读apokryfos在您的帖子中的评论以及我的理由中的第一点(
    您始终可以在不更改模式的情况下添加新的社交类型。而在第一个选项中,您必须为该社交类型添加另一列
    )。如果是关于我的第一种方法,我已经在解决方案中列出了第二种方法的好处。正如我前面所说的,如果性能不受大量影响,并且性能对您来说不是那么大的问题,那么应该使用这个选项。