数据库一,二,三范式

一范式

一个关系模式应当是一个五元组:

R(U,D,DOM,F)
  • 关系名为R
  • U为一组属性
  • D为属性组U中的属性所来自的域
  • F为属性组U上的一组数据依赖

第一范式:每一个分量必须为不可分的数据项

二范式

建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号,所在系,系主任,课程名 和 成绩。该关系模型可表示为:

U = { 学号,姓名,系,系主任,课程名,分数 }
F = { 学号->姓名,学号->系,系->系主任,(学号,课名)-> 分数 }
表1.png

但是这个关系模式存在以下问题:

  • 数据冗余
    每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。
  • 更新异常
    由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险,比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。
  • 插入异常
    如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
  • 删除异常
    如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系以及系主任的信息也丢失掉了

因此可以得出一个结论,表1虽然满足第一范式,但它并不是一个好的模式,一个好的模式应当不会发生插入异常,删除异常和更新异常。

第二范式:2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖

  • 函数依赖
    数据依赖是一个关系内部属性与属性之间的一种约束关系,这种约束关系是通过属性间值得相等与否体现出来的数据间相关联系。其中最重要的是函数依赖和多值依赖。

    函数依赖普遍存在,比如描述一个学生的关系,可以有学号,姓名,系名等几个属性,由于一个学号只对应一个学生,一个学生只在一个系学习,所以,当学号确定后,学生的姓名及所在系的值也就被唯一确定,属性间的这种依赖关系类似于数学中的函数y=f(x)。在函数依赖中又有:

    • 完全函数依赖
      在一张表中,若X -> Y,且对于X的任何一个真子集(加入属性组X包含超过一个属性的话),X -> Y不成立,那么我们称为Y对于X的完全函数依赖。


      完全函数依赖.png

      学号 -> 姓名
      (学号,课名)-> 分数

    • 部分函数依赖
      假如Y函数依赖于X,但同时Y并不完全依赖于X,那么就称Y部分函数依赖于X。


      部分函数依赖.png

      (学号,课名)-> 姓名

    • 传递函数依赖
      假如 Z 函数依赖于 Y,且 Y 函数依赖于 X

    传递函数依赖.png

  • 设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K,那么我们称 K 为候选码,简称为码。
    在实际中我们通常可以理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码。一张表中可以有超过一个码。(实际应用中为了方便,通常选择其中的一个码作为主码)

  • 非主属性
    包含在任何一个码中的属性就是主属性。除此之外,就是非主属性。

现在,在回来看2NF,表三是否符合2NF要求,根据2NF定义,判断的依据实际上就是看数据表中是否存在非主属性对于码的部分函数依赖。方法:

第一步:找出数据表中所有的码。
第二步:根据第一步所得到的码,找出所有的主属性。
第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
第四步:查看是否存在非主属性对码的部分函数依赖。

1、表三的码只有一个,就是(学号,课名)。
2、主属性有两个:学号和课名
3、非主属性有四个:姓名,系名,系主任,分数
4、对于 (学号,课名)-> 姓名,有 学号 -> 姓名,存在非主属性 姓名 对 码(学号,课名)的部分函数依赖。
对于 (学号,课名)-> 系名,有 学号 -> 系名,存在非主属性 系名 对 码(学号,课名)的部分函数依赖
对于(学号,课名) -> 系主任,有 学号 -> 系主任,存在非主属性 对 码 (学号,课名)的部分函数依赖

所以,综上分析,该表只满足1NF,而不满足2NF的要求。为了消除部分函数依赖,只有一个办法,将大数据表拆分成两个或多个更小的数据表,这个过程叫做模式分解。模式分解并不唯一,以下是其中一种:

选课表(学号,课名,分数)
学生表(学号,姓名,系名,系主任)
2NF.png
  • 数据冗余
    每一个系的系主任姓名重复出现,重复次数与该系所有学生出现次数相同 - 有改进
  • 更新异常
    某系更换系主任后,必须修改与该系学生有关的每一个元组 - 无改进
  • 插入异常
    如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库 - 无改进
  • 删除异常
    如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系以及系主任的信息也丢失掉了 - 无改进
三范式

第三范式:3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

对于选课表,主码为(学号,课名),主属性为学号和课名,非主属性只有一个,为分数。不可能存在传递函数依赖,所以选课表的设计,符合3NF的要求。

对于学生表,主码为(学号),主属性为学号,非主属性为姓名,系名和系主任。因为 学号 -> 系名,系名 -> 系主任,所以存在非主属性系主任对于码(学号)的传递函数依赖,所以学生表的设计,不符合3NF要求。

进一步模式分解:

选课(学号,课名,分数)
学生(学号,姓名,系名)
系(系名,系主任)
3NF.png
  • 数据冗余
    每一个系的系主任姓名重复出现,重复次数与该系所有学生出现次数相同 - 有改进
  • 更新异常
    某系更换系主任后,必须修改与该系学生有关的每一个元组 - 有改进
  • 插入异常
    如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库 - 有改进
  • 删除异常
    如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系以及系主任的信息也丢失掉了 - 有改进

因此可见,符合3NF要求的数据库设计,基本上解决了数据冗余,插入异常,修改异常,删除异常的问题。

BCNF范式
  • 引例
  1. 某公司有若干个仓库。
  2. 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作。
  3. 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中,每种物品在每个仓库中都有对应的数量。

那么关系模式 仓库(仓库名,管理员,物品名,数量)属于哪一级范式?
已知函数依赖集:
仓库名 -> 管理员,管理员 -> 仓库名,(仓库名,物品名)-> 数量

主属性:仓库名,管理员,物品名
非主属性:数量

因为:不存在非主属性对码的部分函数依赖和传递函数依赖。
所以:此关系模式属于3NF。

基于此关系模式的数据表,可能如图所示:

表2
总结
  • 1NF: 分量是最小的的单元不可再分 。
  • 2NF:满足1NF,表中的字段必须完全依赖于全部主码而非部分主码 (一般我们都会做到)。
  • 3NF:满足2NF,非主码外的所有字段必须互不依赖。
  • 4NF:满足3NF,消除表中的多值依赖。

参考资料
1. https://www.zhihu.com/question/24696366
2. 王珊, 萨师煊. 数据库系统概论[M]. 北京:高等教育出版社,2014

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

推荐阅读更多精彩内容