数据库设计(实战项目)-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='用户-第三方平台表';
具体登录实现代码:
相关推荐
Python之栈3 分钟前
【无标题】
数据库·python·mysql
风_流沙15 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣22 分钟前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、31 分钟前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
YashanDB33 分钟前
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
数据库·yashandb·崖山数据库
ProtonBase44 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
云和数据.ChenGuang6 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys6 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi6 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据7 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云