当前位置:网站首页>【数据库 三大范式】一看就懂
【数据库 三大范式】一看就懂
2022-07-06 09:22:00 【不许秃】
三大范式
第一范式 (1NF)
确保数据库字段的原子性(即不可分性);
*例:判断下表是否符合第一范式?
| 编号 | 姓名 | 电话 |
| 1 | 薛宝钗 | 10076 |
| 2 | 贾宝玉 | 10086 |
| 3 | 林黛玉 | 10096 |
首先我们要根据业务需求来判断字段的原子属性,上表唯一可拆分的是姓名,如果业务认为姓名为一个字段,则该表满足第一范式;但如果业务要求我们姓名要写成两个字段(姓氏和名字),则不满足第一范式,将姓名拆分开后即可满足(如下图)。
| 编号 | 姓氏 | 名字 | 电话 |
| 1 | 薛 | 宝钗 | 10076 |
| 2 | 贾 | 宝玉 | 10086 |
| 3 | 林 | 黛玉 | 10096 |
第二范式 (2NF)
在满足1NF的基础上,还包含两个内容:
(1)表必须要有一个主键
(2)非主键列必须完全依赖主键,不能只依赖主键的一部分(不可部分依赖);
*例:判断下表是否符合第二范式?(设定:此表的业务需求满足第一范式)
| 姓名 | 性别 | 电话 | 部门名称 | 部门楼层 |
| 薛宝钗 | 女 | 10076 | 公关部 | 5层 |
| 贾宝玉 | 男 | 10086 | 宣传部 | 3层 |
| 林黛玉 | 女 | 10096 | 公关部 | 5层 |
首先在第一范式的基础上,我们可以看出该表的主键为复合主键.(姓名+部门名称),满足内容(1)表必须要有一个主键
其次,我们发现非主键列是部分依赖主键 而非完全依赖主键: 非主键列性别、电话依赖于姓名,非主键列部门楼层依赖于部门名称
不满足内容(2)非主键列必须完全依赖主键,不能只依赖主键的一部分
为符合第二范式,我们将表进行拆分并优化
| 工号 | 姓名 | 性别 | 电话 |
| 101 | 薛宝钗 | 女 | 10076 |
| 102 | 贾宝玉 | 男 | 10086 |
| 103 | 林黛玉 | 女 | 10096 |
| 部门编号 | 部门名称 | 部门楼层 |
| 1 | 公关部 | 5层 |
| 2 | 宣传部 | 3层 |
| 1 | 公关部 | 5层 |
| 部门编号 | 工号 | 姓名 | 性别 | 电话 |
| 1 | 101 | 薛宝钗 | 女 | 10076 |
| 2 | 102 | 贾宝玉 | 男 | 10086 |
| 1 | 103 | 林黛玉 | 女 | 10096 |
我们把 部门编号设为部门表的主键(总表的外键)、工号设为总表的主键,是因为它们没有实际上的业务意义,这样我们在修改数据的时候(比如说更改姓名、部门名称),就不用一行一行那么麻烦去改。
第三范式 (3NF)
在满足2NF的基础上,另外非主键列必须直接依赖主键(不能依赖非主键),不能存在传递依赖,
即不能存在A依赖于B,B依赖于C;
(其中A、B为非主键列,C为主键)
*例:判断下表是否符合第三范式?(此表的业务已需求满足第二范式)
| 部门编号 | 工号 | 姓名 | 性别 | 电话 | 职位 | 工资 |
| 1 | 101 | 薛宝钗 | 女 | 10076 | 正式 | 8000 |
| 2 | 102 | 贾宝玉 | 男 | 10086 | 实习 | 4000 |
| 1 | 103 | 林黛玉 | 女 | 10096 | 正式 | 8000 |
为符合第三范式,我们将表进行拆分并优化
首先在第一范式的基础上,我们可以看出该表的非主键列工资依赖于非主键列职位,存在传递依赖,即不符合第三范式的要求
| 工号 | 姓名 | 性别 | 电话 |
| 101 | 薛宝钗 | 女 | 10076 |
| 102 | 贾宝玉 | 男 | 10086 |
| 103 | 林黛玉 | 女 | 10096 |
| 部门编号 | 部门名称 | 部门楼层 |
| 1 | 公关部 | 5层 |
| 2 | 宣传部 | 3层 |
| 1 | 公关部 | 5层 |
| 职位编号 | 职位 | 工资 |
| 01 | 正式 | 8000 |
| 02 | 实习 | 4000 |
| 01 | 正式 | 8000 |
| 部门编号 | 工号 | 姓名 | 性别 | 电话 | 职位编号 |
| 1 | 101 | 薛宝钗 | 女 | 10076 | 01 |
| 2 | 102 | 贾宝玉 | 男 | 10086 | 02 |
| 1 | 103 | 林黛玉 | 女 | 10096 | 01 |
解释可以参考第二范式的结尾内容
ps:一定要从业务需求(也就是场景)出发去判断是否符合第几范式
为什么要学范式?
当我们和客户沟通业务需求 或者是 去完成一个项目的时候,需要我们去设计合适的数据模型。此时,规范化设计的重要性就凸显出来了。
范式是什么?
范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则(在关系数据库中,这种规则指的就是范式))。关系数据库中的关系必须满足一定的要求,即满足不同的范式。
学习范式能够解决什么问题?
学会规范化设计能解决以下问题:
1.数据冗余
2.异常问题:
更新异常
插入异常
删除异常
边栏推荐
- [中国近代史] 第九章测验
- Reinforcement learning series (I): basic principles and concepts
- The latest tank battle 2022 - full development notes-3
- 简述xhr -xhr的基本使用
- Leetcode. 3. Longest substring without repeated characters - more than 100% solution
- 5月27日杂谈
- 更改VS主题及设置背景图片
- C language Getting Started Guide
- MySQL锁总结(全面简洁 + 图文详解)
- 8. C language - bit operator and displacement operator
猜你喜欢

Custom RPC project - frequently asked questions and explanations (Registration Center)

4. Branch statements and loop statements

Safe driving skills on ice and snow roads

6.函数的递归

Difference and understanding between detected and non detected anomalies

优先队列PriorityQueue (大根堆/小根堆/TopK问题)

Principles, advantages and disadvantages of two persistence mechanisms RDB and AOF of redis

Nuxtjs快速上手(Nuxt2)

C language Getting Started Guide

FAQs and answers to the imitation Niuke technology blog project (II)
随机推荐
Detailed explanation of redis' distributed lock principle
Custom RPC project - frequently asked questions and explanations (Registration Center)
Mortal immortal cultivation pointer-1
C language Getting Started Guide
2.C语言初阶练习题(2)
Service ability of Hongmeng harmonyos learning notes to realize cross end communication
String abc = new String(“abc“),到底创建了几个对象
hashCode()与equals()之间的关系
2. Preliminary exercises of C language (2)
Thoroughly understand LRU algorithm - explain 146 questions in detail and eliminate LRU cache in redis
Using qcommonstyle to draw custom form parts
9. Pointer (upper)
Using spacedesk to realize any device in the LAN as a computer expansion screen
Redis实现分布式锁原理详解
Beautified table style
7-9 制作门牌号3.0(PTA程序设计)
Floating point comparison, CMP, tabulation ideas
Wechat applet
3. Number guessing game
(original) make an electronic clock with LCD1602 display to display the current time on the LCD. The display format is "hour: minute: Second: second". There are four function keys K1 ~ K4, and the fun