数据库多表设计

news2024/11/26 10:22:11

说明:在项目的数据库设计时,表与表之间是有联系的,如学生管理系统中,有部门表,教师表、学生表、课程表等等

一位教师隶属于一个部门,一个部门有多位教师,因此部门表和教师表,是一对多(或者说多对一)的关系;

每位教师/学生的身份证信息都是唯一的,所以教师/学生和身份证信息,是一对一的关系;

每位学生可选多门课,每门课也有多位学生学习,所以学生和课程,是多对多的关系;

综上所述,表与表之间是有联系的,在设计表、操作数据时,不能不考虑到这些情况,不然例如教师隶属某部门(教研部),但部门表中没有次部门(教研部),或者在删除某部门时,没有判断,导致在此之前关联该部门的教师,现在关联了一个不存在的部门。这样,整个表中的数据就乱套了,造成了数据的不完整、不一致

准备工作:创建部门表、教师表,添加一些数据

# 创建部门表
create table tb_department (
    id int auto_increment primary key comment '序列号',
    name char(6) not null comment '部门名'
) comment '部门表';

# 创建教师表
create table tb_teacher (
    id int auto_increment primary key comment '序列号',
    name char(6) not null comment '姓名',
    age tinyint not null comment '年龄',
    gender char(2) not null comment '性别',
    id_care char(18) not null unique comment '身份证号',
    d_id int comment '隶属部门'
) comment '教师表';

# 添加部门
insert into tb_department(name) values ('教研部'),('学工部'),('继续教育部');

# 添加教师
insert into tb_teacher

values (null, '张三', 20, '男', '110110190000001010', '1'),

       (null, '李四', 30, '女', '110110190000001011', '2'),

       (null, '王五', 35, '男', '110110190000001012', '3');

一对多

一对多关系,如上面的部门、教师表,是需要保证教师隶属的部门在部门表中是存在记录,有迹可查的。因此,可以在数据库表中多的一方(教师表中),添加字段,来关联一的一方的主键。但仅添加字段,是无法约束数据库的,数据库该删除部门表的记录,还是照删不误。此时,就可以使用到数据库提供的外键约束(Foreign Key)。

(1)添加外键(视图方式)
在这里插入图片描述

(2)添加外键(SQL语句方式)

alter table 表名
    add constraint 外键名
        foreign key (外键字段) references 外键关联的表(字段);
alter table tb_teacher
    add constraint tb_teacher_tb_department_id_fk_2
        foreign key (d_id) references tb_department (id);

在这里插入图片描述
删除部门,数据库提示错误,不能删除部门表,因为教师表外键关键了部门表。

drop table tb_department;

在这里插入图片描述

添加一条教师记录,关联一个不存在部门,同样会报错

insert into tb_teacher values (null, '赵六', 40, '男', '110110190000001013', '4')

在这里插入图片描述

至此,一对多关系通过数据库的外键约束,实现了数据的完整性和一致性。

但是这种方式(称为物理外键)不推荐使用,因为这种方式每次删除记录、添加记录时都需要做检查,极大地降低了效率。推荐使用代码建立联系的方式(称为逻辑外键),避免造成数据的不完整、不一致的操作,例如删除记录、添加记录时在业务逻辑层(Service层)做判断。
在这里插入图片描述

一对一

一对一关系,如教师的身份证信息和教师。如果在教师表中,把每位老师的身份证信息(身份证号、民族、家庭住址、签发机关、身份证有效期)都放在教师表中,教师表中的字段就太多了,影响查询效率。此时,就可以将教师表中的身份证信息,单独成一张表,给这两张表建立一对一联系。建议把外键设置在查询不频繁的表里,减轻另一张表的负担。需要注意,外键需要唯一且不为空。

创建教师身份信息表

create table tb_teacher_card(
    id int auto_increment primary key comment '序列号',
    card_num char(18) not null unique comment '身份证号',
    nation char(10) not null comment '民族',
    address char(50) not null comment '家庭住址',
    issued char(20) not null comment '签发机关',
    lifespan time not null comment '有效期限',
    t_id int not null unique comment '隶属哪个老师'
) comment '身份证信息'

