MySQL - 多表设计

在实际项目开发中,数据表之间往往存在复杂的关系。常见的关系有一对多、一对一和多对多。为了保持数据的规范性和合理性,多表设计是数据库设计的重要部分。

1. 一对多关系

在一对多关系中,一个表的某条记录对应另一个表的多条记录。常见的场景是“部门”和“员工”之间的关系,一个部门可以有多个员工。

1.1 实现方式

在“多”的一方(员工表)添加一个外键字段,指向“1”的一方(部门表)的主键。

CREATE TABLE tb_dept (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL UNIQUE COMMENT '部门名称',create_time DATETIME NOT NULL,update_time DATETIME NOT NULL
) COMMENT '部门表';CREATE TABLE tb_emp (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL,dept_id INT COMMENT '部门ID',   -- 员工的归属部门 -- 逻辑外键create_time DATETIME NOT NULL,update_time DATETIME NOT NULL
) COMMENT '员工表';

1.2 外键约束

目前上述的两张表(员工表、部门表),在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性的。

想解决上述的问题呢,我们就可以通过数据库中的 外键约束 来解决。

外键约束:让两张表的数据建立连接,保证数据的一致性和完整性。

对应的关键字:foreign key

1.2.1 物理外键

概念:使用foreign key定义外键关联另外一张表。

缺点:

        影响增、删、改的效率(需要检查外键关系)。

        仅用于单节点数据库,不适用与分布式、集群场景。

        容易引发数据库的死锁问题,消耗性能。

1.2.2 逻辑外键

保留对应字段,但是不要加foreign key。

概念:在业务层逻辑中,解决外键关联。

        通过逻辑外键,就可以很方便的解决上述问题。

在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。 甚至在一些数据库开发规范 中,会明确指出禁止使用物理外键 foreign key。

2. 一对一关系

一对一关系常用于将一张表拆分成两张,将大表中的一些基础字段放在一张表当中,将其他的字段放在另外一张表当中,以提高数据查询效率。例如“用户”和“身份证信息”之间的关系。

如果在业务系统当中,对用户的基本信息查询频率特别的高,但是对于用户的身份信息查询频率很 低,此时出于提高查询效率的考虑,我就可以将这张大表拆分成两张小表,第一张表存放的是用户 的基本信息,而第二张表存放的就是用户的身份信息。他们两者之间一对一的关系,一个用户只能 对应一个身份证,而一个身份证也只能关联一个用户。

实现方式:在一张表中添加外键,关联另外一方的主键,并且设置该外键为 UNIQUE,保证一对一关系。

CREATE TABLE tb_user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL COMMENT '姓名',phone CHAR(11) COMMENT '手机号'
) COMMENT '用户表';CREATE TABLE tb_user_card (id INT PRIMARY KEY AUTO_INCREMENT,idcard CHAR(18) NOT NULL COMMENT '身份证号',user_id INT UNIQUE COMMENT '用户ID',  -- 一对一外键CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES tb_user(id)
) COMMENT '身份证信息表';

3. 多对多关系

多对多关系通过中间表实现。例如,“学生”和“课程”之间的关系,一个学生可以选多门课程,一门课程也可以被多个学生选修。

实现方式:创建一个中间表,中间表包含两个外键,分别指向两张表的主键。

CREATE TABLE tb_student (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL COMMENT '学生姓名'
) COMMENT '学生表';CREATE TABLE tb_course (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL COMMENT '课程名称'
) COMMENT '课程表';CREATE TABLE tb_student_course (student_id INT NOT NULL COMMENT '学生ID',course_id INT NOT NULL COMMENT '课程ID',CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES tb_student(id),CONSTRAINT fk_course FOREIGN KEY (course_id) REFERENCES tb_course(id)
) COMMENT '学生课程中间表';

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

快递单号物流跟踪管理快速筛选出已签收单号

看着满屏的单号,是不是感觉眼前一黑要查询到什么时候?别灰心,这不快递批量查询高手来了!这神器就是用来查询物流的好帮手。一键筛选已签收件单号,并导出表格。有了它,你也能轻松查询大量的单号物流。一起试…

生信初学者教程(十五):差异结果的热图

文章目录 介绍加载R包导入数据画图函数热图输出结果总结介绍 热图是一种数据可视化工具,用于展示矩阵数据中的数值大小,通过颜色的深浅或色调变化来表示不同的数值。通常用于生物信息学、统计学和数据分析等领域,以便直观地比较和分析大量数据。 热图展示的是一个二维的数据…

图神经网络实战——分层自注意力网络

图神经网络实战——分层自注意力网络 0. 前言1. 分层自注意力网络1.1 模型架构1.2 节点级注意力1.3 语义级注意力1.4 预测模块 2. 构建分层自注意力网络相关链接 0. 前言 在异构图数据集上,异构图注意力网络的测试准确率为 78.39%,比之同构版本有了较大…

信息安全工程师(26)物理安全概念与要求

前言 物理安全是网络安全体系中的重要组成部分,它关注于保护物理环境、设备和资源免受未经授权的访问、破坏、损坏或盗窃。 一、物理安全概念 物理安全,也称为实体安全,是指通过采取各种物理措施来保护支持网络信息系统运行的硬件&#xff08…

