A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-zhangping 中级黑马   /  2012-11-5 21:12  /  1453 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数据库设计的3大范式是什么?

3 个回复

倒序浏览
1 第一范式(1NF)
      在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
      所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多 个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实 体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也 不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
2 第二范式(2NF)
      第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF) 必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实 例的惟一标识。如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性 列被称为主关键字或主键、主码。
      第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主 关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要 为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
3 第三范式(3NF)
      满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求 一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等 信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第 三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
数据库设计的三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式。

2.第二范式
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

第三范式
第三范式在第二范式的基础上更进一层。第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 吴愿涛 于 2012-11-5 22:18 编辑

    第一范式:

     这个范式,只要是关系数据库,所设计的数据表都是满足第一范式的,因为关系数据库中不允许不是第一范式的情况:

    举个例子:
      

Field1

Field2

Field3

Field4

Field5

Field6


    这个就是第一范式,数据表里的每个字段都是不可再分的,单一的属性!




Field1

Field2

Field3

Field4

Field5

Field6



Field3-1

Field3-2

Field4-1

Field4-2




这个则是不符合第一范式的定义的,因为它的field3又分了两个字段,field4又分了两个字段!


还有一种情况就是


Field1

Field2+field3

Field4

Field5

Field6

其中field2和field3是可以再分的,所以这也不符合第一范式的要求!


第二范式

数据表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖是关键字中的某几个字段组合能决定出其它的非关键的字段),即所有非关键字段完全依赖于任何一组候选关键字

比如:选课关系表中存在SelectedCourse(学号,年龄,性别,姓名,课程号,成绩,学分),关键字为学号和课程号,存在如下的关系:
(学号,课程号)决定(年龄,性别,姓名,成绩,学分)

但其中存在着这样的问题
关键字中的某一部分还是可以决定出其它的非关键字段
如:学号  决定   年龄,性别,姓名

  课程号 决定   成绩,学分

这样就不满足第二范式的定义了,存在了非关键字段依赖于部分关键字段

不符合这2NF的数据表,会存在这些问题:
1、数据冗余
  同一门课由n个学生选修,则学分会多出现n-1次,而如果一个学生选m门课,则会多出现m-1次年龄性别姓名等。
2、更新异常:
  若调整了某门课的学分 ,数据表里的这门课的学分都要更新!
3、插入异常:
  若要插入一课,但无人选修,由于没有“学号”所以也无法插入学分
4、删除异常:

  假如有的学生已经完成了课程的选修,要删除时,则会将成绩与学分同时删除掉!

第三范式

在二范式的基础上,不存在非关键字段对关键字段的传递函数依赖,所谓传递函数依赖指的是"A->B->C"的决定关系,则C依赖于A,因此,满足三范式的数据表不应该存在如下的关系,

关键字段->非关键字段X->非关键字段Y
假如说是学生关系表(学号,姓名,年龄,学院,学院地址,学院电话),关键字为“学号”,因为存在如下的关系
学号->姓名,年龄,学院,学院地址,学院电话

这个是符合二范式的,但不符合三范式,因为

学号->学院->学院地址,学院电话

即非关键字段(学院地址,学院电话)存在对学号关键字段的传递函数依赖
将学生关系表分为两个表

(学号 ,姓名,年龄,学院)
(学院,学院地址,学院电话)

这样就符合第三范式了!

鲍依斯-科德范式(BCNF)

在第三范式的基础上,数据表中任何字段不存在对任一候选关键字段的传送函数依赖,

假如说是仓库管理关系表StoreManager(仓库ID,存储物品ID,管理者ID,数量)且有一个管理员只在一个仓库工作,一个仓库可以存放多个物品,关系如下:

仓库ID,存储物品ID->管理者ID,数量

管理者ID,存储物品ID->仓库ID,数量

(仓库ID,存储物品ID)和(管理者ID,存储物品ID)都是StoreManager的候选关键字,表中的唯一的非关键字为数量,它是符合三范式的,但存在如下的问题

仓库ID-》管理员ID
管理员ID-》仓库ID

即关键字存在决定关键字的情况,所以不符合BCNF

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马