以下是我对数据库三范式的理解:
第一范式: 强调列的原子性,即列不可分割性
如表:(姓名,性别,年龄)
假如在实际应用场景中,对男的我要称乎,某某先生,对女士我要称乎某某女士。这就要用到姓了。所以在这种场景中,姓名是应该分为两列的。姓,名。两列。
所以在这种应用场景下该表是不符合第一范式的。
第二范式:简单的说就是表的唯一约束,即消除非码属性对码的部分函数依赖关系。
举个例子:学生选课表
(学号,姓名,年龄,课程,学分,成绩)
在这个表中:主键为(学号,课程)
只有成绩 在表中对主键是完全函数依赖关系, 姓名,年龄,对主键是部分函数依赖。
学分对主键也是部分函数依赖关系。
分析如下:
主键为:
(学号,课程)
学号---决定-->姓名,年龄 (姓名,年龄 只依赖了 主键的一部分) 部分函数依赖
课程---决定-->学分 同理
学号,课程---决定--->成绩 (成绩由 学号,课程共同决定) 完全函数依赖于主键
这样的表格带来的问题:
无法在表中单独增加一条学生,或课程信息。
无法在表中单独删除学生,或课程信息。
容易产生数据冗余,如:多个学生选择同一门课程时,重复存储了课程信息
解决的办法是:
将其分成三张表如下:
(学号,姓名,年龄) (课程,学分) (课程,学号,成绩)
这样就不会有数据冗余了.
第三范式:定义 在消除 非主属性 对码的部分函数依赖 的基础上 再消除 非主属性
对码 传递函数依赖关系
举个例子:
(学号,姓名,年龄,学校名称,学校地址,学校面积)
其中 学号 为码
所有的非主属性对 码 都是完全函数依赖关系 是第二范式
但 学校名称--决定-->学校地址
即学校地址对 码 存在传递函数依赖关系
分成两个表:
(学号,姓名,年龄,学校名) (学校名,学校地址,学校面积)
这样就是第三范式了