【MySQL】表设计与范式设计

文章目录

  • 一、数据库表设计
    • 一对一
    • 一对多
    • 多对多
  • 二、范式设计
    • 第一范式
    • 第二范式
    • 第三范式
    • BC范式
    • 第四范式


一、数据库表设计

一对一

举个例子,比如这里有两张表,用户User表 和 身份信息Info表。

在这里插入图片描述

因为一个用户只能有一个身份信息,所以User表和Info表之间是一对一的关系。为了使这两张表关联起来,我们可以将User表作为父表,将Info表作为子表,在子表Info中增加一列关联父表的主键,称之为外键


一对多

举个例子, 比如我们要设计一个电商系统,这里我们需要三张表:用户User、商品Product和订单Order。下面我们分析一下三张表之间的关系。

  • 用户-商品:没有关系
  • 用户-订单:一对多
  • 商品-订单:多对多

一对多

在这里插入图片描述

一对多的关系和一对一关系的处理方式类似, 都是在子表中增加一列关联主表的主键,他称之为外键。这里我们需要注意的是,子表的外键和父表的主键类型必须是相同的,尽量字段名也一样,方便找二者之间的关系。


多对多

基于上面的电商系统,我们再来通过例举 商品与订单之间的关系–多对多
如果我们像上面处理用户和订单之间的关系的方式类似,如果用户买了许多件商品,那么在订单表中就会存在大量的重复冗余的订单。

在这里插入图片描述

这会导致,当我们去修改一个订单时,比如增加一个商品或者减少一个商品时,我们就需要在订单表中进行大批量修改。关键所有订单修改的内容还是一样的。

因此我们在处理商品和订单之间的关系时,可以选者增加一个中间表来解决数据冗余存储的问题。

首先我们需要对订单表Order稍做修改,使得表中只保留不存在冗余的信息:

在这里插入图片描述

然后增加一个订单内容表OrderList,这样我们就可以通过在订单表Order中的订单号找到订单和商品之间的关系了。

在这里插入图片描述


二、范式设计

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的 范式,各种范式呈递次规范,越高的范式数据库冗余越小。

应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:

  • 减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
  • 消除异常(插入异常、更新异常、删除异常)
  • 让数据组织的更加和谐

第一范式

每一列保持原子特性

列都是基本数据项,不能够再进行分割,否则设计成一对多的实体关系。 例如表中的地址字段,可以再细分为省,市,区等不可再分割(即原子特性)的字段,如下:

在这里插入图片描述

上图的表就是把地址字段分成更详细的city,country,street三个字段,注意,不符合第一范式不能称作关系型数据库。


第二范式

属性完全依赖于主键-主要针对联合主键

非主属性完全依赖于主关键字,如果不是完全依赖主键,应该拆分成新的实体,设计成一对多的实体关系。

例如:选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),(学号,课程名称)是联合主键,但是学分字段只和课程名称有关,和学号无关,相当于只依赖联合主键的其中一个字段,不符合第二范式。它们的依赖关系如下:

在这里插入图片描述

  • 数据冗余: 如果一个学生选择了m门课程,那么学生的学号、姓名和年龄就重复了m-次,一门课程也可能会被n个学生选择,那么课程的课程名称和学分就重复了n-1次。
  • 插入异常: 如果我们需要增加一门新的课程, 但这时还没确定选择这门课程的学生都有谁,那么就无法插入。
  • 删除异常: 如果我们需要删除某个学生的学号,如果还没单独保存课程表的话,就会把该学生的选课信息也删除掉。
  • 更新异常: 如果我们调整了某门课程的学分,那么该表中所有选择该课程同学的学分都需进行调整,否则就会出现不同的学生选择同一门课程但学分却不同的情况。

改进后:

在这里插入图片描述


第三范式

属性不依赖于其他非主属性

第三范式是在第二范式的基础上,确保数据表中的每一个非主键字段都和主键字段直接相关,也就是说,要求数据表中的所有非主键字段不能依赖于其他非主键字段。该规则的意思是 所有非主键属性之间不能有依赖关系,必须相互独立。

示例:学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),学号是主键,但是学院电话只依赖于所在学院,并不依赖于主键学号,因此该设计不符合第三范式,应该把学院专门设计成一张表,学生表和学院表,两个是一对多的关系。

