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

数据库MYSQL——表的设计

文章目录

  • 前言
      • 三大范式:
      • 几种实体间的关系:
        • 一对一关系:
        • 一对多关系:
        • 多对多关系:


前言

之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作,
是在已经创建数据库,表之上的操作。
在实际的项目开发过程中,表的设计是需要我们根据需求来分析设计的,
表设计的过程:
OOA面向对象分析–>OOD面向对象设计–>OOP面向对象编程。

首先:我们是从需求中获得(与java中的对象类的概念相同),
然后类对应数据库中的实体,实体对应数据库中一张一张的
,而类中的每一个属性对应表中的每一个字段(列)。

其次获取类与类之间的关系,类与类之间的关系(或者说实体与实体之间的关系)有
一对一,一对多,多对多三种关系。

最后进行SQL语句进行创建表。

三大范式:

在创建关系型数据库时,遵循着一些规则称为三大范式。
第一范式:即表中的每一列属性不可以再划分(即实体不可以作为属性)。
例:设计一个学生表
在这里插入图片描述
如果这样设计即是错误的,因为“学校”是一个实体,它还可以再划分:
在这里插入图片描述

如果“学校”换成下面三个属性,则该表的创建满足第一范式。

第二范式
第二范式即在满足第一范式的基础上,避免非关键字段()对任一候选键(主键,外键,唯一键)产生部分函数依赖(下面给出解释)。第二范式的本质上依然是一个表(非关联表)只能表示一个实体,一个实体只能对应一个类。
举例说明:
反例:
在这里插入图片描述
在此表中,学分不依赖于学号,而依赖于课程名字段,姓名,年龄不依赖于课程名,而是依赖于学号字段,这样在两个及以上的关键字段决定一条记录的表中,存在部分非关键字段对其中一个关键字段依赖的情况称为部分函数依赖。

正例:
在这里插入图片描述
在上图中每张表的非主键字段都强依赖于主键字段,满足第二范式。

不满足第二范式的坏处:

  1. 在查询数据时,会产生大量的数据冗余。
    例如:只想要查询学生的学号,姓名信息,却会展示出课程名,学分等无用的信息。
  2. 更新异常,比如要更新课程所对应的学分,这种实体混合在一张表中的模式会导致不能够整体地更新某一个实体记录中的数据,下次插入数据时,课程对应的学分还是原来的数据,会导致数据不一致的情况出现。
  3. 插入异常:
    对于课程实体我们没有单独地设置一张表,那么假如我们设置了一门新的课程,则除非插入一条学生信息,否则不能查询到此课程的信息如学分,但是插入学生信息时,必须插入此课程的考试成绩,成绩为空又没有意义。
  4. 删除异常:
    如将全部的毕业学生信息都删除后,则课程的信息也全部会被删除,无法查询到课程的信息了。

第三范式:
在满足了第二范式的基础上,不存在非关键字段对任一候选键的传递依赖。本质上依然是一个表中只能实现一个类(实体)。

反例:
在这里插入图片描述

正例:
在这里插入图片描述
还是创建两个表,然后在学生表中用外键联系学院表。

几种实体间的关系:

在表的设计中关于实体之间有一对一,一对多,多对多之间的关系。

一对一关系:

举例:
在这里插入图片描述
在此过程中,账号与用户是两个实体,一个账号对应一个用户,一个用户对应一个账号
我们在设计表时可以有两种方式:
第一种将两个实体的信息放入一张表中设计:

在这里插入图片描述
第二种:设计成两张表,一张表一个实体。
然后将这两张表做关联。
有两种关联方式:
在这里插入图片描述

一对多关系:

举例:
学生与班级的关系,一个学生只能在一个班级之中,而一个班级可以有多个学生。
设计思想:不能将学生与班级两个实体设计在一张表中,不满足三大范式
而列的数据类型不存在集合的情况:所以将关联关系的实现在学生表中。

在这里插入图片描述
站在班级的角度,与学生是一对多的关系,站在学生的角度,与班级是多对一的关系。

多对多关系:

举例:学生与课程的关系,一个学生可以选择多门课程,一门课程可以被多个学生选择。
在这种情况下,应该将学生与课程的关联关系实现单独设计一张表。
在这里插入图片描述
这样设计,在删除关联表中的数据时,不会影响实体本身的信息。

相关文章:

数据库MYSQL——表的设计

文章目录 前言三大范式:几种实体间的关系:一对一关系:一对多关系:多对多关系: 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作, 是在已经创建数据库,表之上的操作。 在实…...

netstat -tuln | grep 27017(显示所有监听状态的 TCP 和 UDP 端口,并且以数字形式显示地址和端口号)

文章目录 1. 确定占用端口的进程使用 lsof 命令使用 fuser 命令 2. 结束占用端口的进程3. 修改 MongoDB 配置文件4. 检查 MongoDB 日志文件5. 重新启动 MongoDB 服务6. 检查 MongoDB 服务状态总结 [rootlocalhost etc]# netstat -tuln | grep 27017 tcp 0 0 127.0.…...

非线性控制器设计原理

非线性控制器设计原理 非线性控制器设计旨在解决非线性系统的控制问题,克服传统线性控制器在处理非线性现象(如饱和、死区、耦合、时变性等)时的不足。其核心在于利用非线性数学工具和设计方法,使控制系统在非线性条件下具备良好…...

MySQL数据库6——SQL优化

