`
tobereal
  • 浏览: 4500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

[转]数据库三范式经典实例解析

阅读更多

[转]数据库三范式经典实例解析

数据库的三范式

1N:关系R中的属性都是不可分割的项.
2N:在1N的基础上,每个非主属性完全函数依赖于码.
3N:在2N的基础上,每一个非主属性既不部分依赖于码也不传递依赖于码.
 1N
  |   消除非主属性对码的部分函数依赖
 2N
  |   消除非主属性对码的传递函数依赖
 3N
  |   消除主属性对码的部分和传递函数依赖
 BCNF
  |   消除非平凡且非函数依赖的多值依赖
 4N

简单描述:
第三范式的要求如下:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
你说的两个表,如果每个都满足三范式,那么两个表也满足三范式。

转自:http://www.cublog.cn/u/23975/showart.php?id=391210
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
     设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住。所以我们很多人就根本不按照范式来设计数据库。
     实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。本文将对范式进行通俗地说明,并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。

范式说明
     第一范式(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) 插入异常:
     假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
     (4) 删除异常:
     假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

     把选课关系表SelectCourse改为如下三个表:
     学生:Student(学号, 姓名, 年龄);
     课程:Course(课程名称, 学分);
     选课关系:SelectCourse(学号, 课程名称, 成绩)。
     这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
     另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
     第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
     关键字段 → 非关键字段x → 非关键字段y
     假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:
     (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
     (学号) → (所在学院) → (学院地点, 学院电话)
即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
     它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
     把学生关系表分为如下两个表:
     学生:(学号, 姓名, 年龄, 所在学院);
     学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
     鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
     假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
     (仓库ID, 存储物品ID) →(管理员ID, 数量)
     (管理员ID, 存储物品ID) → (仓库ID, 数量)
     所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
     (仓库ID) → (管理员ID)
     (管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:
     (1) 删除异常:
     当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
     (2) 插入异常:
     当仓库没有存储任何物品时,无法给仓库分配管理员。
     (3) 更新异常:
     如果仓库换了管理员,则表中所有行的管理员ID都要修改。
     把仓库管理关系表分解为二个关系表:
     仓库管理:StorehouseManage(仓库ID, 管理员ID);
     仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
     这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

分享到:
评论

相关推荐

    数据库三范式.pdf

    数据库三范式经典实例解析 数据库设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入、删除和更新操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦...

    数据库范式解析,看了秒懂

    数据库范式是关系数据库设计中的核心理论,它们是用来衡量数据依赖规范化的程度,确保数据库的结构合理、数据冗余最小,从而减少数据异常。本文将深入解析数据库的几个主要范式,包括第一范式(1NF)、第二范式(2NF...

    Visual C#.NET数据库开发经典案例解析

    综上所述,《Visual C#.NET数据库开发经典案例解析》这本书很可能涵盖了这些主题,并通过实例分析帮助读者深入理解和应用这些技术。通过学习和实践书中的案例,开发者能够提升在C#和.NET环境中进行数据库开发的能力...

    SQL+Server数据库开发经典实例精解

    《SQL Server数据库开发经典实例精解》是一本深入探讨SQL Server数据库开发的实用指南,旨在通过丰富的实例解析,帮助读者掌握SQL Server的核心技术和应用方法。本书涵盖了从基础操作到高级特性的广泛内容,旨在帮助...

    Mysql数据库设计三范式实例解析

    三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 一个表只说明一个事物; 3NF:每列都与主键有直接关系,不...

    SQL Server数据库开发经典案例解析源码

    《SQL Server数据库开发经典案例解析源码》是针对SQL Server数据库设计与开发的一份宝贵资源,其中包含了丰富的实例代码,旨在帮助开发者深入理解和应用SQL Server的相关技术。此资源可能包括了从基础操作到高级特性...

    计算机等考三级数据库基础:数据库设计三大范式应用实例剖析.docx

    【计算机等考三级数据库基础:数据库...通过实例解析,我们可以更好地理解和应用这些范式,从而构建更加优化的数据库系统。在进行数据库设计时,应该深入理解并灵活运用这些原则,以实现高效、稳定的数据存储和管理。

    简洁、明晰!数据库设计三大范式应用实例剖析

    本文将详细介绍数据库设计的三大范式——第一范式(1NF)、第二范式(2NF)和第三范式(3NF),并通过具体实例解析如何在实际项目中应用这些范式。 #### 第一范式(1NF) **定义**: 第一范式要求数据库表中的每个字段都...

    数据库 三范式

    **实例解析** 在上述的选课关系实例中,通过分解原始表为“学生”、“课程”和“选课关系”三个表,实现了2NF。接着,将学生表和学院信息分离,避免了3NF中的传递依赖,达到了3NF。这样的设计减少了数据冗余,避免...

    SQL Server数据库开发实例解析完整版

    本资源“SQL Server数据库开发实例解析完整版”提供了丰富的实践案例,帮助开发者深入理解并掌握SQL Server的数据库开发技术。以下是根据标题、描述以及压缩包中的文件名称,提炼出的相关知识点: 1. SQL Server...

    数据库设计范式简单入门

    本文将详细介绍数据库设计中的三种基本范式:第一范式(1NF)、第二范式(2NF)和第三范式(3NF),并结合实际案例进行解析。 #### 二、第一范式(1NF) ##### 定义 第一范式(1NF)是最基础的范式,所有关系数据库...

    清华版 Delphi数据库开发经典案例解析 源码下载 2.0.RAR

    《清华版 Delphi数据库开发经典案例解析》是针对Delphi编程和数据库应用的一部实践性教程,源码下载2.0版本提供了丰富的实例代码,旨在帮助开发者深入理解Delphi环境下的数据库开发技术。这本书可能涵盖了从基础的...

    Delphi数据库开发经典案例解析

    总之,《Delphi数据库开发经典案例解析》这本书将引领读者逐步深入Delphi数据库开发的世界,通过实例解析,使开发者能够掌握从基本的数据库连接到高级的数据库管理技术,从而在实际项目中游刃有余。无论是初学者还是...

    Visual Basic+Access数据库应用实例完全解析

    《Visual Basic+Access数据库应用实例完全解析》是针对初学者和有一定编程基础的读者提供的一份全面指南,它深入浅出地介绍了如何使用Visual Basic(VB)编程语言与Microsoft Access数据库进行集成开发,以实现各种...

    access经典的罗斯文数据库实例讲解

    10. **数据库设计原则**: 正确的数据库设计应遵循范式理论,如第一范式(1NF)、第二范式(2NF)和第三范式(3NF),以避免数据冗余和不一致性。 11. **数据库维护**: 定期备份和验证数据库,以防止数据丢失。还...

    通用(oracle DB2 )数据库设计范式

    本文主要介绍1NF、2NF、3NF以及BCNF,并通过实例解析如何应用这些范式。 #### 二、第一范式(1NF) **定义:** 在1NF中,要求关系中的每个属性都是原子性的,即不能再被细分为更小的数据单位。换句话说,表中的每一列...

    Visual C++数据库开发典型模块与实例精讲颜志军2.rar

    本部分聚焦于深入讲解关键模块的实现和实例解析,旨在提升开发者在实际项目中的应用能力。以下是基于该主题的详细知识点: 1. **MFC与数据库编程**:Visual C++的MFC(Microsoft Foundation Classes)库提供了一套...

    数据库开发及工程实例

    - **数据库设计原则**:在进行数据库设计时,遵循第三范式(3NF)可以减少数据冗余,提高数据一致性。此外,ER模型(实体关系模型)是数据库设计的常用工具,帮助设计者清晰地描绘实体及其之间的关系。 - **安全性...

    visual basic数据库开发实例精粹

    《Visual Basic数据库开发实例精粹》是一本深入探讨如何使用Visual Basic进行数据库开发的专业书籍,其主要内容涵盖了数据库设计、编程技巧、以及三层架构的应用。在实际的软件开发中,掌握这些知识对于提升VB项目的...

Global site tag (gtag.js) - Google Analytics