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

多表设计 - 一对一多对多

一.一对一关系概述:

例如:一位用户只能有一张身份证,一张身份证也只能对应一位用户

如果用户基本信息查询频率比用户身份信息查询频率高,为了提高效率,可拆分为两张表:

此时如何体现一对一的关系呢?其实一对一的关系可看成特殊的一对多的关系,一对多的关系只需要在多的一方添加外键即可,因此可以通过外键来体现一对一的关系,只需要在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE),这样的话一行数据就只会对应另外一张表的一行数据:UNIQUE是唯一约束


二.一对一关系代码演示:

1.准备工作:

a.用户基本信息表:

代码:

-- 一对一: 用户 与 身份证
create table tb_user
(id     int unsigned primary key auto_increment comment 'ID',name   varchar(10)      not null comment '姓名',gender tinyint unsigned not null comment '性别, 1 男  2 女',phone  char(11) comment '手机号',degree varchar(10) comment '学历'
) comment '用户信息表';
​
insert into tb_user
values (1, '白眉鹰王', 1, '18812340001', '初中'),(2, '青翼蝠王', 1, '18812340002', '大专'),(3, '金毛狮王', 1, '18812340003', '初中'),(4, '紫衫龙王', 2, '18812340004', '硕士');
b.用户身份信息表:

代码:

create table tb_user_card
(id           int unsigned primary key auto_increment comment 'ID',nationality  varchar(10)  not null comment '民族',birthday     date         not null comment '生日',idcard       char(18)     not null comment '身份证号',issued       varchar(20)  not null comment '签发机关',expire_begin date         not null comment '有效期限-开始',expire_end   date comment '有效期限-结束',user_id      int unsigned not null unique comment '用户ID',constraint fk_user_id foreign key (user_id) references tb_user (id)
) comment '用户信息表';
​
insert into tb_user_card
values (1, '汉', '1960-11-06', '100000100000100001', '朝阳区公安局', '2000-06-10', null, 1),(2, '汉', '1971-11-06', '100000100000100002', '静安区公安局', '2005-06-10', '2025-06-10', 2),(3, '汉', '1963-11-06', '100000100000100003', '昌平区公安局', '2006-06-10', null, 3),(4, '回', '1980-11-06', '100000100000100004', '海淀区公安局', '2008-06-10', '2028-06-10', 4);

2.此时字段user_id是唯一的,代表了一个用户只有一个身份证,在用户基本信息表中,也就一个身份证只对应了一位用户;


三.多对多关系概述:

比如一个学生可以由多位教师代课,一位代课老师可以有多位学生;

再比如学生与课程的关系:

多对多关系中通过简单的外键关系较为复杂,因为一个字段中只能填入一个数据,无法表示出多个数据

插入第三张中间表,比如查找id为1的学生选了哪些课程,只需要到中间表即学生课程关系表中找字段studentid为1的对应的课程字段courseid对应了哪些课程。查看课程被哪些学生选了同理。


四.多对多关系代码演示:

1.准备工作:

a.学生表:

代码:

--  多对多: 学生 与 课程
create table tb_student
(id   int auto_increment primary key comment '主键ID',name varchar(10) comment '姓名',no   varchar(10) comment '学号'
) comment '学生表';
​
insert into tb_student(name, no)
values ('黛绮丝', '2000100101'),('谢逊', '2000100102'),('殷天正', '2000100103'),('韦一笑', '2000100104');
b.课程表:

代码:

create table tb_course
(id   int auto_increment primary key comment '主键ID',name varchar(10) comment '课程名称'
) comment '课程表';
​
insert into tb_course (name)
values ('Java'),('PHP'),('MySQL'),('Hadoop');
c.中间表:学生课程关系表

create table tb_student_course
(id         int auto_increment comment '主键' primary key,student_id int not null comment '学生ID',course_id  int not null comment '课程ID',constraint fk_courseid foreign key (course_id) references tb_course (id),constraint fk_studentid foreign key (student_id) references tb_student (id)
) comment '学生课程中间表';
​
insert into tb_student_course(student_id, course_id)
values (1, 1),(1, 2),(1, 3),(2, 2),(2, 3),(3, 4);

2.如果表与表建立了物理外键,那么可以通过可视化图形工具进行查看表之间的关系:


相关文章:

多表设计 - 一对一多对多

