数据库设计(实战项目)-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
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字段来做隔离和查询
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='用户-第三方平台表';
具体登录实现代码:
                

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字媒体技术基础之:DNG 文件

DNG(Digital Negative)文件是一种用于存储原始图像数据的文件格式,由 Adobe Systems 于2004年开发并推广。DNG 是一种开放的、非专利的原始图像格式,旨在为不同相机制造商提供一个统一的存储格式。DNG 文件保存了原始的、未处理的…

springboot+vue下载文件一篇就够了

前台代码 export function downLoad(id) {var url = baseURL + `/api/admin/system/promotion/downLoad/${id}`axios({method: get,url: url,responseType: blob,headers: { Authori-Zation: getToken() }}).then(async (res) => {// 从 Content-Disposition 头部解析文件名…

C++时区转换

#include <iostream> #include "cctz/civil_time.h" #include "cctz/time_zone.h"// 时区转换库 // https://github.com/google/cctzint test() {for (cctz::civil_day d(2016, 2, 1); d < cctz::civil_month(2016, 3); d) {std::cout << &…

【设计模式】设计模式学习线路与总结

文章目录 一. 设计原则与思想二. 设计模式与范式三. 设计模式进阶四. 项目实战 设计模式主要是为了改善代码质量&#xff0c;对代码的重用、解耦以及重构给了最佳实践&#xff0c;如下图是我们在掌握设计模式过程中需要掌握和思考的内容概览。 一. 设计原则与思想 面向对象编…

ELK企业内部日志分析系统(1)

ELKKafkaFilebeat企业内部日志分析系统(1) Elasticsearch集群部署 1.部署环境 IP地址主机名配置系统版本192.168.222.129es12核4GRockyLinux192.168.222.130es22核3GRockyLinux192.168.222.131es32核3GRockyLinux 2.配置主机名解析和主机名 #关闭防火墙与selinux #更改主机…

k8s 使用 helm 文件部署 8.12.2 es 分角色集群

文章目录 [toc] 环境介绍添加 helm 仓库下载 elasticsearch chart 包配置 secret 文件tls 证书用户名和密码 部署 master 节点部署 ingest 节点部署 data 数据节点创建 pv 和 pvc 节点验证部署 kibana配置 secret 文件用户名和密码随机密钥 创建 kibana_login 用户下载 kibana …

qt6 获取百度地图(一)

需求分析&#xff1a; 要获取一个地图&#xff0c; 需要ip 需要根据ip查询经纬度 根据经纬度查询地图 另外一条线是根据输入的地址 查询ip 根据查询到的ip查地图‘ 最后&#xff0c;要渲染地图 上面这这些动作&#xff0c;要进行http查询&#xff1a; 为此要有三个QNet…

机器学习与AI大数据的融合:开启智能新时代

在当今这个信息爆炸的时代&#xff0c;大数据和人工智能&#xff08;AI&#xff09;已经成为推动社会进步的强大引擎。作为AI核心技术之一的机器学习&#xff08;Machine Learning, ML&#xff09;&#xff0c;与大数据的深度融合正引领着一场前所未有的科技革命&#xff0c;不…

深入浅出mysql分库分表

文章目录 为什么要分库分表&#xff1f;什么场景下才需要分库分表&#xff1f;1. 数据量增长导致数据量过大--分表2. 高并发访问--分库3. 地理分散的业务--分库 分库分表的区别分库&#xff08;Database Sharding&#xff09;分表&#xff08;Table Partitioning&#xff09; 垂…

Qt学习:Qt用户界面的核心元素

Qt界面设计主要包括以下几个核心元素&#xff1a; 窗口和对话框&#xff1a;Qt中的基本组件之一是窗口&#xff08;Window&#xff09;&#xff0c;它可以包含各种控件&#xff0c;如按钮、文本框、列表框等&#xff0c;用于展示信息和接收用户输入。对话框&#xff08;Dialog&…

C++_STL---priority_queue

priority_queue的相关介绍 优先级队列是一种容器适配器&#xff0c;根据严格的排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大(小)的。该容器适配器类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且可以检索最大(小)堆元素(优先级队列中位于顶部的元…

等保2.0中还有哪些针对云计算的安全要求?

等保2.0中针对云计算的安全要求概述 等保2.0是中国信息安全等级保护制度的升级版&#xff0c;它对云计算环境提出了一系列特定的安全要求&#xff0c;以确保云服务的安全性和合规性。以下是一些关键的云计算安全扩展要求&#xff1a; 基础设施位置&#xff1a;要求云计算基础…

内涵:日常工作中docker的常用知识

内涵&#xff1a;日常工作中docker的常用知识 1. docker高频指令&#xff08;与参数&#xff09;2. 单docker使用场景3.双&#xff08;多&#xff09;docker使用场景 正如 优雅&#xff1a;从系统环境到依赖包的管理&#xff0c;最近工作中&#xff0c;对开发、部署环境中的管…

电子画册制作的小秘密都在这篇文章了

电子画册作为现代营销和展示的重要工具&#xff0c;已经成为各类企业和个人宣传品的首选。相比传统印刷画册&#xff0c;电子画册不仅节省成本&#xff0c;还能通过多媒体元素增强视觉冲击力&#xff0c;提升用户互动体验。本文将介绍电子画册制作的基础步骤和关键要点&#xf…

电气-伺服(4)CANopen

一、CAN Controller Area Network ,控制器局域网&#xff0c;80年的德国Bosch的一家公司研发可以测量仪器直接的实时数据交换而开发的一款串行通信协议。 CAN发展历史 二、CAN 的osi 模型 CAN特性&#xff1a; CAN 的数据帧 三、CANopen 什么是CANopen CANopen 的网络模型 …

Unity In App Purchasing内购校验

1&#xff0c;利用收据验证混淆器 把后台的key填进去&#xff0c;点击自动生成一些文件 2&#xff0c;代码过滤 using UnityEngine.Purchasing.Security;在IAPManager.cs的 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)增加 #if !UNITY_EDITOR…

【C++之unordered_set和unordered_map的模拟实现】

C学习笔记---025 C之unordered_set和unordered_map的模拟实现1、unordered_set的模拟实现2、unordered_map的模拟实现 C之unordered_set和unordered_map的模拟实现 前言&#xff1a; 前面篇章学习了C对unordered_set和unordered_map的认识和应用&#xff0c;接下来继续学习&am…

Java_网络通信:TCP和UDP

1、区别 TCP Transfer Control Protocol 是一种面向连接的、可靠的、传输层通信协议。 ​ 特点&#xff1a; 好比是打电话&#xff1a;面向连接的&#xff0c;点对点的通信&#xff0c;高可靠的&#xff0c;效率比较低&#xff0c;占用的系统资源比较多。 UDP User Datagram…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;AI边缘流媒体设备展示&#xff08;三&#xff09;赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 &#xff08;四&#xff09;一些注意事项1、开发板…

ESP32-C3模组上跑通MD5(3)

接前一篇文章:ESP32-C3模组上跑通MD5(2) 本文内容参考: ESP32 MD5 代码_esp32 idf md5开启-CSDN博客 ESP32学习笔记(47)——加密算法AES/MD5/SHA_esp32 aes-CSDN博客 特此致谢! 上一回解析了ESP-IDF中组件(components)中MD5相关的例程,也给出了笔者参照该例程自行…