数据库设计(实战项目)-1个手机号多用户身份

一. 背景:

该需求是一个互联网医院的预约单场景,护士在小程序上申请患者查房预约单,医生在小程序上对预约单进行接单,护士开始查房后填写查房小结,客户需要对用户信息进行授权,医生查房后进行签字,预约单流程结束。

1.涉及3个身份:护士(内部员工),客户,医生
2.涉及2个系统:后台端,小程序端(小程序目前是共用1个,后续可能拆分成多个)

二.思考:

1.用户表如何设计?

场景:1个phone的用户对应多个身份,比如1个客户既是客户也是医生或者也是护士

(1)传统的user表1个phone对应1个用户的设计,然后护士,客户,医生都是独立的表

缺点:

  1. 如果想要查询某个phone用户在我们平台注册过了哪些身份的用户,这种情况还要去关联护士,客户,医生表才能知道注册过了对应的身份

  2. 如果不同身份的用户在同一个业务表,比如操作日志表有数据,但是因为同1个userId,需要查询这个操作日志是用户作为哪个身份操作的时候,就无法隔离了

(2)在user表上应该加上user_type字段,同1个phone对应多条user数据,phone+user_type唯一

优点:

  1. 1个phone用户注册过哪些身份的数据,非常容易查询
  2. 不同身份的用户在不同的业务表数据隔离开了,不用特殊区分
  3. 用户登录token如果以userId隔离,不同userId可以直接隔离,不会出现清除1个userId,影响这个客户所有端的登录token
sql 复制代码
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `avatar` varchar(1000) DEFAULT NULL COMMENT '头像url',
  `phone` varchar(30) DEFAULT NULL COMMENT '手机号',
  `status` tinyint(3) NOT NULL COMMENT '状态(0:停用 1:正常)',
  `user_type` int(11) NOT NULL COMMENT '0:公司员工 1:医生 2:患者',
  `source` int(11) DEFAULT NULL COMMENT '来源(0:自主注册 1:平台维护)',
  `remark` varchar(300) DEFAULT NULL COMMENT '备注',
  `last_login_date` datetime DEFAULT NULL COMMENT '最后一次登录时间',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
  `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_id` bigint(20) DEFAULT NULL COMMENT '修改人',
  `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记;0-正常 ;1-删除',
  PRIMARY KEY (`id`),
  KEY `idx_phone` (`phone`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1805937509703802882 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';



DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(20) NOT NULL COMMENT '用户表id user.id',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
  `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_id` bigint(20) DEFAULT NULL COMMENT '修改人',
  `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记;0-正常 ;1-删除',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=322 DEFAULT CHARSET=utf8mb4 COMMENT='内部员工表';



DROP TABLE IF EXISTS `doctor`;
CREATE TABLE `doctor` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(20) NOT NULL COMMENT 'user.id 用户表id',
  `service_type_str` varchar(100) DEFAULT NULL COMMENT '服务类型多选,分割',
  `service_province` varchar(30) DEFAULT NULL COMMENT '服务省',
  `service_city` varchar(30) DEFAULT NULL COMMENT '服务市',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
  `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_id` bigint(20) DEFAULT NULL COMMENT '修改人',
  `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记;0-正常 ;1-删除',
  `org_name` varchar(500) DEFAULT NULL COMMENT '第一执业机构',
  `certificate_num` varchar(500) DEFAULT NULL COMMENT '执业资格证号',
  `certificate_photo_url_first` varchar(500) DEFAULT NULL COMMENT '医师资格证书第一页',
  `certificate_photo_url_second` varchar(500) DEFAULT NULL COMMENT '医师资格证书第二页',
  `certificate_approval_state` int(11) NOT NULL DEFAULT '0' COMMENT '资质审核状态 0:待审核',
  `doctor_sign_url` varchar(500) DEFAULT NULL COMMENT '医生签章url',
  `doctor_sign_url_date` datetime DEFAULT NULL COMMENT '医生签章url时间',
  `service_type_bind_date_str` varchar(1000) DEFAULT NULL COMMENT '服务类型订阅日期字符串',
  PRIMARY KEY (`id`),
  KEY `idx_ user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1805937509741551619 DEFAULT CHARSET=utf8mb4 COMMENT='医生表';


DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(20) NOT NULL COMMENT '用户表id user.id',
  `picp_basic_uid` int(11) DEFAULT NULL COMMENT 'picp basic_user_id',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
  `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_id` bigint(20) DEFAULT NULL COMMENT '修改人',
  `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记;0-正常 ;1-删除',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) USING BTREE,
  KEY `idx_picp_basic_uid` (`picp_basic_uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1805919891005562884 DEFAULT CHARSET=utf8mb4 COMMENT='客户表';

2.微信登录采用的是openId作为登录唯一识别,如何设计和user表关联在一起?

场景:我们系统1个userId对应的用户可能在微信平台注册,可能在支付宝平台,小红书平台,会出现1个userId对应多个平台

(1)单独设计1个user_thirty_party第三方用户关联表,这个表设计要广义,做好后面对接其他平台的准备,其中平台类型tyType字段来做隔离和查询
sql 复制代码
DROP TABLE IF EXISTS `user_thirty_party`;
CREATE TABLE `user_thirty_party` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(20) DEFAULT NULL COMMENT '用户表id user.id',
  `tp_type` int(11) NOT NULL COMMENT '平台类型(0:医生端/护士端/患者端小程序  ...)',
  `user_type` int(11) NOT NULL COMMENT '用户类型(0:公司员工 1:医生 2:患者)',
  `union_id` varchar(100) DEFAULT NULL COMMENT '微信unionId',
  `open_id` varchar(100) DEFAULT NULL COMMENT '微信openId',
  `session_key` varchar(100) DEFAULT NULL COMMENT '微信session_key',
  `nick_name` varchar(500) DEFAULT NULL COMMENT '昵称',
  `avatar` varchar(1000) DEFAULT NULL COMMENT '头像url',
  `auth_state` tinyint(1) NOT NULL DEFAULT '0' COMMENT '授权状态',
  `auth_date` datetime DEFAULT NULL COMMENT '授权时间',
  `create_id` bigint(20) DEFAULT NULL COMMENT '创建人id',
  `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modify_id` bigint(20) DEFAULT NULL COMMENT '修改人',
  `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记;0-正常 ;1-删除',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) USING BTREE,
  KEY `idx_open_id` (`open_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1806211567002497027 DEFAULT CHARSET=utf8mb4 COMMENT='用户-第三方平台表';
具体登录实现代码:
相关推荐
永乐春秋9 分钟前
WEB-通用漏洞&SQL注入&CTF&二次&堆叠&DNS带外
数据库·sql
打鱼又晒网43 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!1 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix2 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。2 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了2 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度2 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮2 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9993 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️3 小时前
华为ASP与CSP是什么?
服务器·前端·数据库