数据库MYSQL——表的设计

文章目录

  • 前言
      • 三大范式:
      • 几种实体间的关系:
        • 一对一关系:
        • 一对多关系:
        • 多对多关系:


前言

之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作,
是在已经创建数据库,表之上的操作。
在实际的项目开发过程中,表的设计是需要我们根据需求来分析设计的,
表设计的过程:
OOA面向对象分析–>OOD面向对象设计–>OOP面向对象编程。

首先:我们是从需求中获得(与java中的对象类的概念相同),
然后类对应数据库中的实体,实体对应数据库中一张一张的
,而类中的每一个属性对应表中的每一个字段(列)。

其次获取类与类之间的关系,类与类之间的关系(或者说实体与实体之间的关系)有
一对一,一对多,多对多三种关系。

最后进行SQL语句进行创建表。

三大范式:

在创建关系型数据库时,遵循着一些规则称为三大范式。
第一范式:即表中的每一列属性不可以再划分(即实体不可以作为属性)。
例:设计一个学生表
在这里插入图片描述
如果这样设计即是错误的,因为“学校”是一个实体,它还可以再划分:
在这里插入图片描述

如果“学校”换成下面三个属性,则该表的创建满足第一范式。

第二范式
第二范式即在满足第一范式的基础上,避免非关键字段()对任一候选键(主键,外键,唯一键)产生部分函数依赖(下面给出解释)。第二范式的本质上依然是一个表(非关联表)只能表示一个实体,一个实体只能对应一个类。
举例说明:
反例:
在这里插入图片描述
在此表中,学分不依赖于学号,而依赖于课程名字段,姓名,年龄不依赖于课程名,而是依赖于学号字段,这样在两个及以上的关键字段决定一条记录的表中,存在部分非关键字段对其中一个关键字段依赖的情况称为部分函数依赖。

正例:
在这里插入图片描述
在上图中每张表的非主键字段都强依赖于主键字段,满足第二范式。

不满足第二范式的坏处:

  1. 在查询数据时,会产生大量的数据冗余。
    例如:只想要查询学生的学号,姓名信息,却会展示出课程名,学分等无用的信息。
  2. 更新异常,比如要更新课程所对应的学分,这种实体混合在一张表中的模式会导致不能够整体地更新某一个实体记录中的数据,下次插入数据时,课程对应的学分还是原来的数据,会导致数据不一致的情况出现。
  3. 插入异常:
    对于课程实体我们没有单独地设置一张表,那么假如我们设置了一门新的课程,则除非插入一条学生信息,否则不能查询到此课程的信息如学分,但是插入学生信息时,必须插入此课程的考试成绩,成绩为空又没有意义。
  4. 删除异常:
    如将全部的毕业学生信息都删除后,则课程的信息也全部会被删除,无法查询到课程的信息了。

第三范式:
在满足了第二范式的基础上,不存在非关键字段对任一候选键的传递依赖。本质上依然是一个表中只能实现一个类(实体)。

反例:
在这里插入图片描述

正例:
在这里插入图片描述
还是创建两个表,然后在学生表中用外键联系学院表。

几种实体间的关系:

在表的设计中关于实体之间有一对一,一对多,多对多之间的关系。

一对一关系:

举例:
在这里插入图片描述
在此过程中,账号与用户是两个实体,一个账号对应一个用户,一个用户对应一个账号
我们在设计表时可以有两种方式:
第一种将两个实体的信息放入一张表中设计:

在这里插入图片描述
第二种:设计成两张表,一张表一个实体。
然后将这两张表做关联。
有两种关联方式:
在这里插入图片描述

一对多关系:

举例:
学生与班级的关系,一个学生只能在一个班级之中,而一个班级可以有多个学生。
设计思想:不能将学生与班级两个实体设计在一张表中,不满足三大范式
而列的数据类型不存在集合的情况:所以将关联关系的实现在学生表中。

在这里插入图片描述
站在班级的角度,与学生是一对多的关系,站在学生的角度,与班级是多对一的关系。

多对多关系:

举例:学生与课程的关系,一个学生可以选择多门课程,一门课程可以被多个学生选择。
在这种情况下,应该将学生与课程的关联关系实现单独设计一张表。
在这里插入图片描述
这样设计,在删除关联表中的数据时,不会影响实体本身的信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++自动化测试:GTest 与 GitLab CI/CD 的完美融合

