范式
第一范式
字段不可分
定义:如果关系R中所有属性的值域都是单纯域,那么关系模式R是第一范式的。
那么符合第一模式的特点就有
- 有主关键字
- 主键不能为空
- 主键不能重复
- 字段不可以再分
例如:
以上的表就不符合第一范式:主键重复(实际中数据库不允许重复的),而且Contact字段可以再分
所以变更为正确的是
第二范式
不能有(一个或多个)非主键列部分依赖于主键的情况
定义:如果关系模式R是第一范式的,而且关系中每一个非主属性不部分依赖于主键,称R是第二范式的。
所以第二范式的主要任务就是:满足第一范式的前提下,消除部分函数依赖。
这个表完全满足于第一范式,主键由StudyNo和ClassNo组成,这样才能定位到指定行。但是,ClassAddress部分依赖于关键字( ClassNo → ClassAddress ),所以要变为两个表。
表一
表二
第三范式
不能有(一个或多个)非主键列传递依赖于主键的情况
定义:不存在非主属性对码的传递性依赖以及部分性依赖。
现在,主键是StudyNo,主键只有单个字段,显然符合第二范式,但是bounsLevel和bouns存在传递依赖。
更改为:
这里我比较喜欢用bounsNo作为主键,基于两个原因
- 不要用字符作为主键。可能有人说:如果我的等级一开始就用数值就代替呢?
- 但是如果等级名称更改了,不叫 1,2 ,3或优、良,这样就可以方便更改,所以我一般优先使用与业务无关的字段作为关键字。
一般满足前三个范式就可以避免数据冗余。