范式判定及修改
来源:互联网 发布:网络交友弊大于利论点 编辑:程序博客网 时间:2024/06/05 17:05
三范式判断及修改
第一范式(1NF)无重复的列
在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
举例1:
一张学生表Student(stuNo,stuName,age,age,sex)是不符合第一范式的,因为有重复列age属性。去除重复列age以后的Student(stuNo,stuName,age,sex)是符合第一范式的。
第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是属性完全依赖于主键。
这里说的主关键字可能不只有一个,有些情况下是存在联合主键的,就是主键有多个属性。
举例2:
以学生选课为例,每个学生都可以选课,并且有这一门课程的成绩,那么如果将这些信息都放在一张表StuGrade(stuNo,stuName,age,sex,courseNo,courseName,credit,score)。
如果不仔细看,我们会以为这张表的主键是stuNo,但是当我们看到最后一个score属性以后,在想想如果没有课程信息,那么哪里有学生成绩信息呢。所以这张表的主键是一个联合主键(stuNo,corseNo),这个联合属性能够唯一确定score属性。那么再看其他信息,比如stuName只需要stuNo就能够唯一确定,courseName只需要courseNo就能够唯一确定,因此这样就存在了部分依赖,不符合第二范式。如果要让学生课程成绩信息满足第二范式,那么久需要将这张表拆分成多张表,一张学生表Studnet(stuNo,stuName,age,sex),一张课程表Course(courseNo,courseName,credit),还有最后一张学生课程成绩表StuGrade(stuNo,courseNo,score)。
第三范式(3NF)属性不依赖于其它非主属性 [ 消除传递依赖 ]
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。举例3:
每一个员工都有一个所属部门,假如有一个员工信息表Employee(emp_id,emp_name,emp_age,dept_id,dept_name,dept_info)。
这张员工信息表的主键是emp_id,因为这个属性能够唯一确定其他所有属性,比如知道员工编号emp_id以后,肯定能够知道员工姓名,所属部门编号,部门名称和部门介绍。所以这里dept_id不是主属性,而是非主属性。但是,我们又可以发现dept_name,dept_info这两个属性也可以由dept_id这个非主属性决定,即dept_name依赖dept_id,而dept_id依赖emp_id,这样就存在了传递依赖。而且我们可以看出传递依赖的一个明显缺点就是数据冗余非常严重。
那么如何解决传递依赖问题,其实非常简单,我们只需要将dept_name,dept_info这连个属性删除就可以了,即Employee(emp_id,emp_name,emp_age,dept_id),然后再创建一个部门表Dept(dept_id,dept_name,dept_info)。
这样如果要搜索某一个员工的部门信息dept_info,可以通过数据库连接来实现,查询语句如下:
select e.emp_id,e.emp_name,d.dept_name from Employee e,Dept d where e.dept_id=d.dept_id
注意点:
- 数据库连接会带来一部分的性能损失
- 并不是数据库范式越高越高
- 有时会在数据冗余与范式之间做出权衡,在实际的数据库开发过程中,往往会允许一部分的数据冗余来减少数据库连接。
- 范式判定及修改
- 函数依赖及范式
- 数据库的范式及反范式
- 数据库的范式及反范式
- 数据库三范式及反范式设计
- 理解数据库范式【转载+修改】
- 理解数据库范式【转载+修改】
- 数据库范式及函数依赖
- ORACLE数据依赖及范式
- 函数依赖及数据库范式
- 数据库范式基本概念及理解
- 数据库设计范式及原则
- 三范式 及 数据库模型
- android 网址判定正则表达式修改
- 对数据库三大范式及BC范式的理解
- 利用真值表法求主合取范式及主析取范式的实现
- 合取范式的可满足性判定算法和谓词逻辑不可判定性
- opg文法判定及分析器的构造
- 谈一谈Java中的Error和Exception
- 编程检验ASCLL码值与字符的关系
- 欢迎使用CSDN-markdown编辑器
- linux命令(data,tar)
- JUnit 单元测试报错 initializationerror [Runner:JUnit 4]
- 范式判定及修改
- IntelliJ IDEA mac下激活
- 网络基本功(二):细说交换机
- 数据库编码查看及配置方式
- js点击文本框弹出可选择checkbox
- 线性表存储方法
- 第七周 项目3
- python set集合(数据结构)
- 10.15周日