数据库设计三大范式和BCNF理解

第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。

这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,如下的数据库表是符合第一范式的:
字段1 | 字段2 | 字段3 | 字段4

而这样的数据库表是不符合第一范式的:
字段1 | 字段2 | 字段3 | 字段4 | 字段3.1 字段3.2 |

有时候如果把一堆信息存在一个字段也违背了第一范式
姓名 | 学号 | 各科成绩
张三 | 001 | 语文98,数学82

第二范式(2NF):一个表在表达一个事物


定义:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

2NF包含1,并要求有主键

课程选修表

违背第二范式的设计

学号|姓名|年龄|课程名称|成绩|学分

这个选修表包含了两种属性的事物,学生和课程

正确的
1.学生表
学号|姓名|年龄|
2.课程表
课程名称|学分
3.选修表
学号|课程名称|成绩

第三范式(3NF):每列都与主键有直接关系,不存在传递依赖;

定义:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
关键字段 → 非关键字段x → 非关键字段y

违反第三范式的例子:
学号|姓名|年龄|所在学院|学院联系电话,
关键字为单一关键字”学号”;

尽管从包含关系上,学生从属一个学院,但是学院信息放在一个表里,就发生了传递依赖
存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)

正确的设计
学生:
学号|姓名|年龄|所在学院

学院:
学院|地点|电话

鲍依斯科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BCNF范式。

假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)

所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
违背了BCNF

如果仓库换了管理员,则表中所有行的管理员ID都要修改。

正确的设计范式 把仓库管理关系表分解为二个关系表:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

第二个违背BCNF例子:是3NF但不是BCNF的例子: 关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程.每一教师只教一门课.每门课有若干教师,某一学生选定某门课,就对应一个固定的教师.由语义可得到如下的函数依赖. (S,J)→T;(S,T)→J;T→J. 这里(S,J),(S,T)都是候选码.

扩展阅读

1、主关键字:主关键字(primary key)是表中的一个或多个字段,它的值用于唯一的标识表中的某一条记录。主关键字又可以称为主键。 主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。

2、超关键字:二维表中,能够惟一确定记录的一个字段或几个字段的组合被称为“超关键字”。“超关键字”虽然能唯一确定记录,但是它所包含的字段可能是有多余的。

3、候选关键字:如果一个超关键字去掉其中任何一个字段后不再能唯一地确定记录,则称它为“候选关键字”(Candidate Key)。


This entry was posted in 数据库 and tagged . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/databases-design-paradigm/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

*