数据库范式
为什么要引入范式 #card
关系型数据库减少数据冗余,
避免数据异常的规范化规则
1NF :<-> 每列原子性,所有字段都是单一值
2NF :<-> 所有非主属性必须完全依赖主键,消除了非主属性对码的部分依赖
3nf :<-> 所有非主属性必须直接依赖于主键
bcnf :<-> 所有决定因素(左侧)必须是候选键(超键)
4NF :<-> 去除多值依赖
表:订单(订单ID, 产品ID, 产品名称, 数量),主键是复合键(订单ID, 产品ID)。2nf 问题在哪里? #card
- 问题:产品名称仅依赖产品ID(部分依赖),需拆分为 订单详情表 和 产品表。
表 学生(学号, 姓名, 学院, 学院地址),其中学院地址依赖学院,而学院依赖学号。如何符合 3nf #card
- 需拆分为 学生表 和 学院表。
表 课程(学生, 教师, 课程),假设一个教师只教一门课,但一门课有多个教师。如何实现 bcnf #card
- 若存在依赖 教师 → 课程,但教师不是候选键,需拆分为 教师-课程表 和 学生-教师表。
如果函数依赖A->B,B->C,则属于哪一范式 #card
传递依赖
2NF