转:数据库关系模式的范式详解

关系模式的范式

    主要有4种范式,1NF,2NF,3NF,BCNF,按从左至右的顺序一种比一种要求更严格。要符合某一种范式必须也满足它前边的所有范式。一般项目的数据库设计达到3NF就可以了,而且可根据具体情况适当增加冗余,不必教条地遵守所谓规范。

简单而言,1NF就是要求一张表里只放相互关联的字段,一个字段里只放一条信息,这只是最基本的要求。至于2NF,3NF,BCNF虽然描述的内容不同,但表现在数据特点上很相似,就好比在说不要为了向某厂订购一批货记下来,就把的厂的面积、电话等都放在同一张表里,而应该用两张表,以尽量避免浪费数据存储空间。因为和同一个厂可能会交易好几次,但没必要每次交易都记录全部的信息。

从范式所允许的函数依赖方面进行比较,四种范式之间的关联如下图所示。

 

 

以下对每种范式作一一说明。

2.3.4.2  第一范式

在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。

例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为1NF有三种方法:
一是重复存储职工号和姓名。这样,关键字只能是电话号码。
二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性
三是职工号为关键字,但强制每条记录只能有一个电话号码。
以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。

2.3.4.3  第二范式

关系的第二范式(2NF)定义: 如果关系模式R为1NF,并且R中的每一个非主属性都完全依赖于R的某个候选关键字,则称R是第二范式的,简记为2NF。

