即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

数据库之之范式(最通俗易懂)

编程语言 karry_zzj 17℃ 0评论
本文目录
[隐藏]

学习了两天的范式,刚开始是真的迷迷糊糊,然后不断查阅博客,对比学习,终于搞懂了,现在自我整理一下,觉得是最通俗易懂的了2333。

1.术语描述:

  • 实体:客观存在并可相互区别的事物称为实体。比如具体的人、物,也可以是抽象的概念或联系,如一个职工、学生、部门、学生的一次选课、部门的一次订货、教师与院系的工作关系等等。

  • 属性:实体所具有的某一特性。属性是一个逻辑概念,比如说“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。

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

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

  • :唯一标识实体的属性集称为码。例如学号就是学生实体的码。

  • 候选码:候选码就是可以区别一个元组(即表中的一行数据)的属性或属性的集合。

  • 全码:整个属性组是码。

  • 主属性:包含在任何一个候选码中的属性称为主属性。

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

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

  • 函数依赖:在一个表中,不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X


    比如:

Sno Sdept Mname
S1 计算机系 张三
S1 自动化系 张三
S2 计算机系 张三

这个表就是错误的表,在这个表中存在两个元组在Sno上的属性值相等即S1,然后在Sdept上的属性值不等,一个为 “计算机系”,一个为 “自动化系”。

  • 完全依赖:在一个元组中,如果X→Y,并且对于X的任何一个真子集X’,都有X’ !→(不依赖)Y, 则称Y对X完全依赖。

  • 部分依赖:若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。

之前不理解候选码,但是查阅了网上大佬(百度知道ID:xiaohuiq8)的回答:


比如学生表student(id,name,age,sex,deptno),其中的id是可以唯一标识一个元组的,所以id是可以作为候选码的,既然id都可以做候选码了,那么id和name这两个属性的组合可不可以唯一区别一个元组呢?显然是可以的,此时的id可以成为码,id和name的组合也可以成为码但是id和name的组合不能称之为候选码,因为即使去掉name属性,剩下的id属性也完全可以唯一标识一个元组,就是说,候选码中的所有属性都是必须的,缺少了任何一个属性,就不能唯一标识一个元组了,给候选码下一个精确的定义就是:可以唯一标识一个元组的最少的属性集合。而码是没有最少属性这个要求的。另外,一个表的候选码可能有多个,从这些个候选码中选择一个做为主码,至于选择哪一个候选码,这个是无所谓的,只要是从候选码中选的就行。


2.第一范式(1NF)

  • 条件:属性不可分。即数据库表中的字段都是单一属性的,不可再分。

  • 举反例:


    比如一个表里有电话号码这一属性,然而这一属性下还有个人号码公司号码这两个属性,所以这就不符合第一范式的条件。


3.第二范式(2NF)

  • 条件:首先符合1NF,而且每一个非主属性完全依赖于任何一个候选码。这里我刚开始学的时候真的很迷糊啊!但是对应上面的“术语描述”来看,就不那么难理解了。非主属性就是除候选码之外的属性,它们都要完全依赖任何一个候选码。直接看下面的反例,我会好好解释是什么意思的。

  • 举反例:


    把下面所有这些信息放到一个表中:学号,学生姓名、年龄、性别、课程名称、课程学分、系别、成绩。


    可见(学号,课程名称)为候选码,因为两者缺一不可,缺一个都无法唯一标识一个元组。


    那么就存在这样的依赖关系:(学号, 课程名称) → (姓名,年龄,成绩,学分,系别)


    我们知道:(成绩)是完全依赖于(学号,课程名称)的,这是因为一旦缺少了学号或者课程名称,都是无法确定具体的成绩的


    然而(学分)和(姓名,年龄,系别)都是部分依赖于(学号,课程名称)的,因为虽然(学号,课程名称)→(姓名,年龄,学分,系别),但是对于候选码(学号,课程名称)中任何一个真子集即(学号)是能确定(姓名,年龄,系别)的,(课程名称)是能确定(学分)的,所以(姓名,年龄,学分,系别)不完全依赖于(学号,课程名称)。

  • 存在问题:


    1.插入异常。假如要插入一个学生信息,然而这个学生还没有选课,那么就无法插入。


    2.删除异常:假如一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。


    3.修改复杂:假如要调整某门课程的学分,数据表中所有行的”学分”值都要更新,否则会出现同一门课程学分不同的情况。

  • 解决方案:


    将上面的表分成三个表:


    1.Student表(学号,学生姓名,年龄,性别,系别)。2.Course表(课程名称,课程学分)。3.SC表(学号,课程名称,成绩)。这样就可以了。


4.第三范式(3NF)

  • 条件:在1NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。更迷糊了是吧,直接看反例吧!

  • 举反例:


    把下面所有这些学生信息放到一个表中:学号,姓名,年龄,性别,系名,系办地址、系办电话。


    可见(学号)是候选码且是主码。


    那么就存在这样一个依赖关系:(学号)→ (姓名,年龄,性别,系名,系办地址,系办电话)。然而有存在着这样的一个依赖关系(系别)→(系办地址,系办电话),这样就不符合3NF的条件:任何非主属性不依赖于其它非主属性,所以它不是第三范式。

  • 存在问题:


    修改复杂。一旦修改了系名,那么系办单位和系办单位都得修改。

  • 解决方法:


    将这个表分为两个表:


    1.Student表(学号,姓名,年龄,性别,系名)。2.系表(系名,系办地址、系办电话)。这样就可以了。

转载请注明:CodingBlog » 数据库之之范式(最通俗易懂)

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情