数据库设计三大范式实践应用详解

需积分: 14 18 下载量 114 浏览量 更新于2024-12-13 收藏 211KB PDF 举报
数据库设计三大范式应用实例剖析 数据库设计三大范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入、删除和更新操作异常。今天我们将对这三大范式进行通俗的说明,并以笔者曾经设计的简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。 **第一范式(1NF)** 第一范式是数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。例如,如下的数据库表是符合第一范式的: | 字段1 | 字段2 | 字段3 | 字段4 | | --- | --- | --- | --- | 而这样的数据库表是不符合第一范式的: | 字段1 | 字段2 | 字段3 | 字段4 | 字段3.1 | 字段3.2 | | --- | --- | --- | --- | --- | --- | 很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 **第二范式(2NF)** 第二范式是数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,也即所有非关键字段都完全依赖于任意一组候选关键字。假定选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在如下决定关系: (学号,课程名称)→(姓名,年龄,成绩,学分) 这个数据库表不满足第二范式,因为存在如下决定关系: (课程名称)→(学分) (学号)→(姓名,年龄) 即存在组合关键字中的字段决定非关键字的情况。由于不符合2NF,这个选课关系表会存在如下问题: (1)数据冗余:同一门课程由n个学生选修,“学分”就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。 (2)更新异常:若调整了某门课程的学分,数据表中所有行的“学分”值都要更新,否则会出现同一门课程学分不同的情况。 (3)插入异常:假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有相关的数据行,无法插入新的课程信息。 **第三范式(3NF)** 第三范式是数据库表中不存在传递函数依赖,也即如果A依赖于B,而B依赖于C,那么A不能依赖于C。例如,假定我们有一个订单表Order(客户号,订单日期,订单金额),其中客户号是关键字。假定我们又有一个客户表Customer(客户号,客户姓名,客户地址),其中客户号也是关键字。这个订单表存在以下决定关系: 客户号→订单日期 客户号→订单金额 订单日期→订单金额 这个订单表不满足第三范式,因为存在以下传递函数依赖: 客户号→订单日期→订单金额 因此,这个订单表会存在以下问题: (1)数据冗余:客户信息重复记录在每个订单中。 (2)更新异常:若调整了某个客户的信息,所有相关订单的客户信息都要更新。 (3)插入异常:假设要插入一个新的订单,暂时还没有相关的客户信息。这样,由于还没有相关的客户信息,无法插入新的订单信息。 数据库设计三大范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入、删除和更新操作异常。因此,在设计数据库时,我们必须遵守这些规范,以确保我们的数据库是简洁的、结构明晰的、高效的。