数据库三范式(浅显易懂)
1.第一范式(1NF):列不可再分
1.每一列属性都是不可再分的属性值,确保每一列的原子性
2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
例:
有一个学生表,假设有两个字段分别是 name,address,而address内容写的是:江苏省南京市浦口区xxx街道xxx小区。如果这时来一个需求,需要按省市区分类,显然不符需求,这样的表结构也不是符合第一范式的。
应该设计成 name,province(省),city(市),area(区),address
2.第二范式(2NF)属性完全依赖于主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键
每一行的数据只能与其中一列相关,即一行数据只做一件事,只要数据列中出现重复的数据,那么就要把表拆分开来。
例:
有一个订单表如下:
orderId(订单编号),roomId(房间号), name(联系人), phone(联系电话),idn(身份证)
如果这时候一个人同时订了好几个房间,就会变成一个订单编号对应多条数据,这样子联系人都是重复的,就会造成数据冗余,这时我们应该把拆分开来。
如:
订单表:
orderId(订单编号),roomId(房间号), peoId(联系人编号)
联系人表:
peoId(联系人编号),name(联系人), phone(联系电话),idn(身份证)
3.第三范式(3NF)属性不依赖于其它非主属性 属性直接依赖于主键
第二范式(3NF)是在第一范式(2NF)的基础上建立起来的,即满足第三范式(3NF)必须先满足第二范式(2NF)。
简单点意思就是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
例:
假设有一个员工(employee)表,它有九个属性:id
(员工编号)、name
(员工名称)、mobile
(电话)、zip
(邮编)、province
(省份)、city
(城市)、district
(区县)、deptNo
(所属部门编号)、deptName
(所属部门名称)
员工表的province、city、district依赖于zip,而zip依赖于id,换句话说,province、city、district传递依赖于id,违反了 3NF 规则。为了满足第三范式的条件,可以将这个表拆分成employee和zip两个表,如下
employee
id | name | zip |
---|---|---|
101 | 张三 | 100001 |
102 | 李四 | 200001 |
103 | 王五 | 510001 |
地区表area
zip | province | city | district |
---|---|---|---|
100001 | 北京 | 北京 | 海淀区 |
200001 | 上海 | 上海 | 静安区 |
51000 | 广东省 | 广州 | 白云区 |
为什么需要范式
数据库范式为数据库的设计、开发提供了一个可参考的典范,在许多教学材料中也是作为关键的课程内容。
那么范式的提出是为了解决什么问题?
- 第一范式,要求将列尽可能最小的分割,希望消除某个列存储多个值的冗余的行为
比如用户表中的地址信息,拆分为省、市这种明确的字段,可以按独立的字段检索、查询 - 第二范式,要求唯一的主键,且不存在对主键的部分依赖,希望消除表中存在冗余(多余)的列
比如订单表中的商品分类、详情信息,只需要由商品信息表存储一份即可。 - 第三范式,要求没有间接依赖于主键的列,即仍然是希望消除表中冗余的列
比如用户表中不需要存储额外的 其所在城市的人口、城市特点等信息。
很明显,这些范式大都是为了消除冗余而提出的,即尽可能的减少存储成本。
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
数据库三范式(浅显易懂)相关推荐
- python学习笔记 day44 数据库三范式
参考自 https://www.cnblogs.com/wangfengming/articles/7929118.html 1. 数据库三范式概念: 为了建立减少冗余,结构合理的数据库,涉及数据库时 ...
- 为什么我不喜欢数据库三范式
插曲 最近,一个远房亲戚的小表弟准备选修专业 找到我问: "哥,现在学数据库有没有前途阿?""当然有啊,前途大大的呢""那我现在开始学数据库,需要先从 ...
- MySQL笔记(七)数据库三范式
这是我在学习Mysql之路上做的笔记,今天将它粘出来.这一篇主要是数据库三范式.有错误的欢迎大家指出... 数据库三范式 (1)第一范式(1NF): 定义:每一列都是不可分割的原子数据项(强调的是列的 ...
- 数据库三范式 无重复列 完全依赖主键 属性不依赖非主属性
参考:http://www.cnblogs.com/xrq730/p/5100442.html 细说数据库三范式 2.1 第一范式(1NF)无重复的列,保证每列的原子性,即每一列的各个属性值之间不能有 ...
- 三句话归纳数据库三范式
数据库三范式,网友已经总结n多了,这里不再赘述. 其实,归纳起来,就三句话: 一:行不可再分 二:列不可再分 三:列不可重复
- 从数据库三范式角度分析一对多、多对多和一对一关系
文章目录 前言 一.三范式的目的 二.三范式及其对应关系 1.第一范式 2.第二范式 3.第三范式 4.一对一关系 总结 前言 几乎绝大多数项目的最终目的都是通过操作数据库来实现的,所以,操作数据库的 ...
- 数据库三范式通俗理解 -数据库三范式官方定义
数据库三范式 官方定义 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分. 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖 第三范式(3NF):在第二范式的 ...
- MySql——数据库三范式
用于自己学习时的简单解释 数据库三范式:是数据库的设计原则,主要目的是为了避免数据冗余. 数据库的设计应当遵循三范式 第一范式:任何一张表都应该有主键,每一个字段必须具有原子性不可再分 第二范式:在第 ...
- 如何在数据库三范式的基础上进行数据库冗余设计
数据库设计过程中不仅要考虑遵循第三范式,还要考虑是否冗余 很多数据库设计书籍都强调数据库设计三范式,而三范式的一个重要工作就是消除冗余,可以消除冗余在大多数情况下是正确的.当在实际的业务模型中,处理复 ...
- mysql三范式和反三范式_数据库三范式和反三范式
要说数据库什么最抽象,我觉得就是这个三范式,不是很好理解,但是表在设计的时候又必须要知道这么一个规则. 首先使用最简洁的话说说这三范式: 第一范式(1NF:The First Normal Form) ...
最新文章
- Cygwin简介及其下载安装卸载
- windows10 安装mqtt服务器和client客户端进行本地调试
- 排队枪毙游戏c语言,基于C语言实现的约瑟夫生者死者游戏
- xml--Schema约束
- Do you want to put on or loose weight?
- java中生成pdf文件,java 中生成pdf 文件
- ROS笔记(24) Amcl
- 谷歌紧急修复已遭在野利用的Chrome 0day
- linux快速查找文件中所包含的指定字段的个数
- HashMap(HashSet)的实现
- 三维计算机视觉(六)--3DSC(3D形状上下文特征)
- 数字信号处理-04- FPGA常用运算模块-除法器
- VMware 11.0 简体中文版|附永久密钥
- 联想ts250进bios_联想Think TS250/TS550安装server 2008 R2/2012系统教程【一】
- 2022版首发,阿里Java开发手册(黄山版).PDF
- RT-Thread在正点原子Apollo上使用MAX30102读取心率、血氧参数
- 远程控制计算机显示为什么不能满屏,win7远程桌面不能全屏显示怎么办-处理win7远程桌面不能全屏显示的方法 - 河东软件园...
- System.out.println()标准输出方法性能影响一窥
- java使用jacob给word添加水印
- 查找父类的所有子类 crtl+alt+b