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

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

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

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

 

相关文章:

MySQL:表设计

表的设计 从需求中获得类,类对应到数据库中的实体,实体在数据库中表现为一张一张的表,类中的属性就对应着表中的字段(也就是表中的列) 表设计的三大范式: 在数据库设计中,三大范式&#xff0…...

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterato…...

大三学生实习面试经历(1)

最近听了一位学长的建议,不能等一切都准备好再去开始,于是就开始了简历投递,恰好简历过了某小厂的初筛,开启了线上面试,记录了一些问题: (通过面试也确实了解到了自己在某些方面确实做的还不够…...

【论文复现】STM32设计的物联网智能鱼缸

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀STM32设计的物联网智能鱼缸 【1】项目功能介绍【2】设计需求总结【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】ESP8266工作模式…...

常见长选项和短选项对应表

长选项和短选项的等效形式 在命令行工具中,这种长选项(如--delete)和短选项(如-d)等效的情况很常见。例如--verbose和-v(用于输出详细信息),--quiet和-q(用于安静模式&a…...

Ubuntu24 上安装搜狗输入法

link 首先在终端中依次输入以下代码 sudo apt update sudo apt install fcitx 找到语言支持 在终端中依次输入 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ sudo apt purge ibus 进入网页 搜狗输入法linux-首页​ shurufa.sogou.com/linux 找到刚才下…...

【AI图像生成网站Golang】JWT认证与令牌桶算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 三、JWT认证与令牌桶算法 在现代后端开发中,用户认证和接口限流是确保系统安全性和性能的两大关键要素…...

关于强化学习的一份介绍

在这篇文章中,我将介绍与强化学习有关的一些东西,具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习:做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作,而是必须通…...

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…...

Flutter:事件队列,异步操作,链式调用。

Flutter分2种队列 1、事件队列:异步的处理,按顺序执行 import package:flutter/material.dart; main(){testFuture1();testFuture2(); }// 按顺序执行处理A->B->C testFuture1() async {Future((){return 任务A;}).then((value){print(按顺序执行&…...

从零开始学习 sg200x 多核开发之 eth0 自动使能并配置静态IP

前文提到 sophpi 默认没有使能有线网络,需要手工配置: [rootsg200x]~# ifconfig eth0 up [rootsg200x]~# udhcpc -i eth0 [rootsg200x]~# ifconfig eth0 Link encap:Ethernet HWaddr EA:BD:18:08:1E:87 inet addr:192.168.188.142 Bcast:192.1…...

《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信

《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信 《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信进程间通信的基本概念通过管道实现进程间通信通过管道进行进程间双向通信 运用进程间通信习题(1)什么是进程间通信&…...

开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-集成心知天气(二)

一、前言 Qwen-Agent 是一个利用开源语言模型Qwen的工具使用、规划和记忆功能的框架。其模块化设计允许开发人员创建具有特定功能的定制代理,为各种应用程序提供了坚实的基础。同时,开发者可以利用 Qwen-Agent 的原子组件构建智能代理,以理解和响应用户查询。 本篇将介绍如何…...

通过声纹或者声波来切分一段音频

通过声纹识别或基于声波特征的模型,确实可以帮助切分一段音频并区分出不同讲话者的语音片段。这种技术被称为 基于声纹的语音分割 或 基于说话人识别的音频分割。其核心原理是利用每个说话者的 声纹特征(即每个人独特的语音特征)来识别和切分…...

sql专场练习(二)(16-20)完结

第十六题 用户登录日志表为user_id,log_id,session_id,visit_time create table sql2_16(user_id int,log_id int,session_id int,visit_time string );没有数据 visit_time 时间格式为2024-11-15 用sql查询近30天每天平均登录用户数量 with t1 as (select visit_time,coun…...

[ 网络安全介绍 2 ] 网络安全发展现状

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

《基于Oracle的SQL优化》读书笔记

查看执行计划set autotrace traceonly explain在当前session中将优化器模式改为RULE。alter session set optimizer_modeRULE;统计信息存储在oracle的数据字典里,且从多个维度描述了oracle数据库里相关对象的实际数据量,实际数据分布等详细信息。 -- 对…...

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定! 4.5 准确率 5、Pytorch完成回归任务 5.…...

Go八股(Ⅵ)Goroutine 以及其中的锁和思想

Goroutine与并发编程的关系 什么是并发 是指多个任务在同一时间段内进行处理,但不一定是在同一时刻执行。并发强调的是“结构上的并行性”,也就是说,程序能够在一个时间端内同时处理多个任务,但是这些任务可能是交替进行的。例如…...

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

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

蓝桥杯每日真题 - 第15天

题目:(钟表) 题目描述(13届 C&C B组B题) 解题思路: 理解钟表指针的运动: 秒针每分钟转一圈,即每秒转6度。 分针每小时转一圈,即每分钟转6度。 时针每12小时转一圈…...

Python的Matplotlib

介绍: Matplotlib 是一个非常强大的 Python 绘图库,支持多种不同类型的图表。以下是 Matplotlib 支持的一些常见图表类型: 前情提要: from matplotlib import rcParams# 设置支持中文的字体 rcParams[font.sans-serif] [SimHei…...

Python数据分析:分组转换transform方法

大家好,在数据分析中,需要对数据进行分组统计与计算,Pandas的groupby功能提供了强大的分组功能。transform方法是groupby中常用的转换方法之一,它允许在分组的基础上进行灵活的转换和计算,并将结果与原始数据保持相同的…...

高效灵活的Django URL配置与反向URL实现方案

高效灵活的Django URL配置与反向URL实现方案 目录 📑 1. 基本的Django URL配置及反向URL的实现 🔧 2. 使用path()替代re_path()配置URL的优势与劣势 🛠️ 3. 使用URL命名空间(namespace)提高URL管理的可维护性 &…...

深入探讨 MySQL 配置与优化:从零到生产环境的最佳实践20241112

深入探讨 MySQL 配置与优化:从零到生产环境的最佳实践 引言 MySQL 是全球最受欢迎的开源关系型数据库之一,其高性能、灵活性和广泛的社区支持使其成为无数开发者的首选。然而,部署一台高效、稳定的 MySQL 实例并非易事。本文将结合一个实际…...

Java-Redisson分布式锁+自定义注解+AOP的方式来实现后台防止重复请求扩展

1. 添加依赖 首先,在项目的pom.xml文件中添加Redisson和Spring AOP的相关依赖: <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.8</version> </dependency> <dependency…...

Java 全栈知识体系

包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 数据库原理, MySQL, ElasticSearch, MongoDB, Docker, k8s, CI&CD, Linux, DevOps, 分布式, 中间件, 开发工具, Git, IDE, 源码阅读&#xff0c;读书笔记, 开源项目......

树状数组+概率论,ABC380G - Another Shuffle Window

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 G - Another Shuffle Window 二、解题报告 1、思路分析 不难用树状数组计…...

机器学习day1-数据集

机器学习 一、机器学习 1.定义 让计算机在数据中学习规律并根据得到的规律对未来进行预测。 2.发展史 19世纪50年代&#xff1a;图灵测试提出、塞缪尔开发的西洋跳棋程序&#xff0c;标志着机器学习正式进入发展期 19世纪80年代&#xff1a;神经网络反向传播&#xff08;…...

【Golang】——Gin 框架中的路由与请求处理

文章目录 1. 路由基础1.1 什么是路由&#xff1f;1.2 Gin 中的路由概述 2. 创建简单路由2.1 基本路由定义2.2 不同请求方法的路由 3. 路由参数3.1 路径参数3.2 查询参数 4. 路由分组4.1 为什么使用路由分组&#xff1f;4.2 路由分组示例 5. 请求处理与响应5.1 Gin 中的 Context…...