[PHP] 设计一个可扩展的用户登陆系统
1. 大部分互联网业务中 , 用户登陆功能是非常常见的模块 , 针对登陆功能的数据库设计常见的是下面这样的
User表
id username password ... 其他用户信息
查询时的逻辑类似下面
pass=query("select * from user where username='xxxx'")
if(password==pass){
//登陆成功
}
这样的结构基本可以满足功能需要 , 但是当需要增加手机登陆 ,邮箱登陆 , 第三方登陆时 ,表结构该怎么设计呢?
可能有人会想到在user表里增加字段 , email , telphone , weixin_id ...
这样的设计导致增加一种登陆方式就要增加字段 , user表的字段过多 , 可扩展性非常差。
2. 针对需要第三方登陆的系统 , 最好是按照业务垂直拆分出分表 。把user表中跟认证相关的业务拆分出来 ,变成独立的表 ,这样既能减小user表的容量 ,又能方便的进行扩展字段 , 例如下面的表
local_auth表
id user_id username telphone email password
third_oauth表
id user_id oauth_id oauth_type refresh_token
user表
id age sex birth ....
上面把本地认证表和第三方oauth认证表与user信息表进行了拆分 , 这样如果是用手机 ,邮箱 , 用户名 登陆,就去查询local_auth表 ,再去查询user表
如果是第三方认证登陆 , 就根据第三方的oauth_id ,认证查询third_oauth表 ,不同的第三方根据oauth_type进行区分 , 再去查询user表
相关文章
- flink中使用lambda表达式
- 使用flink实现一个简单的wordcount
- docker搭建rabbitmq集群
- docker multi-stage 多阶段构建
- docker run 的基本用法
- 使用registry搭建docker私服仓库
- zip和flatMap没有生效
- centos7上安装Docker
- 莱特币(LTC)开发环境搭建
- netty中使用protobuf实现多协议的消息
- proto3语法记录
- redis5集群搭建步骤
- 将博客搬至CSDN
- nio之缓冲区(Buffer)理解
- netty实现websocket发送文本和二进制数据
- springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息
- RabbitMQ的一些理解和笔记
- springboot 整合 rabbitmq
- spring整合rabbitmq
- rabbitmq死信队列和延时队列的使用