软考数据库下午题范式是数据库设计中的一个重要概念,也是关系型数据库中的一种设计规范。下午题常常考察范式的基本概念、应用场景、设计方法等,是数据库系统工程师考试中一个重要的考点。

一、第一范式

第一范式是最基本的范式,它要求每个表只包含一个原子性的值,即每个字段都是最小的数据单元,不可再分。第一范式的实现方法比较简单,只要将数据列中的每个字段都用单引号括起来即可。

例如,以下表中的“姓名”和“电话”字段都违反了第一范式的要求,因为姓名可以分为姓氏和名字,电话可以分为手机和座机:

sql

复制代码



1



+

------+------+

|姓名 |电话 |

+

------+------+

|张三 |

138

****

1234

|

|李四 |

139

****

5678

|

+

------+------+

要将表1改为符合第一范式的表,只需要将“姓名”字段拆分为两个字段“姓氏”和“名字”,将“电话”字段拆分为两个字段“手机”和“座机”,并用单引号括起来。

sql

复制代码



2



+

-----------+-----------+------------+

|姓氏 |名字 |手机 |座机 |

+

-----------+-----------+------------+

|张三 | |

138

****

1234

| |

|李四 | |

139

****

5678

| |

+

-----------+-----------+------------+

二、第二范式

第二范式在第一范式的基础上增加了一个约束条件:表中的每一个非主键列必须完全依赖于主键,而不是部分依赖。如果一个表有一个联合主键(由多个字段组成),那么非主键列必须依赖于整个联合主键,而不是其中的部分。

例如,以下表中的“部门”和“薪水”字段都违反了第二范式的要求,因为它们只依赖于“部门编号”列的部分值:

sql

复制代码



3



+

---------+-----------+--------+

|部门编号 |部门 |薪水 |

+

---------+-----------+--------+

|

10

|人事部 |

5000

|

|

20

|财务部 |

6000

|

+

---------+-----------+--------+

要将表3改为符合第二范式的表,可以将联合主键拆分为两个字段“部门编号”和“部门类型”,并将非主键列“薪水”依赖于整个联合主键:

sql

复制代码



4



+

-----------+--------+--------+--------+

|部门编号 |部门类型 |薪水 |员工编号 |

+

-----------+--------+--------+--------+

|

10

|人事 |

5000

|

1

|

|

20

|财务 |

6000

|

2

|

+

-----------+--------+--------+--------+