Skip to content

2025-10-12-数据库设计

虽然题目是 数据库设计 但主要讲的内容是 数据表设计

范式

第一范式

根据业务,把每个列设计为不可分割的原子数据项

反例

如图所示,这个就不满足第一范式,因为 “学院” 这个字段可以分为 “学院地址”,“学院名称” 等字段

为什么不能“加入时间”不需要拆分呢?

因为根据业务“加入时间”一般是整体一起使用的,但是像在“万年历”等业务下面就需要拆分

正确例子

把学院表拆分出来,通过 学院Id 把学生表与学院表关联起来

第二范式

在满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖。存在于表中定义了复合主键的情况下。

反例

像图中这样,有两个主键(存在联合主键),

但是 “姓名”,“年龄” 这两个字段依赖于“学生Id”, “课程名称” 依赖于 “课程Id” (部分函数依赖)

这样就不满足第二范式

正确例子

通过把上诉那张错误的表拆分为学生表、课程表与成绩表即可

把部分依赖的分别保留在对应的表格中 (“姓名”,“年龄” 这两个字段保留在 学生表, “课程名称” 保留在 课程表)

而把“课程成绩”这样的需要两个主键依赖的保留在 成绩表 中即可 (M-N)

第三范式

在满足第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖

反例

像这样,如果想要找到学院电话,需要如下步骤

“学生 Id” -> “学院名称” -> “学院电话”

出现这样传递依赖,就不满足第三范式

正确例子

只需要把它拆分为 学生表 与 学院表 即可

让单表表达的内容简单明了,仅仅表示对应对象的属性即可

如果有关联,那么通过 id 来关联即可