一. 背景:
该需求是一个互联网医院的预约单场景,护士在小程序上申请患者查房预约单,医生在小程序上对预约单进行接单,护士开始查房后填写查房小结,客户需要对用户信息进行授权,医生查房后进行签字,预约单流程结束。
1.涉及3个身份:护士(内部员工),客户,医生
2.涉及2个系统:后台端,小程序端(小程序目前是共用1个,后续可能拆分成多个)
二.思考:
1.用户表如何设计?
场景:1个phone的用户对应多个身份,比如1个客户既是客户也是医生或者也是护士
(1)传统的user表1个phone对应1个用户的设计,然后护士,客户,医生都是独立的表
缺点:
-
如果想要查询某个phone用户在我们平台注册过了哪些身份的用户,这种情况还要去关联护士,客户,医生表才能知道注册过了对应的身份
-
如果不同身份的用户在同一个业务表,比如操作日志表有数据,但是因为同1个userId,需要查询这个操作日志是用户作为哪个身份操作的时候,就无法隔离了
(2)在user表上应该加上user_type字段,同1个phone对应多条user数据,phone+user_type唯一
优点:
- 1个phone用户注册过哪些身份的数据,非常容易查询
- 不同身份的用户在不同的业务表数据隔离开了,不用特殊区分
- 用户登录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='用户-第三方平台表';