数据库设计三范式

数据库设计三范式

定义

  • 按照《数据库系统概论》中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。简单来说,范式就是一张数据表中符合某种设计标准的级别。打个比方:电器的能耗级别有1级,2级,3级等等。符合高一级范式的设计,必定符合低一级范式。
    ji

第一范式

  • 符合1NF的关系中的每个属性都不可再分。
  • 不符合第一范式的例子:
    学号 姓名 联系方式
    001 张三 zhangsan001@aa.com,15331231
    002 李四 lisi002@aa.com,1231313
    表1
    • 联系方式这个属性包含了邮箱和电话号码,是可以拆分开的
  • 如果我们要设计上面的数据表,应该是如下的形式
    学号 姓名 邮箱 电话号码
    001 张三 zhangsan001@aa.com 15331231
    002 李四 lisi002@aa.com 1231313
    表2
  • 1NF设计可能存在的问题:
    • 数据冗余过大
    • 插入异常
    • 修改异常
    • 删除异常
  • 例如下面的这个数据表
    学号 姓名 系名 系主任 课程名称 分数
    11001 张三 计算机 王五 数据结构 90
    11001 张三 计算机 王五 C语言 80
    11001 张三 计算机 王五 操作系统 90
    12002 李四 经济 赵六 高等数学 80
    12002 李四 经济 赵六 大学英语 90
    12002 李四 经济 赵六 微观经济学 85
    表3
  • 这个数据表存在几个问题:
    • 数据冗余过大
      • 每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次
    • 插入异常
      • 假如学校新开了一个系,但是暂时还没有招收任何学生,那么是无法存储系名与系主任信息的
    • 删除异常
      • 假如某个系中所有学生的记录都删除,那么系与系主任的数据也随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)
    • 修改异常
      • 假如某个学生转系了,那么需要修改多条记录中系与系主任的数据来保证数据库的一致性

第2范式

  • 因为仅仅符合1NF范式的数据表设计中存在问题,所以我们需要提高标准,去掉导致上述问题的因素,使其符合更高一级的范式。
  • 2NF在1NF的基础之上,消除了非主属性对于的部分函数依赖

几个定义

函数依赖

  • 若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。也就是说,在一张数据表中,不存在任意两条记录,它们在X属性(或属性组)上的值相同,而在Y属性上的值不同。
  • 例如,对于表3中的数据,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名
    但是反过来,因为可能出现同名的学生,所以有可能不同的两条学生记录,它们在姓名上的值相同,但对应的学号不同,所以我们不能说学号函数依赖于姓名。
  • 表中其他的函数依赖关系还有如:
    • 系名 → 系主任
    • 学号 → 系主任
    • (学号,课名) → 分数
完全函数依赖
  • 在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ' → Y 不成立,那么我们称 Y 对于 X 完全函数依赖
  • 例如 (学号,课名) → 分数
部分函数依赖
  • 假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X
  • 例如(学号,课名) P→ 姓名
