通俗易懂理解数据库范式

关系型数据库范式(NF)的概念:符合某种级别的关系模型的集合,表示一个关系内部各个属性之间联系的合理化程度。

很难懂对不对?大体上,范式指的是,一张数据表的级别。

一范式(1NF)是基础级别;大家都要有的。概念是:数据库表每一项都是不可再分的项;用一句简单的话说,就是所有的属性都是单一的,你不能一个格里面写俩属性,也没地儿写啊不是。图解:

姓名学号年龄基本信息
奔波儿灞010117团员班长
霸波尔奔010218团员学习委员

这个(姓名,学号,年龄,基本信息)就不符合基础级别(1NF),基本信息是可以再分的,因为数据表中,一格是不能同时写上多个数据的。

二范式(2NF)是建立在一范式的基础上的。概念是数据表的实例或者属性必须被唯一的区分。同样用简单的话说,就是你不能把所有的信息放一块儿吧。总得根据关键信息把表分开吧。不然查起来多麻烦。就像学生信息表,班长拿了一张学生信息表,里面写的电话QQ微信身份证班级学号,再加点和学校有关的差不多就够了。但是学生的信息太多了,兴趣爱好,性格特长,家庭成员,等等等等信息,放在同一张表是不可能的。图解:

学生信息表
姓名学号班级身份证籍贯出生日期性别家庭电话家庭住址兴趣爱好专业社团民族宿舍... ...
孙权01011班0101123东汉末年123东吴十万北伐 木材手工东吴汉族

1号

... ...

 刘备01022班 0102233 蜀 东汉末年男 233 巴蜀 种菜织席 表演 巴蜀 汉族2号 ... ...
 曹操0103 3班 0103155 魏 东汉末年 男 1551 北魏  铜雀台装睡 北魏 汉族3号 ... ...

 我们可以看到这张表已经满足一范式了。他的属性都被分得明明白白的。

不同的信息,他们的身份证号码不同,学号也不同。我们就可以说,身份证和学号是这张表的码。

出生日期,籍贯,这之类的信息,主要是由身份证来区分的。而班级信息基本是靠学号区分。这就是说,如果我想查班级信息,我拿到学号就够了,身份证号码对于我想查的班级信息,并没有必要。我们就称这种表存在不完全依赖。去掉这种不完全依赖的办法,就是以学号,身份证号码,将上面的一大张表,拆成两张,一张以学号作码,一张以身份证做码。这样就去掉了不完全依赖,就符合第二范式了。拆开之后,应该是这样:

个人信息表
身份证家庭住址出生日期民族
0101123东吴东汉末年汉族
0102233巴蜀东汉末年汉族
0103155北魏东汉末年汉族

 

学生信息表
学号姓名班级专业专业老师专业成绩
0101孙权1班木材手工周瑜100分
0102刘备2班表演子龙100分
0103曹操3班装睡杨修100分

 

三范式(3NF)是建立在二范式的基础上的。概念是:一个数据表中不能包含已经在别的表中的非关键信息,属性不依赖其他非主属性。就是说,说,一张表中的所有属性,都由它的码直接决定,不能依靠其他的中间属性,如果有这样的中间属性,那就应该拆分成新的表。我们可以这样理解,上面的学生信息表,专业成绩由专业老师给出。依据学号,是无法直接拿到专业成绩的。如果我们需要满足三范式,就必须将专业,专业老师,专业成绩拆分为一个新的表(专业信息表),原来的学生信息表的信息就能够全部由学号直接决定,这样我们就可以说满足了第三范式。新的表应该长这样:

 

学生信息表
学号姓名班级专业
0101孙权1班木材手工
0102刘备2班表演
0103曹操3班装睡
专业信息表
专业老师
木材手工周瑜
表演子龙
装睡杨修

这时候你要问了,专业成绩怎么看?专业成绩表,这张表是以(学号,专业)作为码,成绩作为非主属性,那么就应该多一张表:

专业成绩表
学号专业成绩
0101木材手工100分
0102表演100分
0103装睡100分

这样的数据关系,才符合第三范式。

BC范式(BCNF)被称为是修正版的第三范式,概念是不能存在非主属性对主键子集依赖。这个我要另外举一个例子,假如有一所学校要统计物理、化学、生物等学科的竞赛证书数量,学校设计了这样的一张表

班级班主任竞赛学科证书数目
1班刘老师物理10
1班刘老师化学15
2班王老师生物20
2班王老师物理10
... ...... ...... ...... ...

这张表的码是(班级,班主任,竞赛学科),非主属性是证书数目。证书数目由(班级,竞赛学科)决定,也可以说是由(班主任,竞赛学科)决定,因为班级和班主任是可以互相推导的。这张表符合1NF元素不可分。符合2NF,因为证书数目由(班级,竞赛学科)决定,但是(班主任,竞赛学科)也能决定。对于3NF,它也是符合的,因为只有一个非主属性,肯定是由码直接决定的啦。那么BCNF的规范是什么呢?就是不能有主属性的互相推导。就是说,如果存在(班级->班主任)(班主任->班级)这种关系,是不符合BCNF的。如果要符合BCNF那就需要将上面的表进行拆分;成为下面这种情况。

班级竞赛学科证书数目
1班物理10
1班化学15
2班生物20
2班物理10
... ...... ...... ...

班级班主任
1班刘老师
2班王老师
... ...... ...

这样就不存在证书数目对于码的子集依赖,符合BCNF。在实际应用中,BCNF应该是数据冗余度比较低的了,实际上我目前在工作中的数据表都是满足第三范式而已,有的数据关系仅仅是满足第二范式。

如有错误,欢迎读者能够批评指正。感谢阅读,期待您的评论。

转载于:https://www.cnblogs.com/manqing321/p/9967109.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值