分享一个便于扩展的用户表结构

用户表可以说是每个项目立项动工时首要考虑的一件事情。用户表结构的设计直接影响着项目的可靠性和扩展性,与其待以后需要满足需求不断改动,倒不如一开始就设计一个易于扩展的用户表,争取一步到位。

基础设计

大部分初学者所学到的,以及不少框架自带的用户表都是类似下面这种结构的。

id
name
password

这是一个相当简单的用户表,只包含了用户ID、名称、密码等必要的信息。假如需要在这基础上加上一些字段,比如生日、住址甚或用户状态等,就只能继续加字段,变成了下面这样。

id
name
password
birthday
address
status

这样做在初期是没有什么大问题的,顶多就是麻烦点。然而,随着越来越多应用开放第三方登录,我们自己的项目也得加上第三方信息表,于是,我们有了第二个表。

socials
-------
id
user_id
type
value
credential

我们用 typevalue 存放第三方类型以及第三方用户标识,用 credential 来存放密码、Token等信息。
以上这种方式毫无疑问是可以解决问题的,可就是过于麻烦了。

正式内容

users
-------
id
nickname
avatar
status
socials
-------
id
user_id
type
value
credential
union_id
user_auths
-------
id
user_id
type
identifier
credential
user_extends
-------
id
user_id
field
value

users 表仅保存一些必要的用户信息,其他额外信息如生日、住址等存放于 user_extends 表,用户绑定的第三方信息存放于 socials 表。认证信息存放于 user_auths 表,其中的 type 字段是登录的类型,如手机号、邮箱、用户名等,比如手机号登录的时候只要找出 type = 'phone' AND identifier = 123456789 的记录,然后判断密码(或验证码)即可。

结语

我承认,写一半的时候我就不知道自己在说什么了(捂脸)。大佬们轻点喷。

参考资料

可扩展的用户表设计 by franktrue
浅谈数据库用户表结构设计 by 一步一步向上爬

本作品采用《CC 协议》,转载必须注明作者和本文链接
sunxyw
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5

用户名,手机号,邮箱对应的肯定是同一个密码。在 auths 表里可能是3条记录。这时候修改密码就需要统一修改3条记录。 感觉有点儿过度设计了 :grinning:

4年前 评论
sunxyw (楼主) 4年前

不超过20个字段怕啥

4年前 评论

@kangfq 20个你在开玩笑

file

4年前 评论
MuYan 4年前

@晓轩 干的漂亮

4年前 评论

我懒,我觉得不需要搞那么麻烦。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!