当前位置: DB社区 > 02-mysql > 阅读正文

SQL 设计范式

2021.9.9.   438 次   793字

1.数据库的6种常用设计范式
  • 第一范式
  • 第二范式
  • 第三范式
  • bc范式
  • 第四范式
  • 第五范式

通常只使用前 3 种设计范式

2.第一范式:表中的所有字段都是不可分割的原子值

(主要是解决数据查询问题)

学生表

nameaddress
张三xxx省xxx市xxx县xxx镇xxx村xxx号

这里的地址,可能包括省,市,等等,这样就不符合第一范式

实际问题举例:找出某个学生的省份,无法实现。

若分割成:姓名,省,市,县,镇,村, 号。(假设不可再分)

修改后的信息表

name
张三xxxxxxxxxxxxxxx

每个列的字段,都是不可再分的,这就符合第一范式

3.第二范式:第一范式基础上,非码属性必须完全依赖于候选码

(主要是消除冗余问题)

学生表

学号姓名系名系主任课程名称分数
10001张三经济系系主任1高等数学77
10002李四法律系系主任2大学英语88

这里的候选码是,学号+课程名称,因为这两个可以确定其他所有的字段信息

但,这里的姓名部分依赖于学号,而系名部分依赖于课程名称,系主任依赖于系名

实际问题举例:一个学生有多个课,但每次都得写上姓名,系名,系主任

拆分后的表一:选课表

学号课程名称分数
10001高等数学77
10002大学英语88

拆分后的表二:学生表

学号姓名系名系主任
10001张三经济系系主任1
10002李四法律系系主任2

经过拆分成 2 张表,消除了非主属性对码的部分依赖,这就符合第二范式

4.第三范式:在第二范式基础上,任何非主属性不依赖于其他非主属性

(主要是消除插入,删除问题)

对第二范式拆分的学生表,系名依赖于学号,系主任依赖于系名,构成传递依赖

实际问题举例:没有学生无法添加一个系,学生毕业系也被删除了

二范式的学生表拆分一:学生表

学号姓名系名
10001张三经济系
10002李四法律系

二范式的学生表拆分二:系表

系名系主任
经济系系主任1
法律系系主任2

通过对学生表的拆分,消除了非主属性对码的传递依赖,这就是第三范式

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群