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)-> );

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

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

 

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

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

相关文章

网盘聚合搜索项目Aipan(爱盼)

本文软件由网友 刘源 推荐; 简介 什么是 Aipan(爱盼) ? Aipan(爱盼)是一个基于 Vue 和 Nuxt.js 技术构建的开源网盘搜索项目。其主要目标是为用户提供一个能够自主拥有和管理的网盘搜索网站。该项目持续维护和更新&a…

当微软windows的记事本被AI加持

1985年,微软发布了Windows 1.0,推出了一款革命性的产品:记事本(Notepad)。这款软件旨在鼓励使用一种未来主义的新设备——鼠标,并让人们可以不依赖VI等键盘工具就能书写文本和编写代码。记事本因其简洁和高…

Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了接口级的服务引入订阅的refreshInterfaceInvoker方法,当时还有最为关键的notify服务通知更新的部分源码没有学习,本次我们来学习notify通知本地服务更新的源码。 Dubb…

自存 关于RestController请求传参数 前端和后端相关

1.Get请求 Get请求传递参数一般是 1.通过PathVariable来映射 URL 绑定的占位符 后端 GetMapping("test/{id}")public R test(PathVariable Integer id){System.out.println(id);return R.success(id);}前端 export function test(id:any){return request({url:&q…

Python练习27

Python日常练习 题目: 编写函数,接收一个正偶数a,任何一个都可以分解成两个 素数之和,如果存在多组符合条件的素数,则全部输出。 例如: 【请输入一个正偶数】50 50 3 47 50 7 43 50 13 37 5…

查询DBA_FREE_SPACE缓慢问题

这个是一个常见的问题,理论上应该也算是一个bug,在oracle10g,到19c,我都曾经遇到过;今天在给两套新建的19C RAC添加监控脚本时,又发现了这个问题,在这里记录一下。 Symptoms 环境:…

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后,用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…

20.UE5UI预构造,开始菜单,事件分发器

2-22 开始菜单、事件分发器、UI预构造_哔哩哔哩_bilibili 目录 1.UI预构造 2.开始菜单和开始关卡 2.1开始菜单 2.2开始关卡 2.3将开始菜单展示到开始关卡 3.事件分发器 1.UI预构造 如果我们直接再画布上设计我们的按钮,我们需要为每一个按钮进行编辑&#x…

每天五分钟机器学习:支持向量机算法数学基础之核函数

本文重点 从现在开始,我们将开启支持向量机算法的学习,不过在学习支持向量机算法之前,我们先来学习一些支持向量机所依赖的数学知识,这会帮助我们更加深刻的理解支持向量机算法,本文我们先来学习核函数。 定义 核函数(Kernel Function)是一种在支持向量机(SVM)、高…

向潜在安全信息和事件管理 SIEM 提供商提出的六个问题

收集和解读数据洞察以制定可用的解决方案是强大网络安全策略的基础。然而,组织正淹没在数据中,这使得这项任务变得复杂。 传统的安全信息和事件管理 ( SIEM ) 工具是组织尝试使用的一种方法,但由于成本、资源和可扩展性等几个原因&#xff0…

sqli-labs靶场17-20关(每日四关)持续更新!!!

Less-17 打开靶场,发现页面比之前多了一行字 翻译过来就是,密码重置,大家肯定会想到,自己平时在日常生活中怎么密码重置,肯定是输入自己的用户名,输入旧密码,输入新密码就可以了,但…

谷歌AI进军教育,这将改变未来?

近日,谷歌(Google)正式发布了一款名为“Learn About”的全新人工智能工具,这犹如一颗耀眼的新星,在教育领域掀起了一阵波澜。这款产品具有诸多令人瞩目的亮点,为学习者带来了全新的学习体验。 个性化的学习…

高级计算机算法的8道题(贪心、动态规划)

记录这篇的起因:最近要考试了,我又要考试了!!!是之前上过的一门课,然后这次老师划的重点跟没划无差了。毫无头绪,我就开始翻以前上过这门课的资料。(为什么我有点焦虑,是…

Nginx: 实现Websocket代理

概述 Nginx 代理模式中,大多都是基于 HTTP 的 Proxy 模块来对应设置的除此之外,Nginx 还可以实现更多细小化的协议的HTTP代理,比如 ws 的代理 WS 的建立模式 websocket 它其实是建立在HTTP连接上,先要建立起HTTP连接 建立好连接…

TypeORM在Node.js中的高级应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 TypeORM在Node.js中的高级应用 TypeORM在Node.js中的高级应用 TypeORM在Node.js中的高级应用 引言 TypeORM 基本概念 1. 实体&am…

Spring整合Redis

前言 在Spring项目中整合Redis,能显著提升数据缓存、分布式锁、会话管理等操作的效率。Jedis作为轻量级的Java Redis客户端,搭配Spring Data Redis模块,能够简化Redis的连接和数据操作,实现更高性能的读写与灵活的缓存管理。本文…

将已有的MySQL8.0单机架构变成主从复制架构

过程: 把数据库做一个完全备份, 恢复到从节点上, 恢复后从备份的那个点开始往后复制,从而保证后续数据的一致性。 步骤: 修改 master 主节点 的配置( server-id log-bin )master 主节点 完全备份( mysqldump )master 主节点 创建…

一文3000字从0到1带你进行Mock测试(建议收藏)

​什么是mock? ​mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为 为什么要使用Mock? 之所以使用mock测试,是因…

小程序如何完成订阅

小程序如何完成订阅 参考相关文档实践问题处理授权弹窗不再触发引导用户重新授权 参考相关文档 微信小程序实现订阅消息推送的实现步骤 发送订阅消息 小程序订阅消息(用户通过弹窗订阅)开发指南 实践 我们需要先选这一个模板,具体流程参考…

SOHO场景开局(小型,多子网):AP+管理型交换机+路由器+光猫

业务需求 1. 实现除光猫外,整网设备通过APP进行开局,开局部署完成后,能够通过APP远程运维。 2. 需要单独划分访客、办公、视频监控3个子网,其中访客子网供顾客无线上网使用,办公子网用于接入无线和有线办公终端&#x…