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

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

基础设计

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

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
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

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

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

不超过20个字段怕啥

4年前 评论

@kangfq 20个你在开玩笑

file

4年前 评论
MuYan 4年前

@晓轩 干的漂亮

4年前 评论

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

4年前 评论

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