范式知识点_博客学习

来自: CareySon

为什么要有范式?

简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准化标准,满足高等级的范式的先决条件是满足低等级范式。(比如满足2nf一定满足1nf)

 

应用数据库范式能够带来哪些好处?

 [1] 减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
 [2] 消除异常(插入异常,更新异常,删除异常)
 [3] 让数据组织的更加和谐… 

 

范式类型

可参考:NULL

第一范式:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。 

------- 简单的说,第一范式就是每一个属性都不可再分。不符合第一范式则不能称为关系数据库。

 

第二范式:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF

------- 简单的说,是表中的属性必须完全依赖于全部主键,而不是部分主键.所以只有一个主键的表如果符合第一范式,那一定是第二范式。

 

第三范式:关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z  Y), 使得X→Y,Y→Z,成立,则称R<U,F> ∈ 3NF。

------- 简单的说,第三范式是为了消除数据库中关键字之间的依赖关系。(消除传递依赖!)

(也就是每个非主属性都不传递依赖于候选键,判断传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。)

 

BC范式:设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。

另一定义:符合3NF,并且,主属性不依赖于主属性 (也就是不存在任何字段对任一候选关键字段的传递函数依赖)

 

补充几个概念:

属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。
           在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。

元组:表中的一行就是一个元组。

分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

 

码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码

全码:如果一个码包含了所有的属性,这个码就是全码。

 

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

 

 

 


题外话:

教科书中一般以关系代数的方法来解释数据库范式。这样做虽然能够十分准确的表达数据库范式,但比较抽象,不太直观,不便于理解,更难以记忆。

本文用较为直白的语言介绍范式,旨在便于理解和记忆,这样做可能会出现一些不精确的表述。但对于初学者应该是个不错的入门。

 

我写下这些的目的主要是为了加强记忆,其实我也比较菜,我希望当我对一些概念生疏的时候,回过头来看看自己写的笔记,可以快速地进入状态。

 

在SQL中,取得相同的数据子集可以用不同的思路或不同的SQL语句,因为SQL源于关系数据库理论,而关系数据库理论又源于数学,思考如何构建查询语句时,都可以抽象为两种方法:

[1]关系代数法:

关系代数法的思路是对数据库进行分步操作,最后取得想要的结果.

比如如下语句:

Select Name,Department,Age
From Employee
where Age>20

关系代数的思路描述上面语句为:对表Employee表进行投影(选择列)操作,然后对结果进行筛选,只取得年龄大于20的结果.

 

[2]关系演算法:

 相比较关系代数法而言,关系演算法更多关注的是取得数据所满足的条件. 上面SQL可以用关系演算法被描述为:我想得到所有年龄大于20的员工的姓名,部门和年龄。

 

 

  为什么需要两种方法

 对于简单的查询语句来说,上面两种方法都不需要.用脚就可以想出来了。问题在于很多查询语句都会非常复杂。对于关系演算法来说更多的是关注的是所取出信息所满足的条件,而对于关系代数法来说,更多关注的是如何取出特定的信息.

 

简单的说,关系演算法表示的是”what”,而关系代数法表达的是”how”.   SQL语句中所透漏的思路,有些时候是关系代数法,有些时候是关系演算法,还有些是两种思路的混合.

 

对于某些查询情况,关系代数法可能会更简单,而对于另外一些情况,关系演算法则会显得更直接.还有一些情况.我们需要混合两种思路。所以这两种思维方式在写SQL查询时都是必须的.

 

posted @ 2021-03-03 10:32  bigTreeM  阅读(444)  评论(0编辑  收藏  举报