MySQL:表设计

表的设计

从需求中获得类,类对应到数据库中的实体,实体在数据库中表现为一张一张的表,类中的属性就对应着表中的字段(也就是表中的列)

表设计的三大范式:

在数据库设计中,三大范式(3NF)用于确保数据的结构清晰、冗余较少,并且维护数据的一致性。

第一范式

关系型数据库中最基本的要求,不满足第一范式就不可以被称关系型数据库。

要求:表里的字段不能进行继续的拆分

举例(设计一个学生表)

错误形式:

像这样的表,学校列还可以进行拆分,并且并没有一个数据类型来显示学校,我们也可以单独的把学校建成一个表,在两个表中建立关系即可,可以拆分的表在关系型数据库中是绝对不能存在的

正确形式:

像这样的表就无法进行拆分,每一个列都可以使用一个数据类型表示,满足第一范式的要求。

第二范式

在满足第一范式的前提下,所有非主属性(即非关键字字段)必须完全依赖于整个主键,而不能只是部分依赖于主键。

要求:去除部分依赖,即字段只能依赖于主键的全部,而不是主键的一部分。

举例(学生可以选修课程,课程有对应的学分,学生考试后每一门选修科目有对应的成绩,用数据库中的表记录学生的成绩)

错误形式:

学号   姓名   年龄    课程名    学分    成绩  

123     xiaoli   15        数学      80         94  

注:

学生相关的信息通过学号来确定,学分通过课程确定,成绩由学号和课程名共同确定。

说明学号和课程名作为复合主键来确定学生的成绩

但是学生的姓名和年龄只由学号决定,学分只有课程决定。

对于这种被两个或者多个关键字段决定一条记录,但是其中又有些记录只被一个关键字段决定的情况我们称之为部分函数依赖,不满足第二范式。

正确形式:

        学生表

学号   姓名    年龄

          课程表

课程编号   课程名   学分

         选修成绩

学号    课程编号    成绩

这样的设计则满足第二范式的要求

注:如果一个表中无复合主键,那么这种表是天然满足第二范式。

不满足第二范式可能出现的问题:

1.数据冗余

由于非主属性只依赖主键的一部分,会导致数据重复存储

学生的姓名,年龄,学分大量的重复出现,造成大量的数据冗余。

2.更新异常

更新某些信息时,可能需要修改多条记录,增加了出错的风险

如果调整其中的一个数据,那么就需要更新所有的记录在MySQL中,如果有些更新成功,有些失败,就会造成数据不一致。

如果要将学分调成为100,就需要对MySQL中的所有数据进行更新,如果某些失败,就会造成数据不一致。

3.删除异常

删除某些记录时,可能会丢失重要信息

删除了所有选修"数学"课程的学生,课程名称课程ID 的对应关系也会被丢失,无法得知课程ID 11 是"数学"。

4.插入异常

由于数据的部分依赖,可能无法插入某些信息

如果一个新课程尚未分配给任何学生,我们无法在当前表中直接插入它,因为需要同时提供一个学生ID,这与逻辑不符。

第三范式

满足第二范式的前提下,表中的非主属性必须直接依赖于主键,而不能依赖于其他非主属性。也就是说,表中的非主属性不应该存在传递依赖。

要求:消除传递依赖,即非主属性不能依赖于其他非主属性。

举例(描述学生就读于哪个学院)

错误形式:

学生表

学号   姓名   年龄    所在学院   学院地址   学院的电话

在这个表中,姓名和年龄与学号是强相关的,学院地址和学院的电话与所在学院是强相关的,可以看出,出现了两种强相关关系。

强相关关系中存在传递现象

学号--->所在学院--->学院电话,学院的地址

这样的关系我们称为依赖传递,不满足第三范式

正确形式:

学院表

学院编号   学院名   学院的地址   学院的电话

学生表

学号  姓名   年龄  学院的编号(外键)

这两张表都依赖于自己的主键,学生表可以通过外键建立各种的关系

第三范式可以解决数据冗余,更新异常,插入异常,删除异常等问题。

表的设计方式

一对一

一对一关系是指实体 A 的每条记录与实体 B 的一条记录唯一对应。

例如:一个用户只能有一个对应的用户详情。

设计表的方式

登陆系统

1.把两个实体的信息统计到一个表中

2.将两个实体信息分别写入两个表中,建立外键联系。

一对多

一对多关系是指实体 A 的一条记录可以对应实体 B 的多条记录,但实体 B 的每条记录只能对应实体 A 的一条记录。

实例:班级对学生

设计表的方式

将学生表与班级表建立关系

多对多

多对多关系是指实体 A 的一条记录可以对应实体 B 的多条记录,同时实体 B 的一条记录也可以对应实体 A 的多条记录。

