MySQL 三范式
第一范式(1NF):表中的每列的属性不可再分
比如:
学号(主键) | 姓名 | 性别 | 就读信息 |
---|
20200101 | 张三 | 男 | 大一,土木工程 |
上表中可以看到,(就读信息)这一列,其实还可以分解成(年级)和(专业),因此(就读信息)这一属性还可以再分,故不满足第一范式
修改成:
学号(主键) | 姓名 | 性别 | 年级 | 专业 |
---|
20200101 | 张三 | 男 | 大一 | 土木工程 |
第二范式(2NF):在第一范式的基础上,表里的非主键属性必须都依赖于主键(联合主键)
比如:
学号(主键) | 课程(主键) | 教师姓名 | 成绩 | 学生姓名 | 专业 |
---|
20200101 | C语言程序设计 | 老张 | 80 | 张三 | 计算机科学与技术 |
20200102 | JAVA程序设计 | 老李 | 87 | 李四 | 网络工程 |
20200103 | 数据结构 | 老王 | 90 | 王五 | 软件工程 |
上表中可以看到,(教师姓名、成绩)两个属性都依赖于(学号)和(课程),但是(学生姓名、专业)这两个属性却只依赖于(学号),不依赖于(课程),即 只需要知道(学号)便可以知道(学生姓名和专业两个属性),所以,导致非主键属性(学生姓名、专业)不完全依赖于主键(学号、课程),故不符合第二范式
修改成:
学号(主键) | 课程(主键) | 教师姓名 | 成绩 |
---|
20200101 | C语言程序设计 | 老张 | 80 |
20200102 | JAVA程序设计 | 老李 | 87 |
20200103 | 数据结构 | 老王 | 90 |
学号(主键) | 学生姓名 | 专业 |
---|
20200101 | 张三 | 计算机科学与技术 |
20200102 | 李四 | 网络工程 |
20200103 | 王五 | 软件工程 |
第三范式(3NF):在第二范式的基础上,表中的非主属性不可以存在依赖关系
学号(主键) | 姓名 | 性别 | 年级 | 专业 | 班主任姓名 | 班主任性别 | 班主任年龄 |
---|
20200101 | 张三 | 男 | 大一 | 计算机科学与技术 | 老张 | 男 | 33 |
20200102 | 李四 | 男 | 大二 | 网络工程 | 老李 | 男 | 34 |
20200103 | 王五 | 女 | 大三 | 软件工程 | 老王 | 男 | 35 |
上表中可以看到,非主键属性都依赖于(学号),满足了第二范式。但是(班主任性别、班主任年龄)这两个属性都是直接依赖于(班主任姓名)这一属性的,与(学号)属于间接依赖,这就导致了表中的非主键属性存在着依赖关系,不符合第三范式
学号(主键) | 姓名 | 性别 | 年级 | 专业 |
---|
20200101 | 张三 | 男 | 大一 | 计算机科学与技术 |
20200102 | 李四 | 男 | 大二 | 网络工程 |
20200103 | 王五 | 女 | 大三 | 软件工程 |
班主任姓名(主键) | 班主任性别 | 班主任年龄 |
---|
老张 | 男 | 33 |
老李 | 男 | 34 |
老王 | 男 | 35 |