MySQL之数据库设计

news2024/10/28 16:36:02

前文我们了解了数据库中库、表等的操作,今天我们来学习如何设计数据库??

在设计数据库前,我们先来了解什么是范式??

1. 范式

数据库的范式是一组规则,在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。
关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式),越⾼的范式数据库冗余越⼩。然⽽,普遍认为范式越⾼虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙(由于范式高,需要从多张表中查询,导致数据库IO繁忙),因此在实际应⽤中,我们为了效率和性能,我们一般折中采用第三范式设计数据库

1.1 第一范式

1.1.1 定义:

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

1.1.2 反例

在这里插入图片描述
上图中,学校也是一个对象,可以对其进行拆分,不满足第一范式的定义中每一列都是不可分割的原子数据项,所以不满足第一范式

1.1.3 正例

在这里插入图片描述
学校信息包含在⼀⾏中,每⼀列都不能再进⾏拆分,此时已满⾜第⼀范式

注意:在关系型数据库中,每⼀列都可以⽤基本数据类型表⽰,就天然满⾜第⼀范式

1.2 第二范式

1.2.1 定义

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

候选键:可以唯⼀标识⼀⾏数据的列或列的组合,可以从候选键中选⼀个或多个当做表的主键
非关键字段:没有被主键标识的字段

1.2.2 反例

在这里插入图片描述

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

1.2.3 不满⾜第⼆范式时可能出现的问题

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

1.2.4 正例

设计表:针对需求应该设计三张表,即:学⽣表、课程表和成绩表

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意:第二范式强调的是部分函数依赖,当表中的主键只有一列时,天然满足第二范式。

1.3 第三范式

1.3.1 定义

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

1.3.2 反例

在这里插入图片描述

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

1.3.3 正例

把学院信息拆分出来定义学院表,学⽣表与学院表做关联

在这里插入图片描述
在这里插入图片描述

2.设计过程

  1. 从现实业务中抽象得到概念类 概念类是从现实世界中抽象出来的,在需求分析阶段就需要确定下来
  2. 类对应了数据库设计中的实体,实体对应了数据库中的表
  3. 类中的属性对应实体中的属性,实体的属性对应了表中的列
  4. 确定实体与实体之间的关系,并画出E-R画,⽅便项⽬参与⼈员理解与沟通
  5. 根据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 一对多(多对一)关系

  • ⼀个学⽣实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间
  • ⼀个班级实体包含的属性有:班级名,学⽣⼈数
  • ⼀个班级中有多个学⽣,所以班级实体与学⽣实体是⼀对多的关系,反过来说学⽣实体与班级实体
    是多对⼀着么,⽤E-R图表⽰如下:

在这里插入图片描述

3.3.3 多对多关系

  • ⼀个学⽣实体包含的属性有:真实姓名,学号,年龄,性别,⼊学时间
  • ⼀个课程实体包含的属性有:课程名
  • ⼀个学⽣可以选修改多⻔课程,⼀⻔课程也可以被多名学⽣选修改,所以学⽣与课程之间是多对多关系,⽤E-R图表⽰如下:

在这里插入图片描述

  • 对于多对多关系,可以使⽤中间表进⾏记录,⽐如⼀个学⽣参加了某⼀⻔课程的考试得到了相应的 成绩,⽤E-R图表⽰如下:

在这里插入图片描述


在了解如何设计表后,我们使用SQL语句将其创建

4. 根据实体关系图创建表

4.1 ⽤户与账户的⼀对⼀关系

# 在⽤⼾实体中添加对账⼾实体的关联
drop table if exists users;
create table users (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 nickname varchar(20),
 phone_num varchar(11), 
 email varchar(50),
 gender tinyint(1),
 account_id bigint
);
drop table if exists account;
create table account (
 id bigint primary key auto_increment,
 username varchar(20) not null,
 password varchar(32) not null
);