实例:一个学生选修多门课程,一门课程被多个学生选修。

设计表的方式

分别对课程和学生建表,然后再建一个关系表创建关联的关系

代码演示

 create table class(
     ->class_id bigint primary key auto_increment,
    -> name varchar(12) not null
    -> );

create table student(
    -> student_id bigint primary key auto_increment,
    -> name varchar(15) not null,
    -> sn varchar(10) unique,
    -> email varchar(20),
    -> class_id bigint,
    -> foreign key(class_id) references class(class_id)
    -> );

create table course(
    -> course_id bigint primary key auto_increment,
    -> name varchar(20) not null
    -> );

create table score(
    -> score_id bigint primary key auto_increment,
    -> student_id bigint,
    -> course_id bigint,
    -> score decimal(5,2),
    -> foreign key(student_id) references student(student_id),
    ->  foreign key(course_id) references course(course_id)
    -> );

注:班级表和学生表是一对一的关系,学生表和课程表之间是多对多的关系

希望能对大家有所帮助!!!!!

 

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

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

相关文章

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因: 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常,SpringBootTest注解用于加载 Spring Boot 应用上下文,但它需要找到一个带有SpringBootConfiguration(或者Configuration&am…

Python爬虫下载新闻,Flask展现新闻(2)

上篇讲了用Python从新闻网站上下载新闻,本篇讲用Flask展现新闻。关于Flask安装网上好多教程,不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图,页面简单,主要显示新闻标题。 分页,使用最简单的分页技术&…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程,即插即用,具体看见以下介绍: 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计,可实现工厂设备信息化需求,对…

【头歌实训:拆分单链表】

头歌实训:拆分单链表 文章目录 任务描述相关知识单链表的基本概念单链表的头结点单链表的特点单链表插入一个结点单链表删除一个结点删除操作的语句如下: 创建单链表头插法建立单链表尾插法建立单链表 输出单链表 编程要求测试说明输入格式输出格式样例…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日,渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人,莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院(庚贤堂中医药…

零基础Java第十九期:认识String(一)

目录 一、String的重要性 二、String的常用方法 2.1. 字符串构造 2.2. String对象的比较 2.3. 字符串查找 2.4. 转化 2.4. 字符串替换 2.5. 字符串拆分 2.6. 字符串截取 一、String的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能…

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重,空气质量的监测与管理已经…

JMeter中添加请求头

在JMeter中添加请求头的步骤如下: 1.打开HTTP信息头管理器 : 首先,你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击,然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验,现有两个随机均匀的有样本组A、B,对其中一个组A做出某种改动,实验结束后分析两组用户行为数据,通过显著性检验,判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术,是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等,按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率,提高工程人员效率,减少板材的浪费。覆铜…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点,其中一个有 pod,另一个则没有,那么新的 pod 会被调度到哪个节点上? 应用程序通过容器的形式运行,如果 OOM(Out-of-Memory)了,是容器重…

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节,首先需要考虑的是一块连续区域分配的过程,这个过程中会有很多问题,首先比较关注的一个问题是…

CICD持续集成与持续交付

一 CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集成…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值,常用来表示对象属性的唯一标识 复杂数据类型 object,数组,函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…

多线程-阻塞队列

目录 阻塞队列 消息队列 阻塞队列用于生产者消费者模型 概念 实现原理 生产者消费者主要优势 缺陷 阻塞队列的实现 1.写一个普通队列 2.加上线程安全和阻塞等待 3.解决代码中的问题 阻塞队列 阻塞队列,是带有线程安全功能的队列,拥有队列先进…

Uniapp 引入 Android aar 包 和 Android 离线打包

需求: 原生安卓 apk 要求嵌入到 uniapp 中,并通过 uniapp 前端调起 app 的相关组件。 下面手把手教你,从 apk 到 aar,以及打包冲突到如何运行,期间我所遇到的问题都会 一 一 进行说明,相关版本以我文章内为…

软间隔支持向量机

软间隔支持向量机 ​ 我们先直接给出软间隔支持向量机的形式: P min ⁡ ω , b , ζ 1 2 ∥ ω ∥ 2 2 − C ∑ i 1 m ζ i s . t . y i ( ω x i b ) ≥ 1 − ζ i , i 1 , 2 , 3.. m ζ i ≥ 0 , i 1 , 2 , 3.. m P \min_{\omega,b,\zeta} \frac{1}{2}\Ve…

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…

Vue3中实现插槽使用

目录 一、前言 二、插槽类型 三、示例 四、插槽的分类实现 1. 基本插槽 2. 命名插槽 3. 默认插槽内容 4. 作用域插槽&#xff08;Scoped Slots&#xff09; 5. 多插槽与具名插槽组合 一、前言 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;用于实现组件的内…