【例2.40】 设有关系模式R(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS),基于R的函数依赖集F={(S#,C#)→G,C#→TN,TN→TS},判断R是否为2NF。

解:

(1) 容易看出,关系模式R是1NF。因为R符合关系的定义,R的所有属性值都是不可再分的原子值。

R是否为2NF,应根据2NF的定义来判断。                                          

首先要确定关系模式R中各属性间的函数依赖情况。如果没有直接给出R的函数依赖集,就要按照语义把它确定下来。在本例中,已直接给出基于R的函数依赖集F,我们可使用阿氏推理规则并结合下面介绍的方法,进一步确定R中哪些是主属性、哪些是非主属性、侯选关键字由哪些属性构成。

方法①  写出函数依赖集F中的各个函数依赖以帮助分析。方法①的特点是直接

F={(S#,C#)→G,

C#→TN,

TN→TS

}

    方法②  用有向图表示属性间函数依赖,结点表示属性,方框包含若干个结点表示属性组合,有向箭头表示函数依赖。本例的函数依赖图如图2.9所示。方法②的特点是直观

 

图2.9 函数依赖图例子

    方法③  把关系模式R与函数依赖集F结合起来,属性组合用下划线(或上划线)表示,函数依赖用有向箭头表示。本例的函数依赖简图如图2.10所示。方法③的特点是简单

 

图2.10函数依赖简图例子

    用阿氏推理规则由F可推出:(S#,C#)→{S#,C#,G,TN,TS},即属性组合(S#,C#)是R的候选关键字(R只有这一个候选键)。(S#,C#)的一个值可惟一标识R中的一个元组(并且没有多余的属性)。

在R中,S#,C#是主属性;其余的属性G,TN,TS为非主属性。

借助上面的图,我们可以看到,非主属性G对键是完全依赖:(S#,C#)→G。但非主属性TN,TS对键是部分依赖(他们仅依赖于键的真子集C#)。由于R中存在非主属性对候选键的部分依赖,所以关系模式R不是2NF。

R中存在非主属性对候选键的部分依赖,将会引起数据冗余、数据操作异常等问题。可以把关系R无损联接地分解成两个2NF的关系模式:

ρ={R1,R2},R1={S#.C#,G},R2={C#,TN,TS}。

【例2.41】选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。

由以上条件,关键字为组合关键字(SNO,CNO)
在应用中使用以上关系模式有以下问题:
a.数据冗余,假设同一门课由40个学生选修,学分就 重复40次。
b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。
c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。
d.删除异常,若学生已经结业,从当前数据库删除选修记录,就会可能连课程号及学分完全从数据库中删除,则此门课程及学分记录无法保存。
原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。
解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系

 

2.3.4.4  第三范式

关系的第三范式(3NF)定义: 如果关系模式R为2NF,并且R中的每一个非主属性都不传递依赖于R的某个候选关键字,则称R是第三范式的,简记为3NF。

【例2.42】续上例2.40(R(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS)),判断关系模式R1={S#.C#,G},R2={C#,TN,TS} 是否为3NF。

解:

(1) 在关系模式R1={S#,C#,G},候选关键字是(S#,C#),主属性是S#,C#,非主属性是G,函数依赖为(S#,C#)→G。  由于R1中不存在非主属性对候选关键字的传递依赖,所以关系模式R1是3NF。

(2) 在关系模式R2={C#,TN,TS},候选关键字是C#,主属性是C#,非主属性是TN,TS,函数依赖为C#→TN,TN→TS。由于R2中存在非主属性对候选关键字的传递依赖C#TS,所以关系模式R2不是3NF。

可以把关系R2无损联接地分解成两个3NF的关系模式:

ρ={R3,R4},R3={C#,TN},R4={TN,TS}。

【例2.43】如(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,
姓名,所在系,系名称,系地址。
判断关系模式S1是否为3NF。


关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,是2NF。

但这关系有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的。关键字 SNO 对 LOCATION 函数决定是通过传递依赖:SNO -> DNO,及DNO -> LOCATION实现的。也就是说,SNO不直接决定非主属性LOCATION,不是3NF。
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系。

2.3.4.5   Boyce-Codd范式

关系的Boyce-Codd范式(BCNF)定义: 如果关系模式R为1NF,并且R中的每一个函数依赖X→Y(YÏX),必有X是R的超关键字,则称R是Boyce-Codd范式的,简记为BCNF。

从BCNF的定义中,可以明显地得出如下结论:

(1) 所有非主属性对键是完全函数依赖;

(2) 所有主属性对不包含它的键是完全函数依赖;

(3)没有属性完全函数依赖于非键的任何属性组合。

与2NF,3NF的定义不同,BCNF的定义直接建立在1NF的基础上。但实质上BCNF是3NF的改进形式。3NF仅考虑了非主属性对键的依赖情况,BCNF把主属性对键的依赖情况也包括进去。BCNF要求满足的条件比3NF所要求的更高。如果关系模式R是BCNF的,那么R必定是3NF,反之,则不一定成立。

【例2.43】 续前例2.42(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS),判断两个3NF关系模式R3={C#,TN},R4={TN,TS}是否为BCNF。

解:在关系模式R3中有函数依赖C#→TN,决定因素C#是R3的键;

在关系模式R4中有函数依赖TN→TS,决定因素TN是R4的键;

     R3,R4都满足BCNF的定义,所以,这两个关系模式都是BCNF。

【例2.44】配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件
a.一个仓库有多个职工。
b.一个职工仅在一个仓库工作。
c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
d.同一种型号的配件可以分放在几个仓库中

分析:由以上得 PNO 不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) -> ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)-> ENO。因为 一个职工仅在一个仓库工作,有ENO -> WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (ENO,PNO)-> QNT。
找一下候选关键字,因为(WNO,PNO) -> QNT,(WNO,PNO)-> ENO ,因此 (WNO,PNO)可以决定整个元组,是一个候选关键字。根据ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)也能决定整个元组,为另一个候选关键字。属性ENO,WNO,PNO 均为主属性,只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。
分析一下主属性。因为ENO->WNO,主属性ENO是WNO的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)-> ENO但反过来不成立,而P->WNO,故(ENO,PNO)-> WNO 也是传递依赖。
虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
解决办法:分成管理EP(ENO,PNO,QNT),关键字是(ENO,PNO)工作EW(ENO,WNO)其关键字是ENO
缺点:分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)-> ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。

转载于:https://www.cnblogs.com/BensonHe/articles/1872241.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纹理对象纹理单元纹理目标_网页设计理论:纹理

纹理对象纹理单元纹理目标Texture has become an indispensable element in web design. It is not only a trend but also a quick way to increase the depth of web pages. When designers learn to use textures, they can strengthen the appeal of web pages. It can be …

javascript-高级用法

22.1 安全的类型检测 为什么:typeof 不靠谱, 无法将数组从对象中区分出来, instanceof 有特殊情况,在iframe存在的情况下无法判断另一个iframe内的数组 如何做:Object.prototype.toString().call(Arr); 22.3 高级定时器 特点&…

java dao层和base层_详解Javaee Dao层的抽取

有时候我们在实现不同功能的时候回看到很多的Dao层的增加、修改、删除、查找都很相似,修改我们将他们提取BaseDao一、提取前1. 提取前的LinkDao层:public interface LinkManDao {Integer findCount(DetachedCriteria detachedCriteria);List findByPage(…

畅销书《深入浅出Vue.js》作者,在阿里淘系1年的收获成长

大家好,我是若川。今天推荐一篇95年的博文的文章。他的故事应该挺多人知道。如果不知道可以看他的博客 https://github.com/berwin/blog点击下方卡片关注我、加个星标时间好快,眨眼间,加入阿里已经一年了。这一年发生了很多事,整体…

GrideView属性的学习

GridView 控件可公开分页事件和排序事件,以及在创建当前行或将当前行绑定至数据时发生的事件。单击一个命令控件(例如,包含在 GridView 控件中作为其中的一部分的 Button 控件)时也会引发事件。下表描述了由 GridView 控件公开的事…

插图 引用 同一行两个插图_将图标变成插图的五个简单步骤

插图 引用 同一行两个插图Every creative person has probably already been in this situation: A project, be it a website, an app — or as far as I am concerned: often a news story would benefit from an appealing side visual. But neither budget nor time makes …

urllib库parse模块的使用

官方文档转载于:https://www.cnblogs.com/vector-wyw/p/10416010.html

java dateutil 获取时间戳_java DateUtil工具类时间戳类型转换详解

本文实例为大家分享了DateUtil工具类时间戳类型转换的具体代码,供大家参考,具体内容如下package com.sinosoft.media.sms.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateUtil {//当前…

fluorinefx C# 版的开源rtmp服务器

fluorinefx C# 版的开源rtmp服务器 - [其它资源] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://25swf.blogbus.com/logs/28529745.html fluorinefx支持的 .net 框架集有 1.1 2.0 3.5 以及 mono 1.2.4支持的东东Flex, Flash Remoting (RP…

web登录界面设计_出色的Web界面设计的7条规则

web登录界面设计When you work on a website or on the design of web pages, remember that their success is not determined by the beauty of their visual style. In fact, in his article “10 Principles Of Good Website Design”, Vitaly Friedman stated:当您在网站或…

关于为什么我推荐大家看vue代码的随想

大家好,我是若川。今天给大家推荐一篇大圣老师在知乎的回答,很快能看完。我也曾经回答过这个问题。若川知乎高赞:有哪些必看的 JS 库?不要为了读源码而读源码,但要学会看源码。自己常用的熟悉的库的源码值得读读。点击…

算法 - 最好、最坏、平均复杂度

注:本文仅为笔记。 原文 极客时间 - 数据结构与算法之美 - 04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 最好、最坏时间复杂度 略,比较容易分析。 平均时间复杂度 需考虑概率来计算。 概率论中的加权平…

java编译多个包_javac一次性编译多个包下的.java文件

标准的javac可以跟一个加一个文件名,该文件里保存了源文件列表,使用下面的命令:javac sourcefilecd xxxdir *.java/s/b > srclist.txtor dir x:/yyy/zzz/*.java/s/b > srclist.txtjavac -cp .;xxx/yyy/zzz.jar;x…

555的传说

郑昀 20101118 昨天听1039电台才知道,北美电影里常出现的555开头号码是行规惯例,因为当年贝尔系统为测试链路中所有交换机的基本功能,全部由5组成的号码(555–5555)作为特别的测试号码被保留,时至今日只剩下…

没想到你是这样的npm install

大家好,我是若川。今天给大家推荐一篇关于 npm install 的好文。很快能看完。点击下方卡片关注我、加个星标学习源码整体架构系列、年度总结、JS基础系列前言项目中执行npm install发生了什么,众所周知,执行npm install时会在当前项目目录的n…

Django——Model

一、 ORM 在 MVC 或者说 MTV 设计模式中,模型(M)代表对数据库的操作。那么如何操作数据库呢? 我们可以在 Python 代码中嵌入 SQL 语句。 但是问题又来了,Python 怎么连接数据库呢?可以使用类似 pymysql 这一…

大理石在哪儿_如何创建用户体验写作课程而又不失大理石

大理石在哪儿I’m a UX Writer. It’s a designated human on the software development team who writes words for interfaces. All the words. From the tiniest tooltips to navigation, to buttons, to errors, and so on, ad infinitum. UX writing is less writing and …

理解 JavaScript 闭包

简介 Closure 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 闭包是 ECMAScript (JavaScript)最强大的特性之一,但…

in the java search_elasticsearch which: no java in (/sbin:/bin:/usr/sbin:/usr/bin)

机器:centos7.2javahome:export JAVA_HOME/root/jdk1.8.0_60export PATH$JAVA_HOME/bin:$PATHexport CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar[rooti-j73a8nn6 ~]# java -versionjava version “1.8.0_60”Java(TM) SE Runtime Envir…

Vuex 源码还有一些缺陷?

我看了vuex3和vuex4的源码也输出了文章,看到这篇时,vuex还有缺陷?看了看确实是好文,不愧是大佬写的。文章不算长,推荐给大家看看。点击下方卡片关注我、加个星标学习源码整体架构系列、年度总结、JS基础系列众所周知&a…