数据库设计之规范化

来源:互联网 发布:凯旋软件 编辑:程序博客网 时间:2024/05/01 02:25

规范化帮助消除表数据中的冗余和不一致.它是将表精简为一组列的过程,在这组列中所有非键列都依赖于主键列,若不是这样,则在更新期间该数可能变得不一致.

简单介绍第一,二,三,四范式规则

第一范式:表中的每一行位置都和每一列位置均有一个值,永远不会是一组值.

第二范式:不是键的一部分的第一列都依赖于该键.

第三范式:每个非键列都独立于其他非键列,并依赖于该键.

第四范式:没有一行包含有关实体的两个或更多个独立多值事实.

下面举例介绍第一,二,三,四范式规则

第一范式:若每个单元都有一个值,记远不会有一组值,则该表使用的是第一范式.

下表违反第一范式,因为对于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        西班牙语

但是若这些属性理独立的(即:雇员只将特定的语言用于特定的技能)则不应该将表分割.

小结:设计数据库的一个良好的策略是将所有数据安排在使用第四范式的表中,然后决定该结果是否提供了一个可接受的性能级别,如果没有则可将数据安排在使用第三范式的表中然后生新评定性能.

0 0
原创粉丝点击