当前位置: 首页 > news >正文

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

     

相关文章:

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

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

vue+fineReport 使用前端搜索+报表显示数据

--fineReprot 将需要搜索的参数添加到模版参数 sql: --前端传递参数 注:因为每次点击搜索的结果需要不一样,还要传递一个时间戳的参数: let timesamp new Date().getTime()...

高阶面试-存储系统的设计

概述 分类 块存储 block storage文件存储 file storage对象存储 object storage 区别: 块存储 概述 位于最底层,块,是物理存储设备上数据存储的最小单位。硬盘(Hard Disk Drive,HDD)就属于块存储。常见的还有固态硬盘(SSD)、…...

柔性测斜仪:土木工程与地质监测的得力助手

在现代土木工程和地质工程领域,精确监测土壤和岩石的位移情况对于确保工程安全至关重要。柔性测斜仪作为一种高精度、稳定性和灵活性兼备的测量设备,已逐渐成为工程师和研究人员的得力助手。本文将深入探讨柔性测斜仪在多个关键领域的应用及其重要性。 点…...

数字资产和数据资产你真的了解吗?

数据作为新型生产要素,是数字化、网络化、智能化的基础,已快速融入生产、分配、流通、消费和社会服务管理等各环节,深刻改变着生产方式、生活方式和社会治理方式。 何为数据资产?即由个人或企业拥有或控制的,能为企业带…...

【每日一练】python运算符

1. 算术运算符 编写一个Python程序,要求用户输入两个数,并执行以下运算:加法、减法、乘法、求余、除法、以及第一个数的第二个数次方。将结果打印出来。 a input("请输入第一个数:") b input("请输入第二个数&…...

CesiumJS【Basic】- #032 绘制虚线(Primitive方式)

文章目录 绘制虚线(Primitive方式)1 目标2 代码2.1 main.ts绘制虚线(Primitive方式) 1 目标 使用Primitive方式绘制虚线 2 代码 2.1 main.ts // 定义线条的起点和终点var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)...

海尔智家:科技优秀是一种习惯

海尔智家:科技优秀是一种习惯 2024-06-28 15:19代锡海 6月24日,2023年度国家科学技术奖正式揭晓。海尔智家“温湿氧磁多维精准控制家用保鲜电器技术创新与产业化”项目荣获国家科学技术进步奖,成为家电行业唯一牵头获奖企业。 很多人说&…...

【Android】实现图片和视频混合轮播(无限循环、视频自动播放)

目录 前言一、实现效果二、具体实现1. 导入依赖2. 布局3. Banner基础配置4. Banner无限循环机制5. 轮播适配器6. 视频播放处理7. 完整源码 总结 前言 我们日常的需求基本上都是图片的轮播,而在一些特殊需求,例如用于展览的的数据大屏,又想展…...

VLAN基础

一、什么是Vlan VLAN(Virtual Local Area Network)是虚拟局域网的简称,是一种将单一物理局域网(LAN)在逻辑层面上划分为多个独立的广播域的技术。每个VLAN都是一个独立的广播域,其内部主机可以直接通信&am…...

pytest-yaml-sanmu(五):跳过执行和预期失败

除了手动注册标记之外,pytest 还内置了一些标记可直接使用,每种内置标记都会用例带来不同的特殊效果,本文先介绍 3 种。 1. skip skip 标记通常用于忽略暂时无法执行,或不需要执行的用例。 pytest 在执行用例时,如果…...

linux指令整合(centos系统持续更新中。。。)

1、查询java进程 ps -ef|grep java 2、查询端口占用 lsof -i:端口号 3、 启动java程序 java -jar jar包路径 后台启动 nohup java -jar jar包路径 -Xms512m -Xmx512m > 日志路径 2>&1 & 4、查看服务器资源占用 top 5、关闭进程 kill -9 进程号...

个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)

目录 一、效果展示 二、项目概述 三、手把手快速搭建实现本项目 3.1 前端实现 3.2 后端方向 五、后续开发计划 一、效果展示 默认展示 一般对话展示: 代码对话展示: 二、项目概述 本项目是一个基于Web的智能对话服务平台,通过后端与第…...

Cesium与Three相机同步(3)

Cesium与Three融合的案例demo <!DOCTYPE html> <html lang"en" class"dark"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content&q…...

PMP考试报名项目经历怎么填写?指引请收好

PMP&#xff0c;这一全球公认的项目管理金牌认证&#xff0c;不仅是对项目管理能力的认可&#xff0c;更是职业生涯中的一大助力。然而&#xff0c;在报名PMP时&#xff0c;很多小伙伴都面临一个共同的难题&#xff1a;如何书写项目经验&#xff1f;今天&#xff0c;就让我们一…...

Git的基本使用方法

Git的基本使用方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Git的基本使用方法&#xff0c;Git作为目前最流行的版本控制系统之一&…...

深入剖析 @Autowired 和 @Resource 在 Spring 中的区别

在 Spring 框架中&#xff0c;Autowired 和 Resource 是两个常用的注解&#xff0c;用于实现依赖注入。尽管它们都能达到将依赖对象注入到目标 bean 的目的&#xff0c;但在细节上存在一些显著的差异。本文将深入探讨这两个注解的区别&#xff0c;并结合 Spring 源码进行分析&a…...

Golang-slice理解

slice golang-slice语雀笔记整理 slicego为何设计slice&#xff1f;引用传递实现扩容机制 go为何设计slice&#xff1f; 切片对标其他语言的动态数组&#xff0c;底层通过数组实现&#xff0c;可以说是对数组的抽象&#xff0c;底层的内存是连续分配的所以效率高&#xff0c;可…...

【Linux系统】文件描述符fd

1.回顾一下文件 我们之前对文件的理解是在语言层上&#xff0c;而语言层去理解文件是不可能的&#xff01;&#xff01;&#xff01; 下面是一份c语言文件操作代码&#xff01;&#xff01;&#xff01; #include<stdio.h> int main() {FILE* fd fopen("lo…...

【嵌入式——FreeRTOS】启动任务调度器

【嵌入式——FreeRTOS】启动任务调度器 开启任务调度器vTaskStartScheduler()xPortStartScheduler()prvStartFirstTask()启动第一个任务 开启任务调度器 用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c;FreeRTOS便会开始进行任务调度。 //启动任务&#xff0c;开…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...