博客
关于我
mysql:三范式
阅读量:262 次
发布时间:2019-03-01

本文共 1027 字,大约阅读时间需要 3 分钟。

第一范式(1NF)

一个字段只存储一项信息

第二范式(2NF)

任意一个字段都只依赖表中的同一个字段。(涉及到表的拆分)

例如:学生选课表

学号 课程 成绩 课程学分
10001 数学 100 6
10001 语文 90 2
10001 英语 85 3
10002 数学 90 6
10003 数学 99 6
10004 语文 89 2

表中成绩、课程学分依赖学号和课程,课程学分还依赖课程,这就不满足第二范式,需要拆表:

学号 课程 成绩
10001 数学 100
10001 语文 90
10001 英语 85
10002 数学 90
10003 数学 99
10004 语文 89
课程 课程学分
数学 6
语文 3
英语 2

第三范式(3NF)

表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)

如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。 通俗解释就是一张表最多只存两层同类型信息。

商品名称 价格 重量 有效期 分类 分类描述
可乐 6.00 500g 2020.6 酒水饮料 碳酸饮料
香蕉 8.00 600g 2020.7 生鲜食品 水果

首先这个是不满足第二范式,先拆成满足第二范式:

商品id 商品名称 价格 重量 有效期
1 可乐 6.00 500g 2020.6
2 香蕉 8.00 600g 2020.7
分类id 分类 分类描述
1 酒水饮料 碳酸饮料
2 生鲜食品 水果
分类id 商品id
1 1
2 2

这样的话就是满足了第二范式的前提下,也满足了第三范式,因为 表中的每一列都要与该表主键直接相关,而不是间接相关

第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表,第三范式是要求已经分好了多张表的话,一张表中只能有另一张标的ID,而不能有其他任何信息,(其他任何信息,一律用主键在另一张表中查询)。

扩展:反三范式

没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,提高读性能,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,减少了查询时的关联,提高查询效率,因为在数据库的操作中查询的比例要远远大于DML的比例。但是反范式化一定要适度,并且在原本已满足三范式的基础上再做调整的。

转载地址:http://wlpo.baihongyu.com/

你可能感兴趣的文章
内部类
查看>>
Maven将本地jar打到本地仓库中
查看>>
SpringBoot集成Eureka
查看>>
Java 十大排序算法
查看>>
SQL触发器
查看>>
springboot运行时该注意的地方
查看>>
建立第一个SpringBoot小列子(碰到的错误)
查看>>
处理in查询的时候id超过1000,而报错
查看>>
Eclipse+Java+Swing实现学生成绩管理系统
查看>>
Python编辑器安装教程
查看>>
BZOJ3685: 普通van Emde Boas树
查看>>
懵逼ZJOI2016Round2滚粗记
查看>>
弹球距离(c语言递归)
查看>>
海盗分赃(8行代码搞定!)
查看>>
整型关键字的散列映射
查看>>
多位水仙花数-python(出现运行超时?不妨用减法计算)
查看>>
地下迷宫探索(后两个测试点无法通过?这里有你想要的答案)
查看>>
城市间紧急救援(dijkstra算法)
查看>>
关键活动(注释超详细!!!)
查看>>
为什么Android要采用Binder作为IPC机制?成功入职阿里
查看>>