数据库设计
一、数据库的设计范式
1.第一范式 1NF
数据项(列,实体的属性) 应该具备不可划分的原子性
姓名 地址
张三 xx省xx市xx区xx门牌号
2.第二范式 2NF
所有非主键属性必须完全依赖于主键属性,不能部分依赖于主键属性(常见于联合主键)
多发生在关系表中
学号 课程号 考试分数 课程学分
001 c01 98 2
002 c02 65 3
003 c01 67 2
问题1 : 数据冗余,某个课程学分可能被记录多次
问题2:丢失数据,某个课程无人选课,学分记录丢失
课程号 课程名 课程分数
c01 sql 2
c02 java 3
c03 xxx 2
3.第三范式 3NF
满足前两个范式的前提下,要消除传递依赖
非主属性必须直接依赖于主属性,不通过其他属性传递依赖
学号 姓名 所在班级号 所在班级名
001 张三 cls01 java 1班
002 李四 cls02 java 1班
班级名先和班级号关联,再和学号关联,这也是不行的,违反了三范式
问题 1: 数据冗余,班级名被保存了很多次
问题 2: 数据确实,没有分配学生的班级,班级信息丢失
拆表
二、实体关系设计
1.一对一关系
两张表中的数据通过拥有相同的主键值一 一对应
理论上两张表的数据应该是同一个实体,因为各种原因将其拆分
2.一对多关系(多对一关系)
在n侧添加一个1侧的外键列来关联1侧的主键列
3.多对多关系
拆解成两队’‘一对多’'关系,借助一个关系表来实现
中间关系表:以两张表的主键结合为联合主键
两张多对多的表是是实现不了多对多的关系的,必须加上一个中间关系表
练习:
员工: 员工名(PK),员工名
项目:项目编号(PK),项目名
某位员工可以同时在不同的项目担任不同的角色