MySQL之数据库三大范式

一、什么是范式?

范式是数据库遵循设计时遵循的一种规范,不同的规范要求遵循不同的范式。

(范式是具有最小冗余的表结构)
范式可以 提高数据的一致性减少数据冗余更新异常的问题

数据库有六种范式(1NF /2NF /3NF /BCNF /4NF /5NF

标题为什么是三大范式呢??

首先我们最常用的就是第一范式第二范式第三范式

并且数据库设计时只需遵循这三个范式即可。

二、 三大范式

第一范式**(1NF)**

-列都是不可再分
第一范式的目标是确保每列的原子性:如果每列都是不可再分 的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)

第二范式(2NF)

-每个表只描述一件事情
首先满足第一范式,并且表中非主键列不存在对主键的部分依赖
第二范式要求每个表只描述一件事情

第三范式(3NF)

- 不存在对非主键列的传递依赖
第三范式定义是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。
也就是
(要求每一列数据都和主键直接相关而不能间接相关)

优点:
  1. 减少数据冗余:避免相同数据在多个地方重复存储,减少存储空间需求。
  2. 确保数据一致性:通过消除传递依赖,减少因数据更新不一致导致的错误。
  3. 简化数据管理:使数据库结构更清晰,便于维护和扩展。

primary key(id)

id name sex_code sex_desc phone address
001 张三 0 17835201234 山西省运城市xx村
002 李四 0 17735204567 山西省吕梁市yy村
003 王五 1 18835207890 山西省太原市zz村

表中sex_desc依赖于sex_code,而sex_code依赖于id(主键),从而推出sex_desc依赖于id(主键);sex_desc不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF。

修改表使满足3NF后:

学生表(student)   primary key(id)

id name sex_code phone address
001 张三 0 17835201234 山西省运城市xx村
002 李四 0 17735204567 山西省吕梁市yy村
003 王五 1 18835207890 山西省太原市zz村

性别代码表(sexcode)   primary key(sex_code)

sex_code sex_desc
0
1

将原来的student表进行拆分后,两个表都满足3NF

三、三大范式的缺点

  1. **数据冗余消除过度:**三大范式的设计原则是尽量消除数据冗余,使每个数据项只在数据库中存储一次。然而,过度消除冗余可能导致数据库的关系复杂化,增加了查询和维护的复杂性。有时候,在某些情况下,一些冗余数据可能会提高查询性能或简化数据处理逻辑,但三大范式的设计原则不允许这种冗余存在。

  2. **查询性能受影响:**三大范式的设计原则使得数据库中的数据被分解为多个关系表,这样在进行复杂查询时需要进行多个表的连接操作。这样的查询操作可能会增加数据库的负载,导致查询性能下降。尤其是在大型数据库中,复杂的查询可能需要花费大量的时间来执行。

  3. **数据更新复杂:**三大范式的设计原则使得数据库中的数据被分解为多个关系表,这样在进行数据的插入、更新和删除操作时需要同时更新多个表。这样的操作可能会增加数据更新的复杂性,容易出现数据不一致的问题。同时,由于多表更新的复杂性,可能需要使用事务来保证数据的一致性,进一步增加了数据库的负载和复杂性。

  4. **数据完整性限制:**三大范式的设计原则强调数据的一致性和完整性,要求每个关系表中的数据项必须符合某种规范或约束条件。这些约束条件可能会限制某些特殊情况下的数据录入,使得数据库的灵活性受到了一定的限制。有时候,为了满足特定的需求,可能需要违反某些范式的设计原则。

  5. **难以理解和维护:**三大范式的设计原则使得数据库中的数据被分解为多个关系表,这样数据库的结构变得更加复杂。这对于数据库管理员和开发人员来说可能会增加理解和维护的难度。尤其是在数据库规模较大、关系较复杂的情况下,可能需要更多的时间和精力来理解和维护数据库的结构。

相关推荐
老衲提灯找美女几秒前
数据库约束
数据库
卷Java6 分钟前
Python字典:键值对、get()方法、defaultdict,附通讯录实战
开发语言·数据库·python
wanhengidc8 分钟前
跨境云手机适用于哪些场景
大数据·运维·服务器·数据库·科技·智能手机
Bdygsl39 分钟前
MySQL(6)—— 视图
数据库·mysql
oradh41 分钟前
数据库入门概述
数据库·oracle·数据库基础·数据库入门
BullSmall1 小时前
一套定制化高级 payload 合集
数据库·安全性测试
zbdx不知名菜鸡1 小时前
postgre sql 数据库查询优化
数据库·postgresql
9稳1 小时前
基于PLC的生产线自动升降机设计
开发语言·网络·数据库·嵌入式硬件·plc
四七伵2 小时前
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
数据库·后端
Mr.45672 小时前
JDK17+Druid+SpringBoot3+ShardingSphere5 多表分库分表完整实践(MySQL+PostgreSQL)
java·数据库·spring boot·mysql·postgresql