# 在账⼾实体中添加对⽤⼾实体的关联
drop table if exists users;
create table users (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 nickname varchar(20),
 phone_num varchar(11), 
 email varchar(50),
 gender tinyint(1)
);
drop table if exists account;
create table account (
 id bigint primary key auto_increment,
 username varchar(20) not null,
 password varchar(32) not null,
 users_id bigint
);

4.2 学⽣与班级的⼀对多关系

分别创建学⽣表和班级表,在学⽣表中添加⼀列与班级表建⽴关联关系

# 班级表
drop table if exists class;
create table class (
 id bigint primary key auto_increment,
 name varchar(20)
);

# 学⽣表
drop table if exists student;
create table student (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 sno varchar(10) not null,
 age int default 18,
 gender tinyint(1), 
 enroll_date date,
 class_id bigint
 # 不建议在学生表下用set集合来存放学生的ID信息 因为学生的人数是可能会发生变化,不方便,
 # 其次表中的字段不能用基本类型来修饰,就不满足第一范式
);

4.3 学⽣、课程与成绩的多对多关系

学⽣可以选修多⻔课程,每⻔课程考试后会产⽣⼀个成绩,两个表之间没有办法直接建⽴关系,所以
要⽤到⼀个记录成绩的中间表

# 学⽣表
drop table if exists student;
create table student (
 id bigint primary key auto_increment,
 name varchar(20) not null, 
 sno varchar(10) not null,
 age int default 18,
 gender tinyint(1), 
 enroll_date date,
 class_id bigint,
 foreign key (class_id) references class(id)
);

# 课程表
drop table if exists course;
create table course (
 id bigint primary key auto_increment,
 name varchar(20)
);

# 分数表
drop table if exists score;
create table score (
 id bigint primary key auto_increment,
 score float,
 student_id bigint,
 course_id bigint,
 foreign key (student_id) references student(id),
 foreign key (course_id) references course(id)
);

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

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

相关文章

Elasticsearch 解析:倒排索引机制/字段类型/语法/常见问题

Elasticsearch 是一个分布式的开源搜索引擎,广泛用于全文搜索、分析和数据存储。它基于 Apache Lucene 构建,支持 RESTful 风格的 API,使得开发者能够高效地存储和检索数据。本文将详细讲解 Elasticsearch 的基本原理,特别是其倒排…

ctfshow(66->70)--RCE/命令执行漏洞--禁用命令执行函数

Web66 源代码: if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }代码审计: POST传参c,eval进行代码执行。 思路: 由于题目过滤了命令执行函数,所以使用其他方法进行RCE。 先使用c…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器(做梦),你的导师让你学习部署并且训练不同尺寸的大模型,并且写一个说明文档。你意识到,你最需要学习的就是关于分布式训练的知识,因为你可是第一次接触这么多卡…

【ROS概述】概念及环境搭建

学习途径: 教程:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 课程视频:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 机器人体系 要完全实现一个机器人的系统研发,几乎是“全栈”开发,…

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频: 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程,进程,协程-CSDN博客里面其实有,就是文章中的图片部分,在那一篇文章,初始代码的28,29行…

Python 函数返回值之None类型

什么是None None是类型‘NoneType’字面量,用于表示:空的、无意义的 函数如何返回None 不使用return语句即返回None 主动return None 使用场景 函数返回值if判断变量定义 练习: 练习一:无return语句的函数返回值 # 无ret…

Docker | centos7上对docker进行安装和配置

安装docker docker配置条件安装地址安装步骤2. 卸载旧版本3. yum 安装gcc相关4. 安装需要的软件包5. 设置stable镜像仓库6. 更新yum软件包索引7. 安装docker引擎8. 启动测试9. 测试补充:设置国内docker仓库镜像 10. 卸载 centos7安装docker https://docs.docker.com…

交易逆序对的总数 ---- 分治-归并

题目链接 题目: 分析: 解法一: 暴力解法, 遍历所有的数对, 找到逆序对, 需要两重for循环, 一定会超时解法二: 归并排序的思想如果我们将数组分成两半, 我们在每一半中各找一个数字, 判断是否为逆序对, 再根据归并的思想, 再将一半数组分半, 判断是否为逆序对, 直到数组只有一…

