Mysql(五) --- 数据库设计

文章目录

  • 前言
  • 1.范式
    • 1.1.第一范式
      • 1.1.1 定义
      • 1.1.2.例子
    • 1.2.第二范式
      • 1.2.1 定义
      • 1.2.2 例子
      • 1.2.3.不满足第二范式可能会出现的问题
    • 1.3.第三范式
      • 1.3.1 定义
      • 2.3.2 示例
  • 2. 设计过程
  • 3. 实体-关系图
    • 3.1 E-R图的基本组成
    • 3.2 关系的类型
      • 3.2.1 一对一关系(1:1)
      • 3.2.2 ⼀对多关系(1:N)
      • 3.2.3 多对多关系(M:N)


前言

上一篇博客中,我们学习增删查改等基本操作,在工作中,每种表之间都是存在关联的,而不是相互独立的,因此这一篇中,我们来学习数据库设计和联合查询


1.范式

数据库的范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数
据库,这些不同的规范要求被称为不同的范式。
关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德
范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式),越高的范式数据库冗余越
小。然而,普遍认为范式越高虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此
在实际应用中,数据库设计通常只需满足第三范式即可。

1.1.第一范式

1.1.1 定义

• 数据库表的每⼀列都是不可分割的原子数据项,而不能是集合,数组,对象等非原子数据。
• 在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不
能被称为关系数据库,

1.1.2.例子

定义一个学生表,包括学生信息和学校信息。
但是我们发现上面的学校,学校也是一个对象,他也可以继续再分,因此这样分是不满足第一范式的。
在这里插入图片描述因此在定义表的时候,对照到数据中的数据类型,每一个字段都可以用一个数据类型表示,那么当前的数据类型就满足第一范式

1.2.第二范式

1.2.1 定义

在满足第一范式的基础上,不存在非关键字段对任意候选键部分函数依赖。存在于表中定义了复合主键的情况下。

候选键:可以唯⼀标识一行数据的列或列的组合,可以从候选键中选⼀个或多个当做表的主键

在这里插入图片描述

1.2.2 例子

学生可以选修课程,课程有对应的学分,学生考试后每门课程会产生相应的成绩。
首先先举一个反例,那就是所有的内容都写在一个表中。
在这里插入图片描述

  • 这张表中使用学号+课程名定义复合主键来唯一标识一个学生某门课程的成绩,这也是这张表的主要作用
  • 学生是通过学号来确定的,学生的姓名、年龄和性别和课程没有关系,即 学生的信息只依赖学号,不依赖课程名;学分是通过课程来确定的,课程的学分与学生没有关系,即学分只依赖课程名,不依赖学生
  • 对于使用复合主键的表,如果⼀⾏数据中的有些列只与复合主键中的⼀个或其中几个列有关系,那么就说他存在部分函数依赖,也就不满足第⼆范式。
    在这里插入图片描述

1.2.3.不满足第二范式可能会出现的问题

  1. 数据冗余
    学生的姓名、年龄、性别和课程的学分在每行记录中重复出现,造成了大量的数据冗余。
  2. 更新异常
    如果要调整MySQL的学分,那么就需要更新表中所有关于MySQL的记录,⼀旦执行中断导致某些记录更新成功,某些数据更新失败,就会造成表中同⼀门课程出现不同学分的情况,出现数据不⼀致问题。
  3. 插⼊异常
    ⽬前这样的设计,成绩与每⼀门课和学生都有对应关系,也就是说只有学⽣参加选修课程考试取得了成绩才能生成⼀条记录。当有一门新课还没有学生参加考试取得成绩之前,那么这门新课在数据库中是不存在的,因为成绩为空时记录没有意义。
  4. 删除异常
    把毕业学生的考试数据全都删除,此时课程和学分的信息也会被删除掉,有可能导致⼀段时间内,数据库里没有某门课程和学分的信息
    在这里插入图片描述

1.3.第三范式

1.3.1 定义

在满足第二范式的基础上,不存在非关键字段,对任⼀候选键的传递依赖。

2.3.2 示例

要求学生表中记录学生所属的学院,在满足第二范式的基础上对学生表做出修改。
我们先举一个反例
在这里插入图片描述

  • 因为是要描述学生信息,并且在表中定义了Id为主键,Id可以明确的标识每条学生信息
  • 在这个表结构中,可以看出学生的学号、姓名、年龄、性别与主键Id强相关;学院电话、学院地址与学院强相关;在⼀个表中出现了两个强相关的关系,而且这两个强相关关系又存在传递现象,即通过学生Id可以找到学生记录,学⽣记录中包含学院名,每个学院又有自己的电话和地址。
  • 这种传递现象称为传递依赖,所以当前的表不满足第三范式

在这里插入图片描述
按照下面图写的,就符合第三范式
在这里插入图片描述


2. 设计过程

  1. 从现实业务中抽象得到概念类
    概念类是从现实世界中抽象出来的,在需求分析阶段就需要确定下来
    类对应了数据库设计中的实体,实体对应了数据库中的表
    类中的属性对应实体中的属性,实体的属性对应了表中的列
  2. 确定实体与实体之间的关系,并画出E-R画,方便项目参与⼈员理解与沟通
  3. 根据E-R图完成SQL语句的编号并创建数据库

3. 实体-关系图

实体-关系图(Entity-Relationship Diagram)简称E-R图,也称作实体联系模型、实体关系模型,是⼀种用于描述数据模型的概念图,主要用于数据库设计阶段。

3.1 E-R图的基本组成

E-R图包含了以下三种基本成分:
• 实体:即数据对象,用矩形框表,比如用户、学生、班级等。
• 属性:实体的特性,用椭圆形或圆角矩形表示,如学生的姓名、年龄等。
• 关系:实体之间的联系,用菱形框表示,并标明关系的类型,并用直线将相关实体与关系连接起来。

