数据库设计(实战项目)-同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.mfbz.cn/a/752611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工作备忘录哪个好用 好用的工作备忘录

在繁忙的工作环境中,备忘录就像是我手中的一把利剑,助我斩断杂乱的思绪,让工作变得井井有条。每当任务堆积如山,或是灵感与琐事交织时,我总会依赖我的备忘录来帮我理清头绪。 想象一下,你正忙于一个大型项…

小区物业管理收费系统源码小程序

便捷、透明、智能化的新体验 一款基于FastAdminUniApp开发的一款物业收费管理小程序。包含房产管理、收费标准、家属管理、抄表管理、在线缴费、业主公告、统计报表、业主投票、可视化大屏等功能。为物业量身打造的小区收费管理系统,贴合物业工作场景,轻…

RabbitMQ实践——搭建单人聊天服务

大纲 创建Core交换器用户登录发起聊天邀请接受邀请聊天实验过程总结代码工程 经过之前的若干节的学习,我们基本掌握了Rabbitmq各个组件和功能。本文我们将使用之前的知识搭建一个简单的单人聊天服务。 基本结构如下。为了避免Server有太多连线导致杂乱,下…

【MySQL基础篇】概述及SQL指令:DDL及DML

数据库是一个按照数据结构来组织、存储和管理数据的仓库。以下是对数据库概念的详细解释:定义与基本概念: 数据库是长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库不仅仅是数据的简单堆积,而是遵循一定的规则…

可用的搜索引擎

presearchhttps://presearch.com/yandexhttps://yandex.com/ 以上,目前均不需科学上网。

GEOS学习笔记(一)

下载编译GEOS 从Download and Build | GEOS (libgeos.org)下载geos-3.10.6.tar.bz2 使用cmake-3.14.0版本配置VS2015编译 按默认配置生成VS工程文件 编译后生成geos.dll,geos_c.dll 后面学习使用C接口进行编程

PCB在工业领域的应用以及人工智能的影响。

什么是pcb呢? PCB,全称Printed Circuit Board,中文名称为印制电路板,也被称为印刷线路板或印制板1。这是一种重要的电子部件,主要由绝缘基板、连接导线和装配焊接电子元器件的焊盘组成。PCB的主要作用是作为电子元器件的支撑体和电气连接的载体,它能够简化电子产品的装配…

三分钟快速搭建基于FastAPI的AI Agent应用!

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

【鸿蒙学习笔记】页面和自定义组件生命周期

官方文档:页面和自定义组件生命周期 目录标题 [Q&A] 都谁有生命周期? [Q&A] 什么是组件生命周期? [Q&A] 什么是组件?组件生命周期 [Q&A] 什么是页面生命周期? [Q&A] 什么是页面?页面生…

代码随想录算法训练营第五十二天| [KC]100. 岛屿的最大面积、101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题

[KamaCoder] 100. 岛屿的最大面积 [KamaCoder] 100. 岛屿的最大面积 文章解释 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直…

开放式耳机哪个牌子好?2024热门红榜开放式耳机测评真实篇!

当你跟朋友们聊天时,他们经常抱怨说长时间戴耳机会令耳朵感到不适,后台也有很多人来滴滴我,作为一位致力于开放式耳机的测评博主,在对比了多款开放式耳机之后,你开放式耳机在保护听力方面确实有用。开放式的设计有助于减轻耳道内的…

自适应蚁群算法优化的攀爬机器人的路径规划

大家好,我是带我去滑雪! 攀爬机器人是一种能够在复杂环境中自主移动和攀爬的具有广阔应用前景的智能机器人,具有较强的应用潜力和广泛的研究价值。随着科技的不断发展,攀爬机器人在许多领域中的应用越来越广泛,例如建筑…

FastGPT 手动部署错误:MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo

在运行 FastGPT 时,mongodb 报如下错误: MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo 这是因为 mongo 没有解析出来,在 hosts 文件中添加如下信息: 127.0.0.1 mongo 重新运行 FastGPT 即可。 参考链接&#xff…

力扣随机一题 位运算/滑动窗口/数组

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 3191.使二进制数组全部等于1的最少操作次数I【中等】 题目: 给…

C语言力扣刷题7——删除排序链表中的重复元素 II——[快慢双指针法]

力扣刷题7——删除排序链表中的重复元素 II——[快慢双指针法] 一、博客声明二、题目描述三、解题思路1、思路说明 四、解题代码(附注释) 一、博客声明 找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟…

STM32将外部SDRAM空间作为系统堆(Heap)空间

概述 stm32可以外扩很大的sram,常见外部sram的初始化函数一般是c语言写的,默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f429xx.s,在汇编代码中Reset_Handler(复位中断服务程序)里面先调用了Syste…

光明致优尊耀呈现“柏林爱乐在上海”音乐会正式开幕,奏响盛夏狂热乐章

2024年6月26日,由光明致优尊耀呈现的中国上海国际艺术节特别项目“柏林爱乐在上海”音乐会正式开幕。暌违七年,世界顶级交响乐团——柏林爱乐乐团再度访沪,在首席指挥基里尔别特连科率领下,正式在中国上海国际艺术节登台演出&…

Talk|CityU 助理教授马佳葳: CVPR 2024, 基于多模态理解的混合数据专家模型

本期为TechBeat人工智能社区第604期线上Talk。 北京时间6月27日(周四)20:00,香港城市大学助理教授—马佳葳的Talk已经准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “基于多模态理解的混合数据专家模型”,他向大家介绍了混合数据专…

x86 平台实现一个原子加法操作

1&#xff0c;先上代码 #include <iostream> #include <omp.h>int atomicAdd(int* ptr, int value) {int result;asm volatile("lock xaddl %0, %1\n": "r" (result), "m" (*ptr): "0" (value), "m" (*ptr): &…

程序猿大战Python——Python与MySQL交互三

SQL注入 目标&#xff1a;了解什么是SQL注入&#xff1f; SQL注入指的是&#xff1a;恶意篡改或注入SQL条件。 当开发者的数据条件若被恶意篡改&#xff0c;那就达不到预期的查询效果。 为了了解SQL注入是怎么回事&#xff1f;通过一个案例来分析。 例如&#xff0c;使用命令…