数据库三大范式

何为范式

    顾名思义,规范的方式。数据库作为底层的存储系统,直接影响业务层的性能,因此,为了能够让开发人员科学规范地使用数据库,三大范式应运而生。本文将以较为简洁的文字并举例描述三大范式。

第一范式(1NF)

    第一范式是指关系表R中的每列都是原子不可分的项,即每个属性都是最基本的数据项。这里用代码举个栗子:

// 员工类
typedef Employee struct {
  Id    string  // 员工id
  Name  string  // 员工姓名
  Age   int     // 员工名字 
  Dept  Department  // 员工所属部门
}

// 部门类
typedef Department struct {
  Id      string  // 部门id
  Name    string  // 部门名字
  Detail  string  // 部门详情
}

    如果我们在数据库中建立一张员工表emp(id, name, age, dept),对于前三个属性都是基本类型,不可再分,而对于第四个属性dept,它在程序中其实对应于结构体,为复合属性,因此,按照第一范式正确的建表方式应该是将复合属性拆分为多个原子不可分的基本属性,即emp(id,name,age,dept_id,dept_name,dept_detail)。

第二范式(2NF)

    第二范式是指在满足第一范式的情况下,关系表R中的所有非主属性都完全依赖于R的每一个候选关键属性。这句话怎么理解呢,这里还是举个栗子:
    假如有一个学生课程表student_course(学号, 姓名, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为只有这两个属性一起才能决定一条记录,即(学号, 课程名称) → (姓名, 成绩, 学分) ,这个关系表便不符合第二范式,因为"姓名"仅依赖于"学号","学分"仅依赖于"课程名",因此,不满足第二范式条件。那么,不满足第二范式会有什么问题呢?如下:

  • 数据冗余
        对于一门课程,如果有n名学生选修,则这门课程的全部信息将会重复存储n-1次,同理,一个学生选修了m门课程,则学生全部信息会重复存储m-1次,导致数据冗余存储。
  • 更新问题
        如果要更新某门课程的学分,那么所有关联这门课程的记录都将更新,否则会出现数据不一致问题。
  • 插入问题
        假如新增一门课程,但是尚未有学生选修,则该门课程的信息无法入库。
  • 删除问题
        假如某门课程对应的记录完全被删除,则将导致这门课程的信息完全丢失。

    那我们可以按照第二范式来改造上述关系表,将表才分成student(学号,姓名),cource(课程名称,学分),student_cource(学号课程名称, 成绩),这样便避免了上述问题。

第三范式(3NF)

    第三范式是指,在满足第二范式的前提下,关系表R中的所有非主属性由主键直接决定,不存在间接依赖关系,简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
    如表emp(id,name,age,dept_id,dept_name,dept_detail),这张表中的员工id能够决定所有非主属性,单我们发现dept_name,dept_detail这两个非主属性也可以由非主属性dept_id决定,而dept_id又依赖于id,因此存在间接传递依赖,不满足第三范式。同时,可以看出,不满足第三范式的问题是存在大量的冗余数据,解决该问题的方式很简单,只需将原关系表拆分为emp(id,name,age, dept_id), dept(dept_id,dept_name, dept_detail),这样不管是对于表emp还是表dept,各自的非主属性都直接依赖于主键,满足第三范式,同时也解决了数据冗余的问题。

小结

    数据库的三大范式是很基础同时也是非常重要的概念,深刻理解后,有利于我们在项目中合理地设计数据关系表,同时也能提高开发效率,降低存储成本等等。

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

推荐阅读更多精彩内容

  • 为准备系统架构设计师所需特别总结关于数据库三大范式的知识: 1NF当关系模式R的所有属性都不能在分解为更基本的数据...
    hash_boy阅读 973评论 0 0
  • 概述 一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,...
    stutterr阅读 25,065评论 6 20
  • 前两天陪S去民政局领证,感触颇深。 听说民政局一向业务繁忙,所以我们特意较早出发。出门后,天空一直下着小雨,想着可...
    绿希阅读 268评论 0 0
  • 福德可以传代,家风需要传承。大年初一,《千字文》圆满结束!一同来学习经典诵读《千字文》最后一讲,品味传统文化的力量...
    萃辰天心书院阅读 1,333评论 0 0
  • 初心 不惊不扰过一生 各自为家,彼此心灵慰籍, 各自生活,尽职尽责,但又因为有彼此,而让生活更加丰富多彩,心中都有...
    金星人_丫头阅读 165评论 0 0