数据库1NF-3NF范式深入理解

关系型数据库设计时为确保数据存储规范化,通常需要按照范式设计数据,接下来主要介绍下1NF-3NF递进式数据库设计,4NF、5NF日常使用较少不包含在本次内容中。

首先总体描述下1NF-3NF转化的过程

1NF------------------>2NF  消除非主属性对码的部分函数依赖

2NF------------------>3NF 消除非主属性对码的传递函数依赖

1NF:

1NF是数据库最基本的要求,每个属性不可分割。但如下图可以看到如果仅仅满足1NF会有大量数据冗余,造成数据存储占用大量空间,同时存在插入、修改、删除异常问题。

图-1NF数据

插入异常:新建一个系,但是暂时还没有招收任何学生(比如3月份就新建了,但要等到8月份才招生),无法将系名与系主任的数据单独地添加到数据表中去的

更新异常:假如李小明转系到法律系,为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据

删除异常:某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)

2NF:

2NF在1NF基础上消除非主属性对码的部分函数依赖,这句话涉及4个概念:“码”、“非主属性”、“部分函数依赖”和“函数依赖”,下面对这些概念进行解读。

:假设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为码,即当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码,一个表可以有多个码。

如上图1NF中,码是(学号,课号)。通过学号可以确认姓名、院系、主任名称。学号和课名可以确定成绩。

非主属性:除去所有的主属性,剩下的就都是非主属性

函数依赖:在一张表中如果属性x的值确定,那么属性y的值也就确定下来了,可以说属性y函数依赖x,即x——>y,y=f(x)。比如:上图中一个学号唯一对应一个姓名,则可以说姓名依赖与学号,但反过来就不对,因为姓名有重名的可能,这样一个姓名可能对应多个学号,即学号——>姓名。还有学号——>系号,系号——>系主任。

对函数依赖进行细分后可以划分为三大类,分别是:

安全函数依赖:在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ' → Y 不成立,那么我们称 Y 对于 X 完全函数依赖,记作 X F→ Y。比如:(学号,课名) F→ 分数 ,通过学号无法确定分数,通过课名也无法确定分数,只有两者作为一个整体才可以确定分数。

传递函数依赖:假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (严格来说还有一个X 不包含于Y,且 Y 不函数依赖于Z的前提条件),那么我们就称 Z 传递函数依赖于 X ,记作 X T→ Z

部分函数依赖:假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X,记作 X P→ Y。比如:(学号,课名) P→ 姓名,但姓名也依赖于学号。

数据表结构是否符合2NF的判断方法是:

1、找出数据表中的码。

2、根据码确定主属性。

3、确定非主属性。

4、判断非主属性是否部分依赖于码。

1NF数据梳理的函数依赖关系如下:

1NF数据函数依赖关系

对1NF数据应用2NF判断方法确定是否上述表结构是否属于2NF。步骤如下:

第一步:表中对码是(学号、课名)

第二步:主属性是学号、课名

第三步:非主属性是分数、姓名、系名、系主任

第四步:

(学号、课名)——>分数,存在非主属性分数对(学号、课名)的完全依赖,因为只有两者一起才可以确定分数值。

(学号、课名)——>姓名,存在非主属性姓名对(学号、课名)的部分函数依赖,因为学号——>姓名

(学号、课名)——>系名,存在非主属性姓名对(学号、课名)的部分函数依赖,因为学号——>系名。

所以上述数据表结构只属于1NF而不是2NF。那如何将上述表转变为2NF?

按照1NF到2NF的转化过程,需要做的是消除部分函数依赖,那就需要将上面数据表结构拆分成多个数据表。如下拆分方法:

选课(学号,课名,分数)

学生(学号,姓名,系名,系主任)

接下来应用是否为2NF判断方法:

对于选课(学号,课名,分数)表,码是学号、课程,非主属性是分数,分数列完全函数依赖(学号、课名)。

而学生(学号,姓名,系名,系主任)表,码是学号,非主属性是姓名、系名、系主任,因为码只有一个主属性,姓名、系名、系主任完全函数依赖学号。符合2NF规范。

数据拆分后新的函数依赖关系:


图-2NF依赖关系


图-2NF数据表结构

验证是否还存在插入、修改、删除异常问题。

测试:

1、李小明转系到法律系

只需要修改一次李小明对应的系的值即可。——有改进

2、数据冗余是否减少了?

学生的姓名、系名与系主任,不再像之前一样重复那么多次了。——有改进

3、删除某个系中所有的学生记录

该系的信息仍然全部丢失。——无改进

4、插入一个尚无学生的新系的信息

因为学生表的码是学号,不能为空,所以此操作不被允许。——无改进

如上可知符合2NF的要求,很多情况下还是不够的,而出现问题的原因,在于仍然存在非主属性系主任对于码学号的传递函数依赖。为了能进一步解决这些问题,还需要将符合2NF要求的数据表改进为符合3NF的要求。

3NF:

在2NF的基础之上,消除了非主属性对于码的传递函数依赖。存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

依据要求判断是否满足3NF。

选课(学号,课名,分数)表,码是(学号、课名),分数完全依赖(学号、课名)。

学生(学号,姓名,系名,系主任)表,码是学号,非主属性为姓名系名系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递。不符合3NF要求。

将2NF中的表进行下一步分解后如下:

选课(学号,课名,分数)

学生(学号,姓名,系名)

系(系名,系主任)

选课表属于完全函数依赖,满足3NF。

学生表码是学号,非主属性是姓名、系名,属于完全函数依赖,满足3NF。

表,码为系名,主属性为系名,非主属性为系主任,属于完全函数依赖,满足3NF。


图-3NF函数依赖


图-3NF数据表

验证是否存在之前插入、修改、删除异常问题。

1、删除某个系中所有的学生记录

该系的信息不会丢失。——有改进

2、插入一个尚无学生的新系的信息。

因为系表与学生表目前是独立的两张表,所以不影响。——有改进

3、数据冗余更加少了。——有改进

结论

由此可见,符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常做到2NF或者1NF。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 首先介绍几个概念: 函数依赖 定义:设X,Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时...
    eliter0609阅读 13,174评论 4 16
  • 数据字典 数据库系统中存放三层结构定义的数据库称为数据字典(DD),对数据库的操作都要通过DD才能实现。DD系统中...
    panda_say阅读 1,088评论 0 6
  • 时光深处2 姥姥是旧时代大家庭里走出来的人,穿衣打扮都带着旧时代的烙印,她的装束永远都是大襟衣服,扣子是盘...
    兰心惠质hy阅读 539评论 1 17
  • 首先,我认同闫红老师对待催婚的态度:“催自己孩子,那是真心实意,催人家的,不过是坐实对方的缺失,在心里反刍自己儿孙...
    小薇子阅读 2,266评论 7 18
  • go语言读取stdin内容代码例子 go程序代码 调用脚本1 运行结果 调用脚本2 运行结果
    CodingCode阅读 3,871评论 0 0