Vu Database Normalization

Normalization - 数据库三范式

化为第一范式:去除可计算的数据,找出主要的pk,留下和他是一对一关系的数据类型,把其他的分出去,之后把pk也给他们一个进行联系。

化为第二范式:对于有组合主键的表中把非完全依赖组合主件移出,并给他一个他依赖的组合主键中的一个东西。

化为第三范式:看除主键之外的东西中有没有传递关系,如果有传递关系则把这一串拿出来作为一个表,并留下新表中的pk作为联系

整体流程如下图:
1

具体操作我们来看例题:

例 1 :
2

  • 一名员工可以在多个项目中工作。

  • 项目编号,对于项目是唯一的,员工编号对于员工是唯一的,职务代码唯一标识职务。

  • 可以有多个具有相同职称的员工。小时工资是针对某一工作的。例如,对所有程序员来说,费率是55美元。

第一范式:
3
第二范式:
4
分析可知,只有assign_hours是完全依赖组合主键的,其他的都只依赖于emp_num。所以第二范式为:
5
第三范式:
6
分析可知,在非组合组件中job系列是有传递关系的,所以我们把job系列再写成一个表,如下:
7
例 2 :
8

  • 年是书出版的年份。

  • 序列(seq)列显示作者在封面上出现的顺序。

  • 一个作家能写很多书。一本书可以由多个作者撰写。

  • 一本书只能由一个出版商出版。

  • 一本书的标价。

第一范式:
9
因为一本书只能由一个出版商出版,所以这里pub系列与BookCode(pk)是相关的。

第二范式:
10
这里只有Seq是和组合主键是相关的,所以把AuID给提出来,如图:
11
第三范式:
12
在非组合主键中我们发现pub系列是有传递关系的,所以单独放在一个表里,如图:
13
例 3 :
14

  • 有几种贷款类型:住房、汽车、建筑、透支和教育

  • loan id是唯一的标识符,用于标识银行提供的每个贷款。

  • 利率是以贷款为基础的固定利率。

  • 贷款期限是指贷款还本付息的年限(利息按利率计算)。贷款期限根据贷款类型和客户信用价值确定。

  • 顾客可以要求借多少钱。但是,贷款金额是根据贷款类型和客户信用记录确定的。

  • 合同日期是贷款发放的日期。

第一范式:
15
第二范式:
16
依赖关系如上图,所以第二范式为:
17
第三范式:
在非主键元素中我们并没有发现传递关系,所以第三范式为:
18

这里我们引入一个验证A是B的主键的方法:
A中每一种元素都对用B中一种元素。
例如:
每种LoanID都对应一种LoanType,而每种LoanID对应了多种LoanTerm。所以LoanID是LoanType的主键而不是LoanTerm的。

发布了54 篇原创文章 · 获赞 27 · 访问量 2688

猜你喜欢

转载自blog.csdn.net/Deam_swan_goose/article/details/102872438