一.一对一关系概述: 例如:一位用户只能有一张身份证,一张身份证也只能对应一位用户 如果用户基本信息查询频率比用户身份信息查询频率高,为了提高效率,可拆分为两张表: 此时如何体现一对一的关系呢&#xf…...

实现 DataGridView 下拉列表功能(C# WinForms)

本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能,并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表,并在选择某一项时触发事件。 2.…...

使用Java创建RabbitMQ消息生产者的详细指南

目录 在现代分布式系统中,消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理,支持多种消息协议,广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者,发送消息…...

【LC】160. 相交链表

题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&…...

Spark架构及运行流程

Spark架构图 Driver: 解析用户的应用程序代码,转化为作业(job)。创建SparkContext上下文对象,其负责与资源管理器(ClusterManager)通信,进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…...

上传ssh公钥到目标服务器

创建密钥 ssh-keygen -t rsa -b 4096 -C "xxxx.xx"上传 sudo ssh-copy-id -i /Users/xx/.ssh/id_rsa.pub root127.0.0.1...

【LLMs】用LM Studio本地部署离线大语言模型

文章目录 一、下载LM Studio二、下载大语言模型1. 查看模型介绍2. 点击模型文件进行下载2.1 完整下载2.2 部分下载 三、加载模型1. 打开LM Studio图形化界面,点击**My Models**2. 然后,点击“...”,选择“change”,选择刚下载好的…...

SpringBoot下类加入容器的几种方式

SpringBoot下类加入容器的几种方式 在 Spring Boot 中,类加入容器的方式不仅多样,而且每种方式都有其特定的使用场景。以下是几种常见的将类加入 Spring 容器的方法及其适用场景: 1. 使用 Component 及其派生注解 使用场景:当开…...

【Mysql】忘记Root密码后如何不影响数据进行重置密码

方法一:通用方法--启动时跳过权限表 1> 停止数据库 以管理员方式打开cmd!! C:\Users\Administrator>net stop mysql MySQL 服务正在停止.. MySQL 服务已成功停止。 2> 启动时跳过权限表 mysqld --console --skip-grant-tables -…...

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!

项目展现问题: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败: 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…...

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势,帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇,审校为邱雪和许东舟。 一、会议介绍 ICPR…...

【深度学习】深刻理解BERT

BERT(Bidirectional Encoder Representations from Transformers)是由Google于2018年提出的一种预训练的语言表示模型,它基于Transformer架构并能够处理自然语言处理(NLP)中的多种任务。BERT的核心创新是其使用了双向编…...

一种基于通义千问prompt辅助+Qwen2.5-coder-32b+Bolt.new+v0+Cursor的无代码对话网站构建方法

前言 今年似乎大模型之间的“内卷”已经有些偃旗息鼓了,各大技术公司逐渐从单纯追求模型参数量的竞赛中抽身,转向更加注重模型的实际应用效果与效率,开始内卷起了LLM“载具” 不知道这个词是不是我第一个发明的哈,总之我更喜欢…...

Java版-图论-最小生成树-Kruskal算法

实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边&#xff0c…...

计算机网络知识总结

1.网络协议是什么? 在计算机网络要做到有条不紊地交换数据,就必须遵守一些约定好的规则,比如交换数据地格式,是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层:为计算机用户提供服务表示层&…...

普通算法——欧拉筛

欧拉筛 思路: 对欧拉筛的实现,主要是依靠一个数组模拟的栈来实现,核心思路为用栈储存已经发现的素数 在之后的遍历中,即可以素数数组中的数为因数来筛出此素数的倍数 遍历是以当前的 i i i 值为基数,来乘当前素数数…...

【知识科普】DNS(域名解析服务)深入解读

文章目录 概述一、基本概念二、域名解析的原理三、域名解析的类型四、域名解析的常见问题及解决方法五、域名解析的重要性 部署一、准备环境二、安装DNS软件三、配置DNS服务器四、测试DNS解析五、维护和管理DNS服务器 配置文件一、BIND DNS服务器配置文件格式二、Windows系统DN…...

数据结构第一弹-数据结构在不同领域的应用

大家好,今天和大家一起总结一下数据结构在不同领域和场景的应用~ 不同的数据结构适用于解决不同类型的问题,从简单的数组到复杂的图结构,每种数据结构都有其独特的应用场景。 1. 数组与链表 1.1 概念 数组:一种线性数据结构&a…...

如何创建基于udp的客户端和服务端

1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...