在现代软件开发中,自动化测试是保证代码质量和稳定性的关键手段。对于C项目而言,自动化测试尤为重要,它能有效捕捉代码中的潜在缺陷,提高代码的可维护性和可靠性。本文将重点介绍如何在C项目中结合使用Google Test(GTe…

备忘笔记-工具:JetBrains友好工具安装配置

1、配置/脚本文件下载 1、校验地址:https://3.jetbra.in/ 打开选择可用链接,点击跳转可用页面。 2、下载文件 左上角点击下载jetbra.zip文件 下载对应全家桶软件版本号,版本号在对应卡票右上角可见。 2、安装包下载 官网地址&#xff1a…

Flask 基于wsgi源码启动流程

1. 点击 __call__ 进入到源码 2. 找到 __call__ 方法 return 执行的是 wsgi方法 3. 点击 wsgi 方法 进到 wsgi return 执行的是 response 方法 4. 点击response 方法 进到 full_dispatch_request 5. full_dispatch_request 执行finalize_request 方法 6. finalize_request …

Linux 下进程基本概念与状态

文章目录 一、进程的定义二、 描述进程-PCBtask_ struct内容分类 三、 进程状态 一、进程的定义 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。广义定义:进程是一个具有一定…

IDEA使用tips(LTS✍)

一、查找项目中某个外部库依赖类的pom来源 1、显示图 2、导出Maven 项目依赖的可视化输出文件 3、点击要查找的目标类,项目中定位后复制依赖名称 4、在导出的依赖的可视化文件中搜索查找 5、综上得到,Around类来自于pom中的spring-boot-starter-aop:jar…

【shell编程】函数、正则表达式、文本处理工具

函数 系统函数 常见内置命令 echo打印输出 #!/bin/bash # 输出普通文本 echo "Hello, World!"# 输出变量值 name"Alice" echo "Hello, $name"# 输出带有换行符的文本 echo -n "Hello, " # -n 选项不输出换行 echo "World!&quo…

如何选择服务器

如何选择服务器 选择服务器时应考虑以下几个关键因素: 性能需求。根据网站的预期流量和负载情况,选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构,以便…

LeetCode 904.水果成篮

LeetCode 904.水果成篮 思路🧐: 求水果的最大数目,也就是求最大长度,我们是单调的向前求解,则能够想到使用滑动窗口进行解答,可以用hash表统计每个种类的个数,kinds变量统计当前种类&#xff0c…

初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…

小程序免备案:快速部署与优化的全攻略

小程序免备案为开发者提供了便捷高效的解决方案,省去繁琐的备案流程,同时通过优化网络性能和数据传输,保障用户体验。本文从部署策略、应用场景到技术实现,全面解析小程序免备案的核心优势。 小程序免备案:快速部署与优…

L14.【LeetCode笔记】返回倒数第k个节点

目录 1.题目 2.分析 思路 代码 提交结果 1.题目 面试题 02.02. 返回倒数第 k 个节点 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 …

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中,处理 Excel 文件的导入导出是极为常见的需求。 今天,咱们就一起来深入了解一款非常实用的操作 Exce…

基于Java Springboot高校教室资源管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库:…

k8s1.31版本最新版本集群使用容器镜像仓库Harbor

虚拟机 rocky9.4 linux master node01 node02 已部署k8s集群版本 1.31 方法 一 使用容器部署harbor (1) wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker…

C语言数据结构学习:循环队列

C语言 数据结构学习 汇总入口: C语言数据结构学习:[汇总] 1. 循环队列 队列的博客:C语言数据结构学习:队列 循环队列会预先定义最大队列空间,然后定义一个数组,通过队列头和队列尾指针分别指向开头和结尾&…

Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)

目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5,你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址:https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新不易,希望走过路…

Redis 常用数据类型插入性能对比:循环插入 vs. 批量插入

Redis 是一款高性能的键值数据库,其支持多种数据类型(String、Hash、List、Set、ZSet、Geo)。在开发中,经常会遇到需要插入大量数据的场景。如果逐条插入,性能会显得较低,而采用 Pipeline 批量插入 能大幅提…

oneplus6线刷、trwp、magisk(apatch)、LSPosed、Shamiko、Hide My Applist

oneplus6线刷android10.0.1 oneplus6线刷包(官方android10.0.1)下载、线刷教程: OnePlus6-brick-enchilada_22_K_52_210716_repack-HOS-10_0_11-zip 启用开发者模式 设置 / 连续点击6次版本号 : 启用开发者模式设置/开发者模式/{打开 usb调试, 打开 网络adb调试,…