一.SQL优化 1.插入优化 优化1:批量插入 insert into 表名 values(记录1),(记录2),……;优化2:手动提交事务 start transaction; insert into 表名 values(记录1),(记录2); insert into 表名 values(记录1),(记录2); …… commit;优化3:主键顺…...

IDEA配置本地maven

因为idea和maven是没有直接关系的。所以使用idea创建maven工程之前需要将本地的maven配置到idea环境中,这样才可以在idea中创建maven工程。配置方法如下: 1.1 配置本地maven 第一步:关闭当前工程,回到idea主界面找到customize--…...

学习日记_20241123_聚类方法(高斯混合模型)续

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字,我们会发现其中包含Spring,那么SpringMVC和Spring之间有怎样的关系呢? SpringMVC隶属于Spring,是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢? 回想web阶段&#x…...

文件操作完成后,为什么要关闭文件

原因包括: 释放系统资源:打开文件时,操作系统会分配资源,如文件描述符或句柄,用于管理文件访问。如果文件保持打开状态,这些资源就不会被释放,可能导致资源耗尽。 确保数据完整性:写…...

vue3+echarts+ant design vue实现进度环形图

1、代码 <div> <!-- 目标环形图 --><div id"main" class"chart_box"> </div><div class"text_target">目标</div> </div>// 目标环形图 const onEcharts () > {// 基于准备好的dom&#xff0c;初…...

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…...

C++知识点总结(58):序列型动态规划

动态规划Ⅰ 一、基础1. 意义2. 序列 dp 解法 二、例题1. 最大子段和2. 删数最大子段和&#xff08;数据强度&#xff1a;pro max&#xff09;3. 最长上升子序列&#xff08;数据强度&#xff1a;pro max&#xff09;4. 3 或 5 的倍数序列5. 数码约数序列 一、基础 1. 意义 动…...

go interface(接口)使用

在 Go 语言中&#xff0c;接口&#xff08;interface&#xff09;是一种抽象类型&#xff0c;它定义了一组方法&#xff0c;但是不实现这些方法。接口指定了一个对象的行为&#xff0c;而不关心对象的具体实现。接口使得代码更加灵活和可扩展。 定义接口 接口使用 type 关键字…...

【docker】docker commit 命令 将当前容器的状态保存为一个新的镜像

在Docker容器中安装了许多软件&#xff0c;并希望将当前容器的状态保存为一个新的镜像&#xff0c;可以使用docker commit命令来创建一个新的镜像。以下是如何操作的步骤&#xff1a; 找到容器ID或名称&#xff1a; 首先&#xff0c;需要找到想要保存的容器的ID或名称。可以使用…...

使用 Java 中的 `String.format` 方法格式化字符串

前言 在编程过程中&#xff0c;我们经常需要创建格式化的字符串来满足特定的需求&#xff0c;比如生成用户友好的消息、构建报告或是输出调试信息。Java 提供了一个强大的工具——String.format 方法&#xff0c;它可以帮助我们轻松地完成这些任务。 String.format 方法简介 …...

图论最短路(floyed+ford)

Floyd 算法简介 Floyd 算法&#xff08;也称为 Floyd-Warshall 算法&#xff09;是一种动态规划算法&#xff0c;用于解决所有节点对之间的最短路径问题。它可以同时处理加权有向图和无向图&#xff0c;包括存在负权边的情况&#xff08;只要没有负权环&#xff09;。 核心思…...

BERT的中文问答系统39

实现当用户在GUI中输入问题&#xff08;例如“刘邦”&#xff09;且输出的答案被标记为不正确时&#xff0c;自动从百度百科中搜索相关内容并显示在GUI中的功能&#xff0c;我们需要对现有的代码进行一些修改。以下是完整的代码&#xff0c;包括对XihuaChatbotGUI类的修改以及新…...

从 Mac 远程控制 Windows:一站式配置与实践指南20241123

引言&#xff1a;跨平台操作的需求与挑战 随着办公场景的多样化&#xff0c;跨平台操作成为现代开发者和 IT 人员的刚需。从 Mac 系统远程控制 Windows&#xff0c;尤其是在同一局域网下&#xff0c;是一种高效解决方案。不仅能够灵活管理资源&#xff0c;还可以通过命令行简化…...

【Linux学习】【Ubuntu入门】1-5 ubuntu软件安装

1.使用sudo apt-get install vim&#xff1a;安装vim编辑器。 参考安装 安装时可能会遇到的问题 2.deb软件安装命令sudo dpkg -i xxx.deb 下载软件安装包时下载Linux版本&#xff0c;在Ubuntu中双击deb文件或者输入命令sudo dpkg -i xxx.deb&#xff0c;xxx.deb为安装包名称…...

如何自动下载和更新冰狐智能辅助?

冰狐智能辅助的版本更新非常快&#xff0c;如果设备多的话每次手工更新会非常麻烦&#xff0c;现在分享一种免费的自动下载和安装冰狐智能辅助的方法。 一、安装迅雷浏览器 安装迅雷浏览器1.19.0.4280版本&#xff0c;浏览器用于打开冰狐的官网&#xff0c;以便于从官网下载a…...

动态渲染页面爬取

我们可以直接使用模拟浏览器运行的方式来实现&#xff0c;这样就可以做到在浏览器中看到是什么样&#xff0c;抓取的源码就是什么样&#xff0c;也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面&#xff0c;不用管网页后台的 Ajax 接口到底…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...