数据库中的范式和多值依赖
数据库中的函数依赖,主码,候选码等的区别:点击打开链接
数据库中的范式:分为,1NF,2NF,3NF,BCNF,4NF。一般我们,我们设计数据库到第三范式就算完整的了。它们的关系如下:
第一范式:定义很多,其实说的就是列不可分。
如:
出厂日期 | 总额 | |
| 数量 | 单价 |
第二范式定义:若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。意思是非主属性完全依赖于码(候选码,主码),这里需要注意一下,是非主属性(候选码之外的属性),在前一篇文章已经说过。
如:
(学号, 系名, 课程号, 成绩) ∈1NF
(学号, 系名, 课程号, 成绩)不属于 2NF
在该关系模式中,学号+课程号是码,其他属性都是非主属性,但是只有成绩完全依赖于码,系名是部分依赖,因为学号就可以推出学生所在的系了。
第三范式定义:它的定义。。不打了,太烦了。其实说的就是消除 传递依
赖。每一个非主属性都要直接依赖于码,不能传递依赖于码。如:在一个
学生表中,我们规定一个系的学生是住在同一个宿舍区域的,于是,该关
系模型为:
学生表(学号, 系名, 宿舍区)
在这关系中,学号为码,学号——>系名,学号——>宿舍区,但是,系名也能推出宿舍区,变成 学号——>系名——>宿舍区,即宿舍区传递依赖于学好了。
解决方法:拆分成两个表:
1(学号,系名),2(系名,宿舍区)
从上面我们可以看到,在两个表中我们可以看到,当两个表通过外键(1表的系名,2中系名为主健)关联后,另一个表的的信息(如2表中的宿舍区)不能再写到包含外键关系的表中(1表)。
BC范式:前面的三个范式是针对非主属性的,BC范式则是针对于码(什么是码,前篇文章说过),它要求每个函数的依赖关系中其决定因素都要包含码。
如:
多值依赖定义:第四范式需要掌握的一个内容。它说的就是设R(U)是一个属性集U上的一个关系模式, X、 Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关(想不到好的方法把它概括起来,哎!)
判定方法:对于任意关系中,如果存在两个元组(就是行),记为A,B,如果他们的某一属性X的值相等,那么我们交换它们另外的属性Y的值后,得到的新的两个元组,在表中是可以在原来的表中找到与它们相匹配的元组的。
如:
平凡多值依赖和非平凡的多值依赖:
若X→→Y,而Z=φ,则称X→→Y为平凡的多值依赖否则称X→→Y为非平凡的多值依赖。
多值依赖与函数依赖的区别:
1)若函数依赖X→Y在R(U)上成立,则对于任何Y' 属于Y均有X→Y' 成立
2)多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y' 属于Y有X→→Y' 成立,因为多值依赖中,其实就是一对一组,一个老师可能交多门课,所以不同老师可能有教相同的课,所以不能推出X→→Y' 成立。我们可以看出,如果把一组改为一个,实际上就是函数依赖,所以所函数依赖是多值依赖的特例,多值依赖不一定是函数依赖,但函数依赖一定是多值依赖。
多值依赖性质:
(1)多值依赖具有对称性
若X→→Y,则X→→Z,其中Z=U-X-Y
(2)多值依赖具有传递性
若X→→Y,Y→→Z, 则X→→Z –Y
(3)函数依赖是多值依赖的特殊情况。
若X→Y,则X→→Y。
(4)若X→→Y,X→→Z,则X→→YU Z。
(5)若X→→Y,X→→Z,则X→→Y∩Z。
(6)若X→→Y,X→→Z,则X→→Y-Z,X→→Z -Y。2)允许的非平凡多值依赖是函数依赖
像,我们上面的图表(C,T,B),如果改成属于第四范式,就要分为:
CT(C, T) ∈ 4NF
CB(C, B) ∈ 4NF
其中, C→→T, C→→B是平凡多值依赖。
总结:
目的:尽量消除插入、删除异常,修改复杂,数据冗余
推荐阅读
-
ASP 包含文件中的路径问题和使用单一数据库连接文件的解决方案
-
Oracle、mysql和sqlserver数据库中对于事务的不同理解
-
Oracle中 关于数据库存储过程和存储函数的使用
-
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
-
Oracle数据库中 call 和 exec的区别
-
事务和锁--查看数据库中的锁
-
php中存储用户ID和密码到mysql数据库的方法
-
insert和select结合实现"插入某字段在数据库中的最大值+1"的方法
-
python中连接三大主流数据库mysql,mongodb和redis的操作教程
-
SQL数据库基础知识、SQL中的数据类型、数据表管理、SQL中运算符和注释