当前位置: 首页 > 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…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

SpringCloudGateway 自定义局部过滤器

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

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言: 类加载器 1. …...