建立外键约束
在这里插入图片描述

多对多

多对多关系,如学生和课程表,每个学生可以选多门课程,每门课程可以有多个学生。可以将学生表中的选课字段,课程表中的学生字段,单独创建一张表,称为课程选择表。将学生和课程的多对多关系,转换为学生对课程选择表,课程对课程选择表的一对多关系。

创建学生表、课程表、课程选择表

create table tb_student(
    id int auto_increment primary key comment '序列号',
    name char(6) not null comment '姓名',
    age tinyint comment '年龄',
    gender char(2) comment '性别'
) comment '学生表';

create table tb_course(
    id int auto_increment primary key comment '序列号',
    name char(10) not null comment '课程名'
) comment '课程表';

create table tb_course_student(
    id int auto_increment primary key comment '序列号',
    c_id int comment '课程',
    s_id int comment '学生'
) comment '课程选择表'

在课程选择表(tb_course_student)上建立外键约束,课程、学生字段分别指向课程表(tb_course)、学生表(tb_student)的主键

在这里插入图片描述

总结

数据库多表设计的建立原则:

一对多关系:在“多”的一方创建一个字段,这个字段用来关联“一”的一方的主键;(外键,不推荐使用数据库提供的物理外键,建议使用代码约束的逻辑外键)

一对一关系:在任意一方创建外键,外键唯一且不能为空,指向另一方的主键;(建议外键建立在查询不频繁的那张表里面,可以减轻另一张表的负担)

多对多关系:建立一张中间表,中间表至少有2个字段,分别指向各自表的主键;

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

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

相关文章

【c++修行之路】c++11特性--上

文章目录 前言列表初始化用法介绍原理:std::initializer_list 简化声明的方式autodecltype 右值引用移动构造万能引用和完美转发万能引用完美转发 类的新增功能可变参数模板lambda表达式深入探究lambda表达式lambda表达式带来的便利结语 前言 大家好久不见&#xf…

bmp文件格式与保存

BMP文件由三部分组成,分辨是文件头,DIM头和像素数据。具体格式如下: 基本介绍 1. 文件头 14个字节 signature: 为文件标志位,恒为0X42 FileSize:是指整个文件的大小 REservedx:保留位恒为0 …

leetcode700. 二叉搜索树中的搜索(java)

二叉搜索树中的搜索 leetcode700 二叉搜索树中的搜索题目描述 解题思路代码演示二叉树专题 leetcode700 二叉搜索树中的搜索 leetcode 700 二叉搜索树中的搜索。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/search-i…

chatgpt赋能python:Python去掉GIL:提升Python多线程编程性能的突破口

Python去掉GIL:提升Python多线程编程性能的突破口 Python 是世界上最受欢迎的编程语言之一,其中一大原因是其简单易用、优雅简洁的语法。Python 也是一个卓越的多用途编程语言,广泛应用于 Web 开发、科学计算、人工智能等领域。但是&#xf…

javaScript蓝桥杯-----宝贵的一票

目录 一、介绍二、准备三、目标四、代码五、检测踩坑!!六、完成 一、介绍 公司经常举办各种活动,但一到投票环节就犯了难,于是公司决定安排小蓝开发一个投票系统,更好的收集大家的投票信息。为了赶在下一次活动开始前…

k8s亲和性和反亲和性

1.前言 k8s的亲和性和反亲和性都是通过标签来影响pod的调度,在此基础上亲和性又分为硬亲和性和软亲和性,required为硬亲和性即标签内容必须要符合才能调度,preferred为软亲和性即标签内容不一定要符合也能调度,除此之外还有node亲…

Unsupported major.minor version 51.0解决办法

