MySQL篇(数据库范式)(持续更新迭代)

news2024/9/19 9:57:01

目录

一、什么是范式

二、三大范式

第一范式(1NF)

第二范式(2NF)

第三范式(3NF)

三、其他大三范式

巴斯-科德范式(BCNF,Boyce-Codd Normal Form)

第四范式(4NF)

第五范式(5NF)


一、什么是范式

范式(数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。

构造数据库必须遵循一定的规则。

在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。

二、三大范式

第一范式(1NF)

在任何一个关系数据库中,

第一范式(1NF是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,

即实体中的某个属性不能有多个值或者不能有重复的属性。

如果出现重复的属性,就可能需要定义一个新的实体,

新的实体由重复的属性构成,新实体与原实体之间为一对多关系。

在第一范式(1NF)中表的每一行只包含一个实例的信息。

简而言之,第一范式就是无重复的列。

第一范式 (1NF) 示例:

订单表 (Orders):

OrderID

CustomerName

Products

1

John

Product1, Product2

2

Jane

Product3

3

Bob

Product1, Product3

在上面的表中,每个单元格包含原子值,没有多值属性,因此符合第一范式(1NF)。

第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,

即满足第二范式(2NF)必须先满足第一范式(1NF)。

第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。

为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

这个唯一属性列被称为主关键字或主键、主码。

第二范式(2NF)要求实体的属性完全依赖于主关键字。

所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。

如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,

新实体与原实体之间是一对多的关系。

为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

简而言之,第二范式就是非主属性完全依赖于主关键字。

第二范式 (2NF) 示例:

如果我们将产品表(Products)引入,它包含了产品信息,包括产品号(ProductID)、产品名称(ProductName)和产品描述

(ProductDescription)。

订单表 (Orders):

OrderID

CustomerName

1

John

2

Jane

3

Bob

产品表 (Products):

ProductID

ProductName

ProductDescription

1

Product1

Description1

2

Product2

Description2

3

Product3

Description3

产品表(Products)和订单表(Orders)之间存在关系,通过“产品号”(ProductID)来连接

这符合第二范式(2NF),因为非主键属性(如“产品描述”)依赖于整个候选键(“产品号”)。

第三范式(3NF)

满足第三范式(3NF)必须先满足第二范式(2NF)。

简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。

那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息

表中。

如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

简而言之,第三范式就是属性不依赖于其它非主属性。

第三范式 (3NF) 示例:

如果我们在订单表(Orders)中添加一个新的属性,比如“客户地址”(CustomerAddress):

订单表 (Orders):

OrderID

CustomerName

CustomerAddress

1

John

Address1

2

Jane

Address2

3

Bob

Address1

在这种情况下,客户地址(CustomerAddress)依赖于“客户名称”(CustomerName),而不是订单号

(OrderID)。这违反了第三范式(3NF)。

为了符合3NF,我们应该将“客户地址”移动到一个独立的客户表,其中“客户名称”是主键,然后在订单表中使

用客户名称作为外键来建立关联。

三、其它范式

巴斯-科德范式(BCNF,Boyce-Codd Normal Form)

某些特殊情况下,即使关系模式符合3NF的要求,仍然存在着插入异常,修改异常与删除异常的问题。

BCNF由Boyce与Codd提出,通常被认为是修正的第三范式。

巴斯-科德范式即在满足第三范式(3NF)基础上,任何非主属性不能对主键子集依赖

(即在3NF基础上,消除主属性对候选码的部分函数依赖和传递函数依赖)。

BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。

满足BC范式的关系都必然满足第三范式。

或者还可以换一种说法:

若一个关系达到了第三范式,并且它只有一个候选码,

或者它的每个候选码都是单属性,则该关系自然达到BC范式。

一般来说,一个数据库设计符合3NF或BCNF就可以了。

第四范式(4NF)

多值依赖的概念:

多值依赖即属性之间的一对多关系,记为K→→A。函数依赖事实上是单值依赖,所以不能表达属性值之间的一对

多关系。

平凡的多值依赖:

全集U=K+A,一个K可以对应于多个A,即K→→A。此时整个表就是一组一对多关系。

非平凡的多值依赖:全集U=K+A+B,一个K可以对应于多个A,也可以对应于多个B,A与B互相独立,即

K→→A,K→→B。

整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独立的属性集合。

第四范式即在满足巴斯-科德范式(BCNF)的基础上,消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)。

第五范式(5NF)

即在满足第四范式(4NF)的基础上,消除不是由候选码所蕴含的连接依赖。

如果关系模式R中的每一个连接依赖均由R的候选码所隐含,则称此关系模式符合第五范式。

函数依赖是多值依赖的一种特殊的情况,而多值依赖实际上是连接依赖的一种特殊情况。

但连接依赖不像函数依赖和多值依赖可以由语义直接导出,而是在关系连接运算时才反映出来。

存在连接依赖的关系模式仍可能遇到数据冗余及插入、修改、删除异常等问题。

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

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

相关文章

rocky9虚拟机配置双网卡的详细过程

编辑虚拟机配置->添加->选择网络适配器->确认->打开虚拟机 1.ip add查看第二个网卡的名称,我这里是ens36 2.cd到网卡的配置文件目录 cd /etc/NetworkManager/system-connections/ ls3.复制一份网卡的配置文件并改名为ens36.nmconnection(根据自己的第…

工程车辆目标检测、程车检测算法、工程车辆类型检测算法

工程车检测算法主要用于智能交通系统、建筑工地管理、矿山开采、物流运输等领域,通过图像识别技术来检测和识别工程车,以提高安全管理、交通流量管理和资源调度的效率。以下是关于工程车检测算法的技术实现、应用场景及优势的详细介绍。 一、技术实现 工…

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句 接入系统:钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工…

《深入理解 Java 线程池:高效管理线程的利器》

线程池 1. 什么是线程池? ​ 线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或…

【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">参数列表[逗号模式]<el-too…

小微金融企业系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;贷款信息管理&#xff0c;贷款申请管理&#xff0c;贷款种类管理&#xff0c;代办项目管理&#xff0c;项目分类管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;代办项…

基于51单片机的物联网安防系统(Proteus+Python脚本+阿里云)

基于51单片机的物联网安防系统使用Proteus进行仿真&#xff0c;LCD12864进行数据显示&#xff0c;集成了温湿度传感器、烟雾、甲烷传感器&#xff0c;执行器件是风扇&#xff0c;采用L298进行驱动&#xff0c;按键实现用户交互&#xff0c;蜂鸣器报警&#xff0c;红外检测人员状…

如何将示波器输出的电压数据转换为频域数据,五句代码解决问题,详细分析五句代码

这四句代码是关于对电压数据&#xff08;voltage&#xff09;进行快速傅里叶变换&#xff08;FFT&#xff09;&#xff0c;并生成相应的频率向量&#xff0c;提取并计算频谱的幅度&#xff0c;同时只保留正频率部分。 五句代码如下图所示&#xff1a; % 计算采样频率dt mean(…

Python | Leetcode Python题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; class Solution:def numberOfArithmeticSlices(self, nums: List[int]) -> int:n len(nums)if n 1:return 0d, t nums[0] - nums[1], 0ans 0# 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for i in range(2, n):i…

Rust GUI框架 tauri V2 项目创建

文章目录 Tauri 2.0创建应用文档移动应用开发 Android 前置要求移动应用开发 iOS 前置要求参考资料 Tauri 2.0 Tauri 是一个构建适用于所有主流桌面和移动平台的轻快二进制文件的框架。开发者们可以集成任何用于创建用户界面的可以被编译成 HTML、JavaScript 和 CSS 的前端框架…

电源电压输入输出保护电路

输入正负极接反芯片损坏 解决方案&#xff1a;添加防反接电路(蓝色虚线框中电路)。 Q1:VDS≥1.5*VINMAX&#xff1b; DZ1:VDZ110V&#xff0c;500mW&#xff1b; R3:20K&#xff1b; R4:20K。 输入尖峰电压损坏芯片 ➢ 解决方案一&#xff1a;输入添加瞬态尖峰电压吸收电路…

【中国留学网-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

如何兼容性地开发响应式站点——WEB开发系列40

CSS在不同浏览器的支持历史中&#xff0c;有过多次变革。尽管现代浏览器逐步趋向一致&#xff0c;但仍有一些较旧的浏览器广泛使用&#xff0c;特别是在某些地区或特定环境中。 一、浏览器生态&#xff1a;了解你的网站用户 在设计和开发站点之前&#xff0c;了解目标用户所使…

多旅行商问题:鹈鹕优化算法(Pelican Optimization Algorithm,POA)求解多仓库多旅行商问题MD-MTSP(提供Matlab代码)

一、鹈鹕优化算法 鹈鹕优化算法(Pelican Optimization Algorithm,POA)由Pavel Trojovsk和Mohammad Dehghani 于2022年提出&#xff0c;该算法模拟了鹈鹕在狩猎过程中的自然行为。 鹈鹕很大&#xff0c;喙很长&#xff0c;喉咙里有一个大袋子&#xff0c;用来捕捉和吞咽猎物。…

记录一下ElementUI 3 在浏览器导入, table表格显示问题

当时问题忘了截图, 现在通过文字记录一下问题 我直接在html了引入 vue3 和 ElementUI 3 , 使用了table组件, 但是表格的td 总是只显示一列, 问题是我的 el-table-column 标签 没有结束标签 , 在vue文件模块化里写不需要结束标签, 在浏览器里无法直接识别出来, 所以他是渲染了第…

鸿蒙开发之ArkUI 界面篇 十 边框border

border语法格式如下&#xff1a; 要实现如下效果&#xff1a; 代码如下&#xff1a; Entry Component struct IndexTest {State message: string IndexTest;build() {Column(){Text(border实现).fontSize(30) .border({width:4,color:Color.Red,style:BorderStyle.Solid,ra…

进程的重要函数

进程的重要函数: fork函数 了解fork函数 通过调用fork()函数&#xff0c;则会产生一个新的进程。调用fork()函数的进程叫做 父进程&#xff0c;产生的新进程则为子进程。 其编码过程: 1.函数功能: 函数头文件 #include <sys/types.h> #include <unistd.h> 函数…

【FFT】信号处理——快速傅里叶变换【通俗易懂】

快速傅里叶变换&#xff08;Fast Fourier Transform, FFT&#xff09;是一种用于将信号从时间域转换到频率域的算法。 傅里叶变换的核心思想是&#xff1a;任何周期性信号都可以分解成多个不同频率的正弦波或余弦波的叠加。 简单来说&#xff0c;FFT可以帮助我们理解一个信号…

使用 Internet 共享 (ICS) 方式分配ip

设备A使用dhcp的情况下&#xff0c;通过设备B分配ip并共享网络的方法。 启用网络共享&#xff08;ICS&#xff09;并配置 NAT Windows 自带的 Internet Connection Sharing (ICS) 功能可以简化 NAT 设置&#xff0c;允许共享一个网络连接给其他设备。 打开网络设置&#xff1…

力扣之1075.项目员工I

文章目录 1. 1075.项目员工I1.1 题干1.2 准备数据1.3 解法1.4 结果截图 1. 1075.项目员工I 1.1 题干 项目表 Project&#xff1a; -------------------- | Column Name | Type | -------------------- | project_id | int | | employee_id | int | -------------------- 主键…