合约门合同全生命周期管理系统:企业智能合同管理的新时代

合约门合同全生命周期管理系统:企业智能合同管理的新时代 1. 引言 随着现代企业的快速发展,合同管理的复杂性日益增加。无论是采购合同、销售合同还是合作协议,合同管理已成为企业运营中至关重要的一环。传统的手工合同管理方式往往效率低下…

WISE:重新思考大语言模型的终身模型编辑与知识记忆机制

论文地址:https://arxiv.org/abs/2405.14768https://arxiv.org/abs/2405.14768 1. 概述 随着世界知识的不断变化,大语言模型(LLMs)需要及时更新,纠正其生成的虚假信息或错误响应。这种持续的知识更新被称为终身模型编…

Colorful/七彩虹将星X17 Pro Max 2023款 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能,自动重建COLORFUL RECOVERY功能,恢复到新机开箱状态。 【格式】:iso 【系统类型】:Windows11 原厂系统下载网址:http://www.bioxt.cn 注意:安装系统会…

网页上的视频怎么下载下来?三种方法

分享三个简单好用的网页视频下载工具,值得使用! 1.IDM IDM 是一款可以提高下载速度达5倍的工具,同时具有恢复、调度和组织下载的功能。如果由于网络问题或意外的电源中断,程序将恢复未完成的下载。 IDM 还具有一个完全功能的站点…

Redis 过期策略 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 过期策略 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 过期策略 & 总结》(学习总结/最新最准/持续更新)《Redis &a…

【SpringBoot】✈️@Service 代替 @Controller 在控制层场景使用

目录 🍸前言 👋一、区别 🍻二、本地测试 2.1 响应类 2.2 控制层 3.Service 测试 🍺三、分析 👀四、章末 🍸前言 小伙伴们大家好,由于最近比较忙,文章更新的稍微怠慢了&#xff0…

leetcode-62-不同路径

题解: 1、dp[i][j]代表到达(i,j)点最多的路径;题目要求机器人每次只能向右或向下走一步,所以到达(i,j)点的最多路径为到达(i-1,j)的最多路径与到达(i,j-1)的最多路径之和。即dp[i][j]dp[i-1][j]dp[i][j-1]。 2、当(i,j)位于矩阵的第一行或第…

rabbitmq高级特性(1):消息确认,持久性,发送方确认和重试机制

目录 1.消息确认机制 1.1.消息确认机制介绍 2.1.Spring-AMQP的三种消息确认(重点) 2.持久性 2.1.交换机持久性 2.2.队列持久性 2.3.消息持久性 3.发送方确认 3.1.confirm确认模式 3.2.return退回模式 4.重试机制 4.1.重试机制定义 4.2.重试…

Padavan开启IPV6

开户IPV6 如果运营商支持IPV6,在网络地图中可以看到获取到的ipv6地址 开启SSH 输入如下命令让访火墙放行IPV6 ip6tables -F ip6tables -X ip6tables -P INPUT ACCEPT ip6tables -P OUTPUT ACCEPT ip6tables -P FRWARD ACCEPT 可以写在自启动脚本里 关闭路由器的防…

CH592进一步降功耗问题

目录 问题描述: 自制模块电流测试: 成熟产品电流测试: 优化程序: 总结: 关注我,躺不平就一起卷吧 问题描述: 之前有记录过,CH592与app连接时电流过大问题&#…

群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI

一、加密工具开发 首先在根目录下extend文件中创建Encipher文件夹&#xff0c;用于专门开发加解密工具&#xff0c;新建RSA算法控制器并命名为Encrypt.php。然后在根目录下config文件夹中创建rsa.php文件&#xff0c;用于配置RSA算法参数。 1、秘钥生成算法 <?php /*** RS…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法&#xff0c;旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面&#xff0c;我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…