在这里插入图片描述

学生表通过学院名称字段与学院表进行关联。


BC范式

每个表中只有一个候选键

简单的说,BC范式是在第三范式的基础上的一种特殊情况,即每个表中只有一个候选键(在一个数据库中每行的值都不相同,则可称为候选键)。

举个例子:

仓库(仓库编号,货物编号,仓库管理员编号)

其中每一个仓库管理员只管理一个仓库。那么我们可以发现这里其实主码可以有两种,分别是:

  • (仓库编号) 可唯一确定 (仓库管理员编号,货物编号)
  • (仓库管理员编号) 可唯一确定 (仓库编号,货物编号)

必须要承认上述关系是符合第三范式的吧,但是有没有觉得这样仓库管理员编号会出现大量的没必要的冗余啊,因此BC范式就是解决这个问题的,需要将其改为两个表,顺便可以将货物的数量加进来。

至于为什么上面关系中我不将货物数量加进来,是因为一旦加进来后那个关系就不符合第二范式了,想想看,如果加入货物数量,那么主键就变成了(仓库编号,货物编号),可是仓库管理员只与仓库编号有关,不依赖于货物编号了呀,就不构成对主键的完全依赖关系了。

下面放上BC范式的修改版:

仓库与管理员表(仓库编号,仓库管理员编号)
仓库货物表(仓库编号,货物编号,货物数量)

第四范式

消除表中的多值依赖

简单来说,第四范式就是要消除表中的多值依赖,也就是说可以减少维护数据一致性的工作。比如图4中的noNF表中的skill技能这个字段,有的人是“java,mysql”,有的人描述的是“Java,MySQL”,这样数据就不一致了,解决办法就是将多值属性放入一个新表。

在这里插入图片描述


从上面对于数据库范式进行分解的过程中不难看出,应用的范式越高,表越多。表多会带来很多问题:

  1. 查询时需要连接多个表,增加了SQL查询的复杂度
  2. 查询时需要连接多个表,降低了数据库查询性能

因此,并不是应用的范式越高越好,视实际情况而定。第三范式 已经很大程度上减少了数据冗余,并且基本预防了数据插入异常,更新异常,和删除异常了。


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

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

相关文章

jmeter+ant+Jenkins集成

一、 环境准备 1、Jenkins下载:https://jenkins.io/zh/download/ 2、 Jenkins安装:解压下载的压缩包,直接点击msi文件安装即可 4、 Jenkins登录用户设置:装: 浏览器地址栏中输入:http://localhost:8080/…

益生菌抗癌?补充这种益生菌,抑制肝癌,还改善肠道健康

撰文 | 宋文法 肠道菌群,是人体不可分割的组成部分,生活在我们肠道内的数万亿细菌对健康起着重要作用,它们影响着人的新陈代谢、消化能力、抵御感染、控制人体对药物的反应,甚至还能预防某些癌症。 非酒精性脂肪肝病,是…

优秀服务器运维工具需要具备的特性

随着互联网的快速发展和企业对网络基础设施的不断依赖,高效的服务器运维工具成为了现代企业不可或缺的一部分。优秀的服务器运维工具应该具备以下几个重要的特性: 1、稳定轻量 服务器是企业的核心基础设施,因此运维工具应该保证稳定可靠的性…

【实用技巧】Windows 电脑向iPhone或iPad传输视频方法1:无线传输

一、内容简介 本文介绍如何使用 Windows 电脑向 iPhone 或 iPad 传输视频,以 iPhone 为例,iPad的操作方法类似,本文不作赘述。 二、所需原材料 Windows 电脑(桌面或其它文件夹中存有要导入的视频)、iPhone 14。 待…

Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域并放大,Kotlin(3)

Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域并放大,Kotlin(3) 在文章2 Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域,Kotlin(2)-CSDN博客 的基础上&…

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中,我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

二叉树及其实现

二叉树 一.树的概念及结构1.1树的概念1.2相关概念 2.二叉树的概念及结构2.1 概念2.2 特殊的二叉树 3.二叉树的遍历3.1 前序、中序以及后序遍历3.2 层序遍历3.3 判断二叉树是否是完全二叉树3.4 二叉树的高度3.5 二叉树的叶子节点个数3.6 二叉树的第k层的节点个数3.7 二叉树销毁3…

