数据库的设计规范(1)

简介: 数据库的设计规范(1)

范 式

范式简介

在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

范式都包括哪些

目前关系型数据库有六种常见范式,按照范式级别,从低到高分别是:第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美 范式。


92a11b31c45b4828a699efba015be1ab.png

键和相关属性的概念


举例:


这里有两个表:


球员表(player) :球员编号 | 姓名 | 身份证号 | 年龄 | 球队编号


球队表(team) :球队编号 | 主教练 | 球队所在地


超键 :对于球员表来说,超键就是包括球员编号或者身份证号的任意组合,比如(球员编号) (球员编号,姓名)(身份证号,年龄)等。


候选键 :就是最小的超键,对于球员表来说,候选键就是(球员编号)或者(身份证号)。


主键 :我们自己选定,也就是从候选键中选择一个,比如(球员编号)。


外键 :球员表中的球队编号。


主属性 、 非主属性 :在球员表中,主属性是(球员编号)(身份证号),其他的属性(姓名) (年龄)(球队编号)都是非主属性。


第一范式(1st NF)

举例1:

假设一家公司要存储员工的姓名和联系方式。它创建一个如下表:


ebd9ad169c3e43b3b27babd132712235.png

该表不符合 1NF ,因为规则说“表的每个属性必须具有原子(单个)值”,lisi和zhaoliu员工的

emp_mobile 值违反了该规则。为了使表符合 1NF ,我们应该有如下表数据:

e41948486319441f879b18db4e0c3ce9.png


举例2:

user 表的设计不符合第一范式


image.png


其中,user_info字段为用户信息,可以进一步拆分成更小粒度的字段,不符合数据库设计对第一范式的 要求。将user_info拆分后如下:


3ed33283f0c7451bacab25adbdb6b7f6.png


举例3:

属性的原子性是 主观的 。例如,Employees关系中雇员姓名应当使用1个(fullname)、2个(firstname和lastname)还是3个(firstname、middlename和lastname)属性表示呢?答案取决于应用程序。如果应 用程序需要分别处理雇员的姓名部分(如:用于搜索目的),则有必要把它们分开。否则,不需要。


7297afee1374442280042a85f17fcc95.png

第二范式(2nd NF)

举例1:

成绩表 (学号,课程号,成绩)关系中,(学号,课程号)可以决定成绩,但是学号不能决定成绩,课 程号也不能决定成绩,所以“(学号,课程号)→成绩”就是 完全依赖关系 。


举例2:

比赛表 player_game ,里面包含球员编号、姓名、年龄、比赛编号、比赛时间和比赛场地等属性,这 里候选键和主键都为(球员编号,比赛编号),我们可以通过候选键(或主键)来决定如下的关系:


(球员编号, 比赛编号) → (姓名, 年龄, 比赛时间, 比赛场地,得分)

但是这个数据表不满足第二范式,因为数据表中的字段之间还存在着如下的对应关系:  

 

1. (球员编号) → (姓名,年龄)
2. 
3. (比赛编号) → (比赛时间, 比赛场地)


对于非主属性来说,并非完全依赖候选键。这样会产生怎样的问题呢?  


1. 数据冗余 :如果一个球员可以参加 m 场比赛,那么球员的姓名和年龄就重复了 m-1 次。一个比赛 也可能会有 n 个球员参加,比赛的时间和地点就重复了 n-1 次。


2. 插入异常 :如果我们想要添加一场新的比赛,但是这时还没有确定参加的球员都有谁,那么就没 法插入。


3. 删除异常 :如果我要删除某个球员编号,如果没有单独保存比赛表的话,就会同时把比赛信息删 除掉。


4. 更新异常 :如果我们调整了某个比赛的时间,那么数据表中所有这个比赛的时间都需要进行调 整,否则就会出现一场比赛时间不同的情况。


为了避免出现上述的情况,我们可以把球员比赛表设计为下面的三张表。


e686cdbadccb44a0ae33923404fb4b83.png

这样的话,每张数据表都符合第二范式,也就避免了异常情况的发生。  