先看看我的报错截图 [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 08:51 min [INFO] Finished at: 2023-0…

[2.0快速体验]Apache Doris 2.0 日志分析快速体验

1. 概述 应用程序、服务器、云基础设施、IoT 和移动设备、DevOps、微服务架构—最重要的业务和 IT 发展趋势帮助我们以前所未有的方式优化运维和客户体验。但这些趋势也导致由机器生成的数据出现爆炸式成长,其中包括日志和指标等,例如,用户交…

Qcon 广州主题演讲:融云实时社区的海量消息分发实践

移步公众号文章 预约纸质版《作战地图》 5 月 26 日-27 日,QCon 全球软件开发大会落地广州。关注【融云全球互联网通信云】了解更多 融云 IM 服务架构师罗伟受邀分享“实时社区的海量消息分发实践”,从实践中来的前沿技术分享,收获现场开发者…

Nautilus Chain上首个DEX PoseiSwap即将开启IDO,潜力几何?

据悉,Nautilus Chain 上的首个 DEX PoseiSwap 即将开启 IDO ,根据官方的最新公告显示,PoseiSwap 即将于 6 月 13 日至 6 月 14 日期间,在 Bounce 平台开启其治理通证 $POSE 的 IDO(Initial DEX Offering)&a…

openEuler Linux 部署 FineReport

openEuler Linux 部署 FineReport 部署环境 环境版本openEuler Linux22.03MySQL8.0.33FineReport11.0 环境准备 升级系统内核和软件 yum -y updatereboot安装常用工具软件 yum -y install vim tar net-tools 安装MySQL8 将 MySQL Yum 存储库添加到系统的存储库列表中 s…

【JavaEE】表白墙再升级(MySQL实现持久化)

表白墙再升级(MySQL实现持久化) 文章目录 【JavaEE】表白墙再升级(MySQL实现持久化)1. 后端引入JDBC的依赖2. 建库建表3. 编写数据库代码(JDBC)3.1 doGet方法改写3.1.1 构建本地数据源3.1.2 用本地数据源构…

移动端的轮播图

效果 技术选取 前端框架用的是vue3,使用的组件库为element-plus以及vant4 引入element-plus和vant4 安装element-plus cnpm install element-plus --save 安装按需导入 cnpm install -D unplugin-vue-components unplugin-auto-import 安装Vant cnpm i vant 按…

Fiddler抓包工具之fiddler的composer可以简单发送http协议的请求

一,composer的详解 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾选请求协议是get、post等 2.url地址栏:输入请求的url地址 3.请求头:第三块区域可以输入请求头信息…

图的简单理解

文章目录 1、图的基本概念2、图的存储结构2.1 邻接矩阵2.2 邻接表 3、图的遍历3.1 广度优先遍历3.2 深度优先遍历 4、最小生成树4.1 Kruskal算法4.2 Prim算法 5、最短路径5.1 单源最短路径–Dijkstra算法5.2 单源最短路径–Bellman-Ford算法5.3 多源最短路径 1、图的基本概念 …

路径规划算法:基于差分进化优化的路径规划算法- 附代码

路径规划算法:基于差分进化优化的路径规划算法- 附代码 文章目录 路径规划算法:基于差分进化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

nginx的rewrite功能

常用的Nginx 正则表达式 ^匹配输入字符串的起始位置$匹配输入字符串的结束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”,但不能匹配“o”?匹配前面的字符零次或一次…

【动态规划专栏】--简单-- 动态规划经典题型

目录 动态规划 动态规划思维(基础) 状态表示(最重要) 状态转移方程(最难) 初始化(细节) 填表顺序(细节) 返回值(结果) 解码方…

【Python FTP/SFTP】零基础也能轻松掌握的学习路线与参考资料

一、Python FTP/SFTP的学习路线 Python FTP/SFTP是Python语言的两种常用的文件传输协议。在学习Python网络编程过程中,学习FTP/SFTP是非常重要的一步。下面给出Python FTP/SFTP的学习路线: 了解FTP/SFTP协议 在开始学习Python FTP/SFTP之前&#xff0…

LSB信息隐藏——Python实现(完整解析版)

系列文章目录 仿射密码实验-Python实现 仿射密码实验——Python实现(完整解析版) DES密码实验-C语言实现 MD5密码实验——Python实现(完整解析版) 文章目录 系列文章目录前言实验方法实验环境实验内容实验步骤1.LSB原理2.确定设计模块Lsb——embdedLsb——extract 实验结果实验…