苹果可充电键盘背光系统专利曝光:延长MacBook Air / Pro续航

根据美国商标和专利局(USPTO)近日公示的清单,苹果公司近日获得了一项关于电子设备键盘的相关专利。 苹果公司在专利中表示,为了在低光环境下,能够提高用户敲击键盘的输入体验,通常键盘会提供背光。 传统键…

深度学习笔记(二)——Tensorflow环境的安装

本篇文章只做基本的流程概述,不阐述具体每个软件的详细安装流程,具体的流程网上教程已经非常丰富。主要是给出完整的安装流程,以供参考 环境很重要 一个好的算法环境往往能够帮助开发者事半功倍,入门学习的时候往往搭建好环境就已…

关于Vue前端接口对接的思考

关于Vue前端接口对接的思考 目录概述需求: 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式, 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…

vue上传多个文件 获取进度条实时刷新进度

<template><div><Buttontype"primary"style"margin-right: 14px;"click"uploadFile">上传</Button><inputtype"file"id"importFile"change"checkedFile"style"display: none&quo…

基于uniapp封装的table组件

数据格式 tableData: [{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},/* {title: "2",elcInfo: [{…

知识图谱gds使用记录

安装 从下载站下载对应的包到plugin目录下&#xff0c;修改配置文件/etc/neo4j/neo4j.conf&#xff0c;末尾加入gds.*&#xff0c;重新启动 在浏览器输入CALL gds.list()命令进行测试 建立图映射 为了使用图算法&#xff0c;需要先将图数据库的内容映射为一个新图 如果是全…

【Python_PySide6学习笔记(二十六)】基于PySide6手写自定义标题栏类tQTitleBar,实现窗体的无边框美化

基于PySide6手写自定义标题栏类tQTitleBar,实现窗体的无边框美化 基于PySide6手写自定义标题栏类tQTitleBar,实现窗体的无边框美化前言一、实现思路1、继承自 QWidget 类,创建控件并添加2、编写窗体最大化、最小化、关闭、最大化后恢复的方法3、重写鼠标点击、移动、释放、双…

freesurfer-reconall后批量提取TIV(颅内总体积)

#提取TIV #singleline=$(grep Estimated Total Intracranial Volume /usr/local/freesurfer/subjects/bect-3d+bold-wangjingchen-4.9y-2/stats/aseg.sta

zmq_connect和zmq_poll

文章内容&#xff1a; 介绍函数zmq_connect和zmq_poll的使用 zmq_connect zmq_connect函数是ZeroMQ库中的一个函数&#xff0c;用于在C语言中创建一个与指定地址的ZeroMQ套接字的连接。该函数的原型如下&#xff1a; int zmq_connect(void *socket, const char *endpoint);其…

学习笔记——C++运算符之算术运算符

C中运算符包含诸多种类&#xff0c;其中有&#xff1a;算术运算符&#xff0c;赋值运算符&#xff0c;比较运算符和逻辑运算符 每一种运算符及其作用如下表所示&#xff1a; 一&#xff0c;算术运算符1&#xff0c;加减乘除 其中&#xff0c;“”&#xff0c;“-”运算符既可…

学习紫微斗数之感悟

研究算命已有一年有余&#xff0c;这一年来帮人算的过程中总会有人问&#xff0c;命运是否注定的&#xff1b;自己在闲暇时光&#xff0c;有时候忍不住也会想&#xff0c;人的命&#xff0c;是否是从出生那一刻就定了&#xff0c;出生以后遇到的人&#xff0c;遇到的事&#xf…

go 的内存布局和分配原理

go 之所以在高并发环境下表现优异&#xff0c;除了咱们都知道的 GMP 模型&#xff0c;其实 go 的内存布局和分配机制也起到了不少作用。 1. 分配内存三大组件 go 分配内存的过程&#xff0c;主要由三大组件所管理&#xff0c;级别从上到下分别是&#xff1a; mheap go 在程…

基于ssm智慧社区停车管理系统设计与实现【附源码】

基于ssm智慧社区停车管理系统设计与实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&am…