在数据库设计中,范式(Normalization)是用来优化数据库结构的一种方法,目的在于减少数据冗余和提高数据完整性。第四范式(4NF)特别关注消除非平凡的多值依赖。
友情链接:ACEJoy
第四范式(4NF)定义
一个关系模式如果满足第三范式(3NF)且没有非平凡的多值依赖,那么它就满足第四范式。多值依赖是指一个属性集的值依赖于另一个属性集的多个值。换句话说,第四范式要求一个表必须不包含多值依赖,除非它是一个平凡的依赖。
多值依赖的定义
如果在一个关系中,对于属性Y和Z,只要固定了属性X的值,属性Y的值就决定了属性Z的值,那么称Z多值依赖于X,记作 X ->-> Z。
例子
假设有一个学生选课系统的数据库,其中有一个关系表 StudentCourses
记录学生的选课情况和他们的家庭地址。该表有三个字段:StudentID
(学生ID),CourseID
(课程ID),和 Address
(家庭地址)。
表:StudentCourses
StudentID | CourseID | Address |
---|---|---|
1 | C1 | 123 Oak St. |
1 | C2 | 123 Oak St. |
2 | C1 | 456 Pine St. |
2 | C3 | 456 Pine St. |
在这个表中,我们可以观察到如下多值依赖:
StudentID ->-> CourseID
:一个学生可以注册多门课程。StudentID ->-> Address
:一个学生可以有多个地址(尽管在现实中一个学生通常只有一个地址,但数据库设计需要考虑所有可能)。
这些多值依赖意味着表中存在冗余:每当学生选择新课程时,都需要重复他的地址信息。
优化
为了满足第四范式,我们需要把 StudentCourses
表分解成两个表,以消除多值依赖:
StudentCourses
表:包含StudentID
和CourseID
。StudentAddresses
表:包含StudentID
和Address
。
表:StudentCourses
StudentID | CourseID |
---|---|
1 | C1 |
1 | C2 |
2 | C1 |
2 | C3 |
表:StudentAddresses
StudentID | Address |
---|---|
1 | 123 Oak St. |
2 | 456 Pine St. |
这样,每个表都不再包含非平凡的多值依赖,从而达到了第四范式的要求。这种设计减少了数据冗余和更新异常,提高了数据库的可维护性和完整性。