【MySQL】-【数据库的设计规范】

news/2024/10/5 3:09:02 标签: 数据库, mysql, 设计规范

文章目录

  • 为什么需要数据库设计
  • 范式
    • 范式简介
    • 范式都包括哪些
    • 键和相关属性的概念
    • 第一范式(1st NF)
    • 第二范式(2nd NF)
    • 第三范式(3rd NF)
  • 反范式化
    • 概述
    • 应用举例
    • 反范式化的新问题
    • 反范式的适用场景
  • BCNF(巴斯范式)
  • 案例

为什么需要数据库设计

在这里插入图片描述
在这里插入图片描述

范式

范式简介

在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

范式都包括哪些

目前关系型数据库有六种常见范式,按照范式级别,从低到高分别是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
在这里插入图片描述
在这里插入图片描述

键和相关属性的概念

请添加图片描述
超键:能唯一标识一行数据的属性集,其实只要是主键+任意字段就可以构成一个超键
候选键:真正的能唯一标识一行数据的字段,比如人的身份证号
主键只能有一个,候选键可以有多个
候选键的属性就称为主属性

举例:这里有两个表:
球员表(player):球员编号 | 姓名 | 身份证号 | 年龄 | 球队编号
球队表(team):球队编号 | 主教练 | 球队所在地
超键:对于球员表来说,超键就是包括球员编号或者身份证号的任意组合,比如(球员编号) (球员编号,姓名)(身份证号,年龄)等。
候选键:就是最小的超键,对于球员表来说,候选键就是(球员编号)或者(身份证号)。
主键:我们自己选定,也就是从候选键中选择一个,比如(球员编号)。
外键:球员表中的球队编号。
主属性、非主属性:在球员表中,主属性是(球员编号)(身份证号),其他的属性(姓名)
(年龄)(球队编号)都是非主属性。

第一范式(1st NF)

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

第二范式(2nd NF)

请添加图片描述
非主键字段完全依赖主键:假如表中字段1、字段2组成了一个唯一主键,其余字段(非主键字段)根据这两个字段的值就能确定唯一值,如果某个非主键字段根据字段1(或字段2)就能确定自己的值,那么这就叫非主键字段依赖主键的一部分,这种情况建议给字段1(或字段2)和该非主键字段建立一张独立的表,然后将该表与原来的表进行关联

请添加图片描述
请添加图片描述
请添加图片描述
在淘宝购物提交订单时,一个订单中可能有多个商品,如果把所有信息都放在同一张表中,并设置订单号、商品编号为唯一主键,那么就违反了第二范式,因为订单创建时间、公司名、顾客姓名等信息可以根据订单号确定,商品数量可以根据商品编号确定,因此我们可以设置成两张表
请添加图片描述

第三范式(3rd NF)

请添加图片描述
列出部门编号后不能再将部门名称、部门简介等与部门相关的信息再加入员工信息表中了,因为部门名称、部门简介等与部门相关的信息都依赖部门编号这个非主键字段,违反了第三范式
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
每个非主键属性依赖于主键,依赖于整个主键(不能部分依赖),并且除了主键别无他物(与其他非主键相互独立)
请添加图片描述

反范式化

概述

请添加图片描述

应用举例

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
反范式优化实验对比:

  1. 创建数据库和表:
    请添加图片描述
  2. 添加数据
    请添加图片描述
    请添加图片描述
  3. 满足第三范式,查询
    请添加图片描述
  4. 查询结果
    请添加图片描述
    请添加图片描述

反范式化的新问题

  1. 存储空间变大了。
  2. 一个表中字段做了修改,另一个表中冗余的字段也需要做同步修改,否则数据不一致
  3. 若采用存储过程来支持数据的更新、删除等额外操作,如果更新频繁,会非常消耗系统资源
  4. 在数据量小的情况下,反范式不能体现性能的优势,可能还会让数据库的设计更加 复杂

反范式的适用场景

当冗余信息有价值或者能大幅度提高查询效率的时候,我们才会采取反范式的优化。
一、增加冗余字段的建议
请添加图片描述
二、历史快照、历史数据的需要
在现实生活中,我们经常需要一些冗余信息,比如订单中的收货人信息,包括姓名、电话和地址等。每 次发生的 订单收货信息 都属于 历史快照 ,需要进行保存,但用户可以随时修改自己的信息,这时保存这 些冗余信息是非常有必要的。
反范式优化也常用在 数据仓库 的设计中,因为数据仓库通常 存储历史数据 ,对增删改的实时性要求不 强,对历史数据的分析需求强。这时适当允许数据的冗余度,更方便进行数据分析。
请添加图片描述
先遵循三范式,再考虑反范式化

BCNF(巴斯范式)

请添加图片描述

案例

请添加图片描述
请添加图片描述
请添加图片描述


http://www.niftyadmin.cn/n/349376.html

相关文章

v-model使用及原理

关于v-model,vue2与vue3用法不一致,本文学习采用了vue3官网文档。与vue2区别写在本文末尾。一、为什么使用v-model? v-model指令可以在表单input、textarea以及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素…

可视化翻转教学python

目录 第1关 绘制折线图 第2关 绘制正弦曲线 第3关 绘制指定线型、颜色和标记的正弦曲线 第4关 定义绘制正余弦函数曲线的函数 第5关 绘制坐标轴并设置范围 第1关 绘制折线图 显示绘制结果 plt.show():用于显示绘制的结果,无参数,执行此…

mysql子查询嵌套

目录 前言 一、实际需求解决 1.方式1:自连接 2.方式2:子查询 二、单行子查询 1.操作符子查询 三、相关子查询 四、自定义语句 五、子查询的问题 1.空值问题 2.非法使用子查询 六、多行子查询 七、聚合函数的嵌套使用 八、多行子查询空值问题…

LeetCode高频算法刷题记录8

文章目录 1. 零钱兑换【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 最小栈【最小栈】2.1 题目描述2.2 解题思路2.3 代码实现 3. 最长有效括号【困难】3.1 题目描述3.2 解题思路3.3 代码实现 4. 从前序与中序遍历序列构造二叉树【中等】4.1 题目描述4.2 解题思路4.3 代码实…

【牛客刷题专栏】0x29:JZ31 栈的压入、弹出序列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…

物联网时代,从智能咖啡机到车联网都可能被黑!

"伴随5G明年即将正式商转,物联网(IoT)时代特有的“万物皆联网”景况也近在咫尺,届时x连网对象数量将呈现猛爆增长。物联网技术的前期采用者,除了加速物联网基础建设与创新技术应用导入之外,也面临更广泛的安全管理风险与更严…

uni-app之使用App.vue全局文件的教学

在 UniApp 中,App.vue 是整个应用的入口文件,它可以作为一个全局文件,在其中定义的数据、方法和生命周期钩子可以在整个应用中使用。这篇文章将向您介绍如何使用 App.vue 文件来实现全局信息的共享和管理。 步骤: 创建 App.vue 文…

《WEB安全漏洞30讲》(第5讲)任意文件上传漏洞

1.任意文件上传漏洞原理 文件上传漏洞,指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。 这个漏洞其实非常简单,就是攻击者给服务器上传了恶意的木马程序,然后利用此木马程序执行操作系统命令,从而获得服务器权…