传递函数依赖
  • 假如 Z 函数依赖于 Y,且 Y 函数依赖于 X,那么就称 Z 传递函数依赖于 X

  • 设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K),那么我们称 K 为候选码,简称为码。
  • 可以理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码。一张表中可以有超过一个码。(实际应用中为了方便,通常选择其中的一个码作为主码(主键))
  • 例如:
    对于表3,(学号、课名)这个属性组就是码。该表中有且仅有这一个码。(假设所有课没有重名的情况)
  • 回过头来看表3的设计。 根据2NF的定义,判断的依据实际上就是看数据表中是否存在非主属性对于码的部分函数依赖。若存在,则数据表最高只符合1NF的要求,若不存在,则符合2NF的要求。判断的方法是:

    • 第一步:找出数据表中所有的
      • 表3的码只有一个: (学号、课名)
    • 第二步:根据第一步所得到的码,找出所有的主属性
      • 主属性有两个: 1. 学号 2.课名
    • 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
      • 非主属性有四个:姓名、系名、系主任、分数
    • 第四步:查看是否存在非主属性对码的部分函数依赖
      • 对于(学号,课名) → 姓名,有 学号 → 姓名,存在非主属性 姓名 对码(学号,课名)的部分函数依赖。
      • 对于(学号,课名) → 系名,有 学号 → 系名,存在非主属性 系名 对码(学号,课名)的部分函数依赖。
      • 对于(学号,课名) → 系主任,有 学号 → 系主任,存在非主属性 对码(学号,课名)的部分函数依赖。
  • 如何消除这些部分函数依赖?

    • 可以通过将大数据表拆分成两个或者更多个更小的数据表
    • 例如将表3拆分为课程表(学号,课名,分数)与学生表(学号,姓名,系名,系主任)
    • 课程表
      学号 课程名称 分数
      11001 数据结构 90
      11001 C语言 80
      11001 操作系统 90
      12002 高等数学 80
      12002 大学英语 90
      12002 微观经济学 85
    • 学生表
      学号 | 姓名 | 系名 | 系主任 |
      ---|---| ---| ---| ---| ---|
      11001 | 张三 | 计算机 | 王五 |
      12002 | 李四 | 经济 | 赵六 |
      表4
  • 这样的改进是否有效?

    • 数据冗余过大
      • 学生的姓名、系名与系主任,不再像之前一样重复那么多次了 --- 有改进
    • 插入异常
      • 因为学生表的码是学号,不能为空,所以无法操作 --- 无改进
    • 删除异常
      • 假如某个系中所有学生的记录都删除,那么系与系主任的数据也随之消失了 --- 无改进
    • 修改异常
      • 假如某个学生转系了,只需要修改这名学生对应的系名即可 --- 有改进
  • 仅仅符合2NF的要求,很多情况下还是不够的,而出现问题的原因,在于仍然存在非主属性系主任对于 码 学号的传递函数依赖。

第三范式(3NF)

  • 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
  • 在表4的课程表中,主码为(学号,课名),主属性为学号课名,非主属性只有一个分数,不可能存在传递函数依赖,所以选课表的设计,符合3NF的要求。
  • 在表4的学生表中,主码为学号,主属性为学号,非主属性为姓名名和系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖。
  • 知道了为什么会有传递函数依赖,那我们就可以通过拆分数据表来解决这个问题:
    • 课程表
      学号 课程名称 分数
      11001 数据结构 90
      11001 C语言 80
      11001 操作系统 90
      12002 高等数学 80
      12002 大学英语 90
      12002 微观经济学 85
    • 学生表
      学号 | 姓名 | 系名 |
      ---|---| ---| ---| ---|
      11001 | 张三 | 计算机 |
      12002 | 李四 | 经济 |

    • 系名 | 系主任 |
      ---| ---| ---|
      计算机 | 王五 |
      经济 | 赵六 |
  • 这样的改进是否有效?
    • 数据冗余过大
      • 数据冗余更少了 --- 有改进
    • 插入异常
      • 因为系表与学生表目前是独立的两张表,所以不影响 --- 有改进
    • 删除异常
      • 信息不会丢失 --- 有改进
    • 修改异常
      • 同2NF

结论

符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。在实际中,为了应对业务中的需要,往往不会严格地遵循3NF范式,具体的使用场景还是要具体来分析。

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

推荐阅读更多精彩内容

  • 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次...
    海边的蜗牛ng阅读 2,161评论 0 2
  • 关系型数据库设计时为确保数据存储规范化,通常需要按照范式设计数据,接下来主要介绍下1NF-3NF递进式数据库设计,...
    稻草人_d41b阅读 17,430评论 2 10
  • 数据库范式 范式的级别设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同...
    南乡清水阅读 2,922评论 1 6
  • 一、感恩巴学园的老师们放假后还在继续坚持学习; 二、感恩锦园长今天下午去北京,上午还能够坚持来巴学园开会; 三、感...
    园桃阅读 104评论 0 0
  • 说在前面:Gradle中project是非常重要的,所以也会有非常多的API及其可配置的属性,笔者也有许多不了解的...
    ywy_袁滚滚阅读 19,711评论 2 29