数据库的规范化(上一篇博客有写到)的程度不同,便有了这么多种范式。数据库范式是数据库设计必不可少的知识,没有对范式的理解,就无法设计出高效率、优雅的数据库,甚至设计出错误误的数据库。课本中的定义比较抽象,不太直观,也不易理解,记是肯定记不住的。

关系数据库

常用范式

关系数据库知道了,再来理解范式。范式是关系数据库关系模式规范化的标准,从规范化的宽松到严格,分为不同的范式,通常使用的有第一范式。第二范式、第三范式及BC范式。范式是建立在函数依赖基础上的。

函数依赖

如果一个表中某一个字段Y的值是由另外一个字段或一组字段X的值来确定的,就称为Y函数依赖于X。

函数依赖

定义

设X,Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时,则它们的Y属性值也相同,则称X函数决定Y,或Y函数依赖于X。
3.平凡函数依赖
当关系中属性集合Y是属性集合X的子集时(Y⊆X),存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。
4.非平凡函数依赖
当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,则称这种函数依赖为非平凡函数依赖。
5.完全函数依赖
设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
6.部分函数依赖
设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
7.传递函数依赖
设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

属性关系

属性之间有三种关系,但并不是每一种关系都存在函数依赖。设R(U)是属性集U上的关系模式,X、Y是U的子集:
● 如果X和Y之间是1:1关系(一对一关系),如学校和校长之间就是1:1关系,则存在函数依赖X → Y和Y →X。
● 如果X和Y之间是1:n关系(一对多关系),如年龄和姓名之间就是1:n关系,则存在函数依赖Y → X。
●如果X和Y之间是m:n关系(多对多关系),如学生和课程之间就是m:n关系,则X和Y之间不存在函数依赖。

案例分析

编辑

例: Student(Sno, Sname, Ssex, Sage, Sdept)

假设不允许重名,则有:

Sno → Ssex, Sno → Sage , Sno → Sdept,

Sno ←→ Sname, Sname → Ssex, Sname → Sage

Sname → Sdept

但Ssex -\→ Sage

若 X → Y,并且 Y → X, 则记为 X ←→ Y。

若 Y 不函数依赖于 X, 则记为 X -\→ Y。

在关系模式R(U)中,对于U的子集X和Y,

1.如果 X → Y,但 Y 不为 X 的子集,则称 X → Y 是非平凡的函数依赖

例:在关系SC(Sno, Cno, Grade)中,

非平凡函数依赖: (Sno, Cno) → Grade。

2.若 X → Y,但 Y 为 X 的子集, 则称 X → Y 是平凡的函数依赖

平凡函数依赖: (Sno, Cno) → Sno ,(Sno, Cno) → Cno。

3.若 x → y 并且,存在 x 的真子集 x1,使得 x1 → y, 则 y 部分依赖于 x。

例:学生表(学号,姓名,性别,班级,年龄)关系中,

部分函数依赖:(学号,姓名)→ 性别,学号 → 性别,所以(学号,姓名)→ 性别 是部分函数依赖。

4.若 x → y 并且,对于 x 的任何一个真子集 x1,都不存在 x1 → y 则称y完全依赖于x。

例:成绩表(学号,课程号,成绩)关系中,

完全函数依赖:(学号,课程号)→ 成绩,学号 -\→ 成绩,课程号 -\→ 成绩,所以(学号,课程号)→ 成绩 是完全函数依赖。

5.若x → y并且y → z,而y -\→ x,则有x → z,称这种函数依赖为传递函数依赖。

例:关系S1(学号,系名,系主任),

学号 → 系名,系名 → 系主任,并且系名 -\→ 学号,系主任 -\→ 系名,所以学号 → 系主任为传递函数依赖。

具体的函数依赖应该是通过理解数据项和该企业的内部规则来决定的(不同企业间有差异),根据表的内容得出的函数依赖可能是不正确的。

范式间的关系

关系数据库有六种,一、二、三、四、五和BC。满足最低要求的范式是第一范式。在第一范式的基础上进一步满足更多要求的称为第二范式,其余范式以此类推。一般情况的数据库只需满足第三范式即可。

1NF

如果关系模式R是第一范式的模式,那么,R的每一个关系r的属性都是原子项,不可分割。
1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不能称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上进行的。

2NF

