关系数据库设计规范化流程

来源:互联网 发布:java程序员分级 编辑:程序博客网 时间:2024/05/01 12:59
 

    数据库表结构的设计关系到:数据库的存储效率、数据完整性、可扩展性及冗余数据。

     

    规范化:确保数据正确地分布到数据库的表中,防止操作异常及大量冗余信息的存储。数据冗余不仅占用物理空间,对数据的维护和一致性检查也带来了问题。

     

    范式及举例

     

    第一范式:【数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等】

     

    举例

    该数据库表是符合第一范式:

    字段1

    字段2

    字段3

    字段4

    ?

    ?

    ?

    ?

    该数据库表是不符合第一范式的:

    字段1

    字段2

    字段3

     

    字段4

    ?

    ?

    字段3.1

    字段3.2

    ?

     

    第二范式:【数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,部分函数依赖指存在组合关键字中的某些字段决定非关键字段的情况,即所有非关键字段都完全依赖于任意一组候选关键字,非关键字段指:非主键字段和非候选键字段】

     

    举例:

    选课关系表:SelectCourse(学号,姓名,年龄,课程名称,成绩,学分);

    候选键:组合关键字(学号, 课程名称)

    存在如下关系:

    (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

    同时存在如下关系:

    (课程名称) → (学分)

    (学号) (姓名,年龄)

     

    由于选课关系表不满足第二范式,存在如下问题:

  1. 数据冗余

    当一个学生选择了n门课,学生的姓名、年龄会被存储n次,重复n-1次;

    当选择一门课程的有m个学生,课程学分会存储m次,重复m-1次。

  2. 更新异常

    若要调整某门课程的学分,所有的行都要更新

  3. 插入异常

    若添加了一门新的课程,还没有人选修,则课程和学分也没法插入

  4. 删除异常

    当学生选修完后,需要将其删除,同时也将课程和学分信息也删除了

     

    将选课关系表SelectCourse改为如下三个表,以满足第二范式:

    学生:Student(学号,姓名, 年龄)

    课程:Course(课程名称,学分)

    选课关系:SelectCourse(学号,课程名称, 成绩)

     

    第三范式:【在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。满足第三范式的数据库表应该不存在如下依赖关系:关键字段非关键字段x非关键字段y

     

    举例:

    学生关系表:Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)

    主键:学号

    存在如下关系:

    (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)

    同时存在如下关系:

    (学号) → (所在学院) → (学院地点, 学院电话)

    即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

     

    把学生关系表分为如下两个表:

    学生:(学号,姓名, 年龄,所在学院)

    学院:(学院,地点, 电话)

     

    BCNF范式【在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖】

     

    举例:

    仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量);

    一个管理员只在一个仓库工作;

    一个仓库可以存储多种物品。

     

    存在如下关系:

    (仓库ID,存储物品ID) (管理员ID,数量)

    (管理员ID,存储物品ID) (仓库ID,数量)

    其中,(仓库ID,存储物品ID)(管理员ID,存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量。

    同时存在如下关系:

    (仓库ID) (管理员ID)

    (管理员ID) (仓库ID)

    存在关键字段决定关键字段的情况,其不符合BCNF范式。

     

    由于仓库管理关系表不满足BCNF范式,存在如下问题:

  5. 删除异常:

    当仓库被清空后,所有"存储物品ID""数量"信息被删除的同时,"仓库ID""管理员ID"信息也被删除了。

  6. 插入异常:

    当仓库没有存储任何物品时,无法给仓库分配管理员。

  7. 更新异常:

    如果仓库换了管理员,则表中所有行的管理员ID都要修改。

     

    把仓库管理关系表分解为二个关系表:

    仓库管理:StorehouseManage(仓库ID,管理员ID)

    仓库:Storehouse(仓库ID,存储物品ID, 数量)

    这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

     

原创粉丝点击