1NF 告诉我们字段属性需要是原子性的,而 2NF 告诉我们一张表就是一个独立的对象,一张表只 表达一个意思。

举例3:

定义了一个名为 Orders 的关系,表示订单和订单行的信息:


4561a8cde0154e8799f5da4917ebba27.png


违反了第二范式,因为有非主键属性仅依赖于候选键(或主键)的一部分。例如,可以仅通过orderid找 到订单的 orderdate,以及 customerid 和 companyname,而没有必要再去使用productid。  


修改:


Orders表和OrderDetails表如下,此时符合第二范式。


45a647478ddd4bf3ac83b472c0cdea8a.png

第三范式(3rd NF)  

举例1:

部门信息表 :每个部门有部门编号(dept_id)、部门名称、部门简介等信息。


员工信息表 :每个员工有员工编号、姓名、部门编号。


列出部门编号后就不能再将部门名称、部门简介 等与部门有关的信息再加入员工信息表中。 如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。

举例2:  


905b7ca20e5844e58d07fd2c3fe8f8ca.png

商品类别名称依赖于商品类别编号,不符合第三范式。


f45f43346bd64a99a0fdddf36704a156.png

举例3:  

球员player表 :球员编号、姓名、球队名称和球队主教练。现在,我们把属性之间的依赖关系画出 来,如下图所示:

ccc673e5e32541ee846b974691b29e66.png


你能看到球员编号决定了球队名称,同时球队名称决定了球队主教练,非主属性球队主教练就会传递依 赖于球员编号,因此不符合 3NF 的要求。 如果要达到 3NF 的要求,需要把数据表拆成下面这样:  

f92fc30586fd45e0a95cbed17578b241.png

符合3NF后的数据模型通俗地讲,2NF和3NF通常以这句话概括:“每个非键属性依赖于键,依赖于 整个键,并且除了键别无他物”。  


相关文章
|
8月前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
194 0
|
8月前
|
数据库 Python
在数据库中的规范设计
【5月更文挑战第16天】关系数据库规范化理论涉及函数依赖和超键概念。函数依赖如X->Y表示X能唯一确定Y。超键是能唯一标识元组的属性集合,候选键是最小超键,无冗余。主键是用户选定的候选键,外键关联不同表的主键。Armstrong公理用于推导函数依赖。数据库范式从1NF到5NF,消除部分和传递依赖,确保数据完整性。实际操作中,反规范化有时用于优化,如增加冗余列、派生列、重组表和分表策略,以提升查询效率和性能。
232 51
在数据库中的规范设计
|
5月前
|
存储 SQL 关系型数据库
数据库开发设计规范(通用)
数据库开发设计规范(通用)
467 0
|
6月前
|
存储 监控 安全
安全规范问题之跟数据库交互涉及的敏感数据操作需要有哪些措施
安全规范问题之跟数据库交互涉及的敏感数据操作需要有哪些措施
|
8月前
|
存储 关系型数据库 数据库
关系型数据库设计规范第一范式(1NF)
【5月更文挑战第14天】关系型数据库设计规范第一范式(1NF
257 8
|
8月前
|
关系型数据库 数据库
关系型数据库设计规范第二范式(2NF)
【5月更文挑战第14天】关系型数据库设计规范第二范式(2NF)
397 7
|
8月前
|
关系型数据库 数据库
关系型数据库设计规范第三范式(3NF)
【5月更文挑战第14天】关系型数据库设计规范第三范式(3NF)
341 3
|
7月前
|
SQL 存储 关系型数据库
第11章‘数据库设计规范(2)
第11章‘数据库设计规范
145 0
|
7月前
|
存储 关系型数据库 数据挖掘
第11章‘数据库设计规范(1)
第11章‘数据库设计规范
104 0
|
存储 关系型数据库 MySQL
Mysql(一) 数据库的设计与规范
假设,课程的学分发生了变更,那我们就需要把整表关于该课程的学分都要更新一次,但如果我们拆分出课程表,那我们就只需要把课程表中的课程信息更新就行。
220 0