规范化帮助消除表数据中的冗余和不一致.它是将表精简为一组列的过程,在这组列中所有非键列都依赖于主键列,若不是这样,则在更新期间该数可能变得不一致.
简单介绍第一,二,三,四范式规则
第一范式:表中的每一行位置都和每一列位置均有一个值,永远不会是一组值.
第二范式:不是键的一部分的第一列都依赖于该键.
第三范式:每个非键列都独立于其他非键列,并依赖于该键.
第四范式:没有一行包含有关实体的两个或更多个独立多值事实.
下面举例介绍第一,二,三,四范式规则
第一范式:若每个单元都有一个值,记远不会有一组值,则该表使用的是第一范式.
下表违反第一范式,因为对于PART的每个具体值,WAREHOUSE列都包含了几个值
PART(PK) WAREHOUSE
P0010 Warehouse A Warehouse B Warehouse C
P0020 Warehouse B Warehouse D
下表符合第一范式
PART(PK) WAREHOUSE(PK) QUANTITY
P0010 Warehouse A 400
P0010 Warehouse B 543
P0010 Warehouse C 329
P0020 Warehouse B 200
P0020 Warehouse D 278
第二范式:若每个不同键的一部份的列都依赖于整个键,则该表使用的是第二范式.
当一个非键列依赖于组合键的的一部分时,违反了第二范式,如下示例所示
PART(PK) WAREHOUSE(PK) QUANTITY WAREHOUSE_ADDRESS
P0010 Warehouse A 400 1608 New Field Road
P0010 Warehouse B 543 4141 Greenway Drive
P0010 Warehouse C 329 171 Pine Lane
P0020 Warehouse B 200 4141 Greenway Drive
P0020 Warehouse D 278 800 Massey Street
主键是组个键,由PART和WAREHOUSE列组成,因为WAREHOUSE_ADDRESS列只依赖于WAREHOUSE列的值,则违反了第二港式.
解决方案是将表分割成下面两个表
PART_STOCK表:
PART(PK) WAREHOUSE(PK) QUANTITY
P0010 Warehouse A 400
P0010 Warehouse B 543
P0010 Warehouse C 329
P0020 Warehouse B 200
P0020 Warehouse D 278
WAREHOUSE表:
WAREHOUSE(PK) WAREHOUSE_ADDRESS
Warehouse A 1608 New Field Road
Warehouse B 4141 Greenway Drive
Warehouse C 171 Pine Lane
Warehouse D 800 Massey Street
若两表使用第二范式,就需要考虑其性能,根据部件位置生成报告的应用程序必须将这两个表连接起来检索相关信息.
第三范式:若每个非键列都独立于其他非键列,且只依赖于键,则表使用的是第三范式.
以下的示例中第一个表包含了EMPNO列和WORKDEPT列,假定添加了DEPTNAME列.这个新列依赖于WORKDEPT,但主键是EMPNO.该表违反了第三范式
EMPNO(PK) FIRSTNAME LASTNAME WORKDEPT DEPTNAME
000290 John Parker E11 Installation Mgmt
000320 Ramlal Mehta E21 Software Support
000310 Maude Setright E11 Operations
更改雇员John Parke的DEPTNAME不会更改该部门的其他雇员的部门名称,注意,改后部门E11中有两个不同的部门名称
下面的表被定义为规范化的结果
EMPLOYEE表
EMPNO(PK) FIRSTNAME LASTNAME WORKDEPT
000290 John Parker E11
000320 Ramlal Mehta E21
000310 Maude Setright E11
DEPARTMENT表
DEPTNO(PK) DEPTNAME
E11 Operations
E21 Software Support
第四范式:若没有一行包含关联的实体的两个或更多个独立的多值事实,则该表使用的是第四范式.
考虑下列实体:雇员,技能,语言,一个雇员可以有几种技能,并能晓多种语言.有两个关系,一个是雇员和技能之间的关系,一个是雇员和语言之间的关系,若一个表表示这两种关系,则未使用第四范式,如下所示
EMPNO(PK) SKILL (PK) LANGUAGE (PK)
000130 Data Modelling 英语
000130 Database Design 英语
000130 Application Design 英语
000130 Data Modelling 西班牙语
000130 Database Design 西班牙语
000130 Application Design 西班牙语
应改用两个表表示这种关系
EMPLOYEE_SKILL表
EMPNO(PK) SKILL (PK)
000130 Data Modelling
000130 Database Design
000130 Application Design
EMPLOYEE_LANGUAGE表
EMPNO(PK) LANGUAGE (PK)
000130 英语
000130 西班牙语
但是若这些属性理独立的(即:雇员只将特定的语言用于特定的技能)则不应该将表分割.
小结:设计数据库的一个良好的策略是将所有数据安排在使用第四范式的表中,然后决定该结果是否提供了一个可接受的性能级别,如果没有则可将数据安排在使用第三范式的表中然后生新评定性能.