你还在用Java8吗?

Java 11 在企业中,Java的不同版本使用情况随着时间在不断变化。根据最新的数据报告,以下是一些关键点: Java 11 和 Java 17 成为企业中最常用的长期支持(LTS)版本,使用率分别为 48% 和 45%,而 …

1Panel安装部署证书(httpsok.com)

1Panel安装部署证书(httpsok.com) 购买服务器 推荐购买香港服务器,这样通过域名访问就不需要备案。 创建静态站点 申请SSL证书 进入 httpsok.com,点击申请证书 输入站点域名 根据提示,添加DNS解析记录 添加成功后,提示域名验证…

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受居民的喜爱,社区互助服务管理系统小程序被居民普遍使用,为…

【二叉平衡搜索树】Treap

前置 本篇是平衡树-treap的补充学习笔记。 Treap - 树堆 学习基础:适合一定基础的:比如,实现了经典二叉搜索树(常用的几个函数写过), 和二叉堆(数组的上浮下沉会写吗?)&a…

Win11右键默认显示更多设置教程

Win11最大的变化之一莫过于右键菜单发生了变化,最大的问题是什么,是右键菜单很多时候需要点两次,实在是反人类,太麻烦了。 简直是反人类! 必须使用“显示更多选项”的右键菜单。 以管理员方式运行CMD 复制以下命令直…

IP6537_C_30W20V--移动设备快充的得力助手,集成 14 种快充协议的降压 SoC

IP6537_C_30W20V是一款集成同步开关的降压转换器、支 持 14 种输出快充协议、支持 Type-C 输出和 USB PD2.0/PD3.0(PPS)协议的 SoC,为车载充电器、 快充适配器、智能排插提供完整的解决方案。 IP6537_C_30W20V支持 USB Type-C 或者 USB A 输出, 5V 输出功…

C++的STL标准模板库容器--vector类

前言:vector类也可以叫作顺序表,他同样也在STL库中的容器模块中,我还是主要讲常用的几个成员函数和成员变量,同时它晚于string类,所以在设计上没有string冗余。 vector类是一个和数组类似的容器,它属于随机…

插上网线无法连接网络,控制面板以太网消失 | 如何重装网络驱动

如果你确定你的网线没问题,网线插口没问题,那你大概率就是驱动问题,可以试一下本方法。 0 以太网消失 事情是这样的,我工作时候需要接内网,插网线,摸鱼时候连外网,我就把网线关了。 每次插网线…

【Python大语言模型系列】开源机器人对话系统框架RASA介绍与使用(案例分析)

这是我的第361篇原创文章。 一、引言 Rasa是一个开源的对话式 AI 框架,用于构建自定义的对话式 AI 助手。它可以处理自然语言理解(NLU)和对话管理(DM),使得开发者能够轻松地创建功能丰富的对话式 AI 应用。…

番外篇 | 应对遮挡挑战,北航提出新型模型YOLOv5-FFM表现优异

前言:Hello大家好,我是小哥谈。在本文中,作者提出了一种改进的轻量级YOLOv5-FFM模型来解决行人检测遮挡问题。为了实现目标,作者在YOLOv5模型框架基础上进行了改进,并引入了Ghost模块和SE模块。此外,作者还设计了一个局部特征融合模块(FFM)来处理行人检测中的遮挡问题。…

I/O中断处理过程

中断控制器位于CPU和外设之间,用于处理I/O中断请求。以下是一个简化的中断控制器: 现在有A,B,C三个中断源。中断响应优先级:A>B>C,中断处理优先级:C>B>A 假设CPU正在处理A中断源的中断请求,此时…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【上篇】

大型语言模型(LLM)的现代进步主要是缩放定律的产物[6]。 假设模型是在足够大的数据集上训练出来的,那么随着底层模型规模的增加,我们会看到性能的平滑提升。 这种扩展规律最终促使我们创建了 GPT-3 以及随后的其他(更强…

Excel技巧:Excel批量提取文件名

Excel是大家经常用来制作表格的文件,比如输入文件名,如果有大量文件需要输入,用张贴复制或者手动输入的方式还是很费时间的,今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹,选中所有文件&#xff0c…

在线翻译器工具横评:性能、准确率大比拼

无论是旅行者在异国他乡探寻风土人情,学者研究国外的前沿学术成果,还是商务人士与国际伙伴洽谈合作,都离不开一种高效、准确的语言沟通工具。而翻译器在线翻译能很好的帮我们解决这个问题。今天我们一起来探讨有那些好用的翻译工具。 1.福昕…

Golang | Leetcode Golang题解之第443题压缩字符串

题目: 题解: func compress(chars []byte) int {write, left : 0, 0for read, ch : range chars {if read len(chars)-1 || ch ! chars[read1] {chars[write] chwritenum : read - left 1if num > 1 {anchor : writefor ; num > 0; num / 10 {…

【题解】2022ICPC杭州-K

翻译 原题链接   简述一下就是每次询问重新定义一个字母排序表&#xff0c;问在这个顺序下n个字符串的序列的逆序数是多少。 字典树计算逆序数 先考虑初始状况下&#xff0c;即 a < b < . . . < z a<b<...<z a<b<...<z的情况下&#xff0c;逆序…