如果关系模式R是1NF,且每一个非主属性完全依赖于候选建,那么就称R是第二范式。
第二范式要满足的条件:首先要满足第一范式,其次每一个非主属性要完全函数依赖于候选键,或者是主键。也就是说,每个非主属性是由整个主键函数决定的,而不能有主键的一部分来决定。
第二范式(2NF):符合1NF,并且,非主属性完全依赖于码。(一个候选码中的主属性也可能是好几个。如果一个主属性,它不能单独做为一个候选码,那么它也不能确定任何一个非主属性。
什么样的实例不符合第二范式?
举一个教务管理系统的例子。
学生上课指定一个老师,一本教材,一个教室,一个时间,学生去上课,怎么设计数据库?
有如下关系成立:
(学生,课程)——>教室;
(学生,课程)——>老师;
(学生,课程)——>老师职称;
(学生,课程)——>教材;

(学生,课程)——>上课时间;

可以得出(学生,课程)是一个码。
又:课程——>教材;
  • (学生,课程)是一个码,课程却决定了教材,这就叫做不完全依赖,或者说部分依赖。

出现了这种情况,就不满足第二范式了。

解决办法:分解。进行投影分解:

3NF

如果关系模式R是2NF,且关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式。
第三范式(3NF);符合2NF,并且,消除传递依赖。
上图中符合2NF ,但存在传递依赖(老师——>老师职称。一个老师一定能确定一个老师职称)。
解决办法:分解。投影分解:

其他范式

第四范式:要求把同一表内的多对多关系删除。
第五范式:从最终结构重新建立原始结构。
BC范式(BCNF):符合3NF,并且,主属性不依赖于主属性。若关系模式R属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。

数据库的范式,第一、二、三、四、五范式、BC范式的更多相关文章

  1. 6月29-7月5日成都uber优步司机第一/二/三组奖励政策明细

    成都优步司机第一/二/三组奖励更新了,在写下文之前,我先吐槽一下:靠优步uber发财致富已成往事. 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全 ...

  2. 使用MongoDB数据库(1)(三十五)

    MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有 ...

  3. 第一百三十五节,JavaScript,封装库--拖拽

    JavaScript,封装库--拖拽 封装库新增1个拖拽方法 /** tuo_zhuai()方法,将一个弹窗元素实现拖拽功能 * 注意:一般需要在css文件将元素里的某一个区块光标设置成提示可以拖拽, ...

  4. 第三百二十四节,web爬虫,scrapy模块介绍与使用

    第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...

  5. C语言探索之旅】 第一部分第四课第三章:变量的世界之显示变量内容

    内容简介 1.课程大纲 2.第一部分第四课第三章:变量的世界之显示变量内容 3.第一部分第五课预告:基本运算 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用 ...

  6. 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader

    最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...

  7. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  8. 第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)

    第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数 ...

  9. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 一、利用Python编写飞机大战游戏-面向对象设计思想

    相信大家看到过网上很多关于飞机大战的项目,但是对其中的模块方法,以及使用和游戏工作原理都不了解,看的也是一脸懵逼,根本看不下去.下面我做个详细讲解,在做此游戏需要用到pygame模块,所以这一章先进行 ...

  2. POJ 3579 Median 【二分答案】

    <题目链接> 题目大意: 给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数. 解题分析: 由于本题n达到了1e5,所以将这些数之间 ...

  3. nginx那些事儿

    一.mac上安装nginx brew install nginx # 核心安装目录,启动文件在该目录的bin下面,欢迎页面在html下面. /usr/local/Cellar/nginx/1.12.2 ...

  4. VMware5.5-虚拟机的迁移和资源分配

    虚拟机的迁移 迁移:将虚拟机从一台主机(或数据存储)移到另一台主机(或数据存储). 迁移类型: 冷迁移 迁移处于关闭状态的虚拟机. 挂起 迁移处于挂起状态的虚拟机. vMotion 迁移处于开启状态的 ...

  5. mongodb副本集与分片结合

    1.在三个不同服务器上,分别建立副本集: 202服务器: 192.8.123.202:27017 replSet = r202 192.8.123.202:27018 replSet = r202 1 ...

  6. CQD(陈丹琦)分治 & 整体二分——专题小结

    整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:       整体二分是个很神的东西 ...

  7. redis(五)

    发布订阅 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的 ...

  8. yii2 动态配置日志(log)

    如果我们在项目中不允许修改配置文件中的 log 组件,那么动态配置 log 就变得很重要了,下面我分享一下动态配置 log 的方法: 默认的日志格式是 {date}{ip}{userID}{sessi ...

  9. Python Mongodb接口

    Python Mongodb接口 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. 同时,MongoDB 是一个介于关系 ...

  10. 命令和python模式转换

    安装完paython成功之后,就必须了解一下:命令模式和python交互模式 1.我们输入  cmd  之后进入的运行环境就是命令模式 2.在命令模式下输入  python,看到>>> ...