3.2 关系的类型

3.2.1 一对一关系(1:1)

  • 一个用户实体包含的属性有:用户昵称,真实姓名,手机号,邮箱地址,性别,学校
  • 一个账户实体包含的属性有:登录用户名,密码
  • 用户实体与账户实体是一对一的关系,用E-R图表如下:
    *在这里插入图片描述

3.2.2 ⼀对多关系(1:N)

• ⼀个学生实体包含的属性有:真实姓名,学号,年龄,性别,入学时间
• ⼀个班级实体包含的属性有:班级名,学生人数
• ⼀个班级中有多个学生,所以班级实体与学生实体是一对多的关系,反过来说学生实体与班级实体是多对一,用E-R图表示如下:
在这里插入图片描述

3.2.3 多对多关系(M:N)

  • ⼀个学生实体包含的属性有:真实姓名,学号,年龄,性别、入学时间
  • ⼀个课程实体包含的属性有:课程名
  • ⼀个学生可以选修改多门课程,一门课程也可以被多名学生选修改,所以学生与课程之间是多对多关系,用E-R图表示如下:

在这里插入图片描述

  • 对于多对多关系,可以使用中间表进行记录,比如⼀个学生参加了某⼀门课程的考试得到了相应的成绩,用E-R图表示如下:
    在这里插入图片描述

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

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

相关文章

paimon,基础查询语句测试

基础设置 -- 创建catalog/加载catalog,如果这个catalog已经存在就不会创建,自动加载元数据信息CREATE CATALOG fs_paimon_catalog WITH ( type paimon, warehouse hdfs://wsl01:8020/paimon/catalog ); -- 使用catalog use catalog fs_paimon_catalog…

Java虚拟机(JVM)

目录 内存区域划分堆(Heap)方法区(Method Area)程序计数器(Program Counter Register)虚拟机栈(VM Stack)本地方法栈(Native Method Stack) 类加载的过程类加…

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,可以通过一些间接的方法来实现这一目标&#x…

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具,由python语言实现,通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务,并允许远程登录,被管理主机需要安装py…

卸载PLSQL及标准卸载流程

目录 1. 卸载PLSQL2. 删除注册表3. 删除数据信息 1. 卸载PLSQL 等待进度条走完 2. 删除注册表 regedit 右击删除 3. 删除数据信息 由于AppData是隐藏文件,需要勾选隐藏的项目。 重启电脑,PLSQL就卸载成功了。

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统,客户端和web的结合; 主要是使用java编写客户端代码,采用selenium控制浏览器,主要是用到selenium自动化测试的功能; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…

使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应:详细教程 在现代应用程序中,API调用是一个非常常见的任务。本文将通过一个完整的示例,讲解如何使用Java调用OpenAI的ChatGPT API,并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…

网络参考模型

OSI七层网络参考模型 OSI模型仅作为参考,现实中并不用,OSI模型的目的是为了解决主机之间的网络通讯。 1. 物理层: 物理层将由比特(0和1)组成的数据用不同的媒介(电、光或其他形式的电磁波)传输…

黑马软件测试第一篇_测试理论

概念 使用技术手段验证软件功能是否符合需求 测试种类 功能测试 自动化测试 接口测试 性能测试 按测试阶段划分 单元测试:针对程序源码进行测试 集成测试:又称接口测试,针对模块之间访问地址进行测试 系统测试:对整个系统进行…

京东零售数据湖应用与实践

作者:陈洪健:京东零售大数据架构师,深耕大数据 10 年,2019 年加入京东,主要负责 OLAP 优化、大数据传输工具生态、流批一体、SRE 建设。 当前企业数据处理广泛采用 Lambda 架构。Lambda 架构的优点是保证了数据的完整性…

YOLO的相关改进机制

我的面包多平台有多种关于YOLO的改进,大家尽早关注,不迷路

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显: 没有回显 usernameadmin&passwordadmin 闭合单引号,依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

查看SQL Server授权序列号通过SQL查询查看安装日志文件使用PowerShell查询

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单,但也有一些插件安装会比较难。比如我在安装SadTalker时,就遇到很多问题,一度放弃了,后来查了一些网上攻略,自己也反复查看日志,终于解决,不吐不快。 一、在Stable …

闪迪U盘误删的数据该怎么恢复呢?3个方法轻松解决

闪迪是一家全球知名的美国公司,也是全球最大的闪存数据存储卡产品供应商,其中,闪迪U盘作为其主要产品之一,因其便携性、大容量和高速传输能力而深受用户喜爱。然而,在平时存储重要数据的时候,会因为我们一系…

ElasticSearch备考 -- Update by query Reindex

一、题目 有个索引task,里面的文档长这样 现在需要添加一个字段all,这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起,组成一个新的字段,这个就需要脚本, 这里有两种方案&#xff…

CSRF | GET 型 CSRF 漏洞攻击

关注这个漏洞的其他相关笔记:CSRF 漏洞 - 学习手册-CSDN博客 0x01:GET 型 CSRF 漏洞攻击 —— 理论篇 GET 型 CSRF 漏洞是指攻击者通过构造恶意的 HTTP GET 请求,利用用户的登录状态,在用户不知情的情况下,诱使浏览器…

Elasticsearch(二)集成Spring Boot 基本的API操作

目录 一、集成Spring Boot 1、创建项目 2、pom文件 查看springboot集成的依赖 3、增加es的config类 二、索引相关API 1、创建索引 2、获取索引,判断其是否存在 3、删除索引 三、文档相关API 1、添加文档 2、获取文档,判断是否存在 3、获取文档…

【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet(Residual Network)是一种深度神经网络架构,由微软研究院的Kaiming He等人在2015年提出,并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题,即当网络…