浅聊数据库设计的三大范式
写在最前
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系型数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系型数据库有六种范式,分别为:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。要求最低的范式是第一范式。第二范式在第一范式的基础上又进一步的添加了要求,其余范式依次类推。
一般说来,数据库只需满足第三范式就行了,而通常我们用的最多的就是第一范式
、第二范式
、第三范式
,也就是接下来要讲的“三大范式”。
第一范式
第一范式(1NF)用来确保每列的原子性
,要求每列(或者每个属性值)都是不可再分的最小数据单元
(也称为最小的原子单元)。
下表为“不满足第一范式”设计的表:
员工编号 | 姓名 | 性别 | 学历信息 |
---|---|---|---|
101 | 张德华 | 女 | 本科,南京大学 |
102 | 李星驰 | 男 | 专科,北京大学 |
103 | 马润发 | 男 | 硕士,香港大学 |
在上面的表中,“学历信息”列不满足原子性的要求,即可再分,故不满足第一范式,调整如下:
员工编号 | 姓名 | 性别 | 学历 | 毕业院校 |
---|---|---|---|---|
101 | 张德华 | 女 | 本科 | 南京大学 |
102 | 李星驰 | 男 | 专科 | 北京大学 |
103 | 马润发 | 男 | 硕士 | 香港大学 |
第二范式
第二范式(2NF)在 1NF 的基础上,要求表中的每列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。如果一个表满足第一范式,并且除了主键以外的其他列全部都依赖于该主键,那么该表满足第二范式。
下表为 “不满足第二范式” 设计的表:
员工编号 | 姓名 | 性别 | 技能 | 掌握程度 |
---|---|---|---|---|
101 | 张德华 | 女 | Java | 90% |
101 | 张德华 | 女 | Oracle | 80% |
102 | 李星驰 | 男 | Java | 85% |
103 | 马润发 | 男 | Java | 75% |
103 | 马润发 | 男 | Mysql | 95% |
在上图所示的情况中,同一个员工可能掌握不同技能,因此主键必须是“员工编号”和“技能”联合组成。
这样在该表中
掌握程度
字段不与该表的主键相关,而仅仅是与技能
相关。故不满足第二范式,调整如下:
员工编号 | 姓名 | 性别 |
---|---|---|
101 | 张德华 | 女 |
102 | 李星驰 | 男 |
103 | 马润发 | 男 |
员工编号 | 技能 | 掌握程度 |
---|---|---|
101 | Java | 90% |
101 | Oracle | 80% |
102 | Java | 85% |
103 | Java | 75% |
103 | Mysql | 95% |
第三范式
第三范式(3NF)在 2NF 的基础上,确保每列都和主键列直接相关,而不是间接相关,即限制列的冗余性。如果一个关系满足第二范式,并且除了主键以外的其他列都依赖于主键列,列和列之间不存在相互依赖关系,则满足第三范式。
下表为 “不满足第三范式” 设计的表:
员工编号 | 姓名 | 性别 | 学历 | 毕业院校 | 部门编号 | 部门名称 | 部门人数 |
---|---|---|---|---|---|---|---|
101 | 张德华 | 女 | 本科 | 南京大学 | d_1 | 研发一部 | 10 |
102 | 李星驰 | 男 | 专科 | 北京大学 | d_2 | 研发二部 | 15 |
103 | 马润发 | 男 | 硕士 | 香港大学 | d_2 | 研发二部 | 15 |
上表中,“部门名称”和“部门人数”是间接相关主键“员工编号”,故不满足第三范式,调整如下:
员工编号 | 姓名 | 性别 | 学历 | 毕业院校 | 部门编号 |
---|---|---|---|---|---|
101 | 张德华 | 女 | 本科 | 南京大学 | d_1 |
102 | 李星驰 | 男 | 专科 | 北京大学 | d_2 |
103 | 马润发 | 男 | 硕士 | 香港大学 | d_2 |
部门编号 | 部门名称 | 部门人数 |
---|---|---|
d_1 | 研发一部 | 10 |
d_2 | 研发二部 | 15 |
范式化反范式化
在实际的数据库设计中,既要考虑三大范式,避免数据的冗余和各种数据操作异常,又要考虑数据访问性能。为了减少表连接,提高数据库的访问性能,也可以允许适当的数据冗余列,这也许就是最合适的数据库设计方案。
范式化
满足范式的数据库设计,就是范式化。
- 优点:
- 减少数据冗余;
- 范式化后的表中只有很少的重复数据,更新时只需要更新较少的数据,所以范式化的更新操作比反范式化更快;
- 范式化的表通常比反范式化更小;
- 缺点:
- 范式化的表在查询时经常需要很多的关联,这回导致性能降低;
- 增加了索引优化的难度;
反范式化
不满足范式的数据库设计,就是反范式化。
- 优点:
- 可以减少表的关联;
- 可以更好的进行索引优化;
- 缺点:
- 数据表存在数据冗余及数据维护异常;
- 对数据的修改需要更多的成本;
浅聊数据库设计的三大范式相关推荐
- mysql增删改查不区分大小写吗_MySQL的增删改查语句以及数据库设计的三大范式...
数据库设计的三大范式: 1.列的原子性,即列是不可再分的 2.表里的每一列都应该与主键有关系, 3.表里的每一列都应该与主键有直接关系, 当使用自增长列不满足2.3范式,是特殊例子,只用在解决较为复杂 ...
- 5、数据库设计的三大范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中,这种规则就是范式.范式是符合某一种级别的关系模式的集合.关系型数据库中的关系必须满足一定的要求,即满足不同的范式. ...
- 数据库设计的三大范式:详细
在大学学习数据库的时候,不明白为什么会学习很多关系代数.设计范式的理论.但是,有了这些理论基础,在遇到问题的时候脑袋会有灵光一闪的感觉.那种感觉很像是大雾天太阳照射大地的感觉,心中一片光亮.^_^ 那 ...
- 数据库设计常用三大范式
前言 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 目前关系数据库有六种范式:第一范式(1NF). ...
- 数据库设计的三大范式(举例详解)
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就被称为范式.范式是符合某一种设计要求的总结.因此要设计一个结构合理的关系型数据库,就必须要满足下面这三大 ...
- 数据库设计的三大范式通俗解释
一.三大范式通俗解释: (1)简单归纳: 第一范式(1NF):字段不可分: 第二范式(2NF):有主键,非主键字段依赖主键: 第三范式(3NF):非主键字段不能相互依赖. (2)解释: 1NF:原子性 ...
- 数据库设计的三大范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际 ...
- 数据库设计的三大范式、BCNF、4NF
一.理解数据库的范式需要理解几个基本概念: 码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码.相当于键值的意 ...
- 数据库设计的三大范式[学习笔记]
* 概念:设计数据库时,需要遵循的一些规范.要遵循后边的范式要求,必须先遵循前边的所有范式要求 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种 ...
最新文章
- 论一枚数据科学家的自我修养
- iar升级芯片库_顶10个GPU!阿里巴巴重磅发布含光800芯片
- 项目经理问:为什么总是只有我在加班 – 挂包袱现象
- 说说浏览器的沙箱机制
- 人生百味,浓缩到最后就是一个淡字
- 小程序中神秘的用户数据
- 真格量化——中性策略交易期权
- ARCore-Unity3d教程2 - 基本概念
- “Talk is cheap, show me the code”你一行代码有多贵?
- 自动安装与配置复制batch脚本
- 背包问题(Knapsack Problem) ----- 蛮力法
- 淘宝接口 http://ip.taobao.com/service/getIpInfo.php?ip=myip 获取不到手机ip地址
- scroll lock键 和 sandy bridge
- 学校学生计算机配备标准,规模控制在900人至5000人 每百名学生应有15台电脑
- BZOJ3168. 【HEOI2013】钙铁锌硒维生素
- 世界经济论坛报告:全方位评估Fintech将如何颠覆金融业竞争格局,包括路径、模式和终局(二)...
- SSL在线生成地址惠存
- 持续爆点:一对一直播和短视频
- 找字符串中出现次数最多的字符
- Unity3d Android SDK接入解析(三)接入Android Library的理解(爱贝云支付为例)