关系模式的范式例题_聊一下数据库范式,MySQL中如何避免数据冗余?

范式

第一范式

字段不可分

定义:如果关系R中所有属性的值域都是单纯域,那么关系模式R是第一范式的。

那么符合第一模式的特点就有

  1. 有主关键字
  2. 主键不能为空
  3. 主键不能重复
  4. 字段不可以再分

例如:

fb6ff98dedd466aa583023aadd519257.png

以上的表就不符合第一范式:主键重复(实际中数据库不允许重复的),而且Contact字段可以再分

所以变更为正确的是

97be4adec7b47942080f77788bbdc6fe.png

第二范式

不能有(一个或多个)非主键列部分依赖于主键的情况

定义:如果关系模式R是第一范式的,而且关系中每一个非主属性不部分依赖于主键,称R是第二范式的。

所以第二范式的主要任务就是:满足第一范式的前提下,消除部分函数依赖。

5c5aa543cf4ad3b2bb4a4f29e875bcf4.png

这个表完全满足于第一范式,主键由StudyNo和ClassNo组成,这样才能定位到指定行。但是,ClassAddress部分依赖于关键字( ClassNo → ClassAddress ),所以要变为两个表。

表一

318f27a85c1dfca6e4fcc9488ba84855.png

表二

25471b0afbfc0c657ea19626557c3b40.png

第三范式

不能有(一个或多个)非主键列传递依赖于主键的情况

定义:不存在非主属性对码的传递性依赖以及部分性依赖。

dc664a73c6a5778e8ac346fbdd977aaf.png

现在,主键是StudyNo,主键只有单个字段,显然符合第二范式,但是bounsLevel和bouns存在传递依赖。

更改为:

bfad59ef6aaf03f8446f64d513cf317b.png
d9ad914fc9b0169392a9458badacc546.png

这里我比较喜欢用bounsNo作为主键,基于两个原因

  1. 不要用字符作为主键。可能有人说:如果我的等级一开始就用数值就代替呢?
  2. 但是如果等级名称更改了,不叫 1,2 ,3或优、良,这样就可以方便更改,所以我一般优先使用与业务无关的字段作为关键字。

一般满足前三个范式就可以避免数据冗余。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值