数据冗余不仅浪费资源和磁盘空间,还增加了错误和不一致的风险。因此,必须将冗余数据关系分解为易于管理和结构更优的关系。通过规范化,可以重新构建关系数据库,减少数据之间的冗余,提高数据完整性,消除插入、更新和删除等不希望的特性。本文将详细解释不同类型的规范化,并探讨使用规范化的优势和劣势。
如果一个关系包含复合或多值属性,则违反了第一范式。为了消除值的重复,将其转换为第一范式。在第一范式中,属性值是单值的,没有重复组。通过使用主键和外键,第一范式在两个表之间创建了函数依赖。
// 示例:员工表
// 员工表不在第一范式,因为电话号码列包含多个值。
// 将员工表转换为1NF,如下分解:
// 员工表-1NF
为了使关系处于第二范式,它必须首先处于第一范式,并且不包含部分依赖。通过使用第二范式,内存中的冗余数据量减少了。那些不包含在第二范式中的关系可能会在未来的更新中出现异常。
// 示例:提供的表中的非主属性年龄依赖于教师ID,这是候选键的一个合适子集。因此,它违反了2NF规则。
// 为了创建第二范式,将提供的表分成两个表:
关系必须首先处于第一和第二范式,然后才能处于第三范式。第三范式通过将非主键属性及其依赖的属性副本移动到新关系中,去除了非主键属性对主键的传递依赖。去除属性的传递依赖减少了数据复制,并提高了数据的完整性。在第三范式中,大多数表都免于插入、更新和删除的异常。
// 示例:当前的表不在第三范式:
// 为了将给定的表分解为第三范式,可以这样做:
博伊斯-科德范式(BCNF)是规范化的第四形式,是第三范式的更新版本。关系必须首先处于第三范式才能处于BCNF。根据BCNF,如果Q由P确定,那么P应该是任何函数依赖的超键或候选键。当使用第三范式时,可以实现无损分解,但使用BCNF则非常困难。BCNF是一种更严格的规范化形式,因此数据库中没有异常结果。
// 示例:考虑一个关系R,具有属性(学生,科目,教师)。由于教师不是候选键,科目“教师”违反了BCNF。
// 将R分成R1(X,Y)和R2,如果X->Y违反BCNF(R-Y)。因此,R被分成R1(教师,科目)和R2(关系)(学生,教师)。
如果一个DBMS中的关系处于第四范式且不包含任何连接依赖,则该关系处于第五范式。连接必须是无损的。当DBMS中的所有表被分解成尽可能多的表以减少冗余时,就满足了第五范式。第五范式也被称为投影连接范式。
// 示例:Rick先生在讲堂1同时参加C++和Python课程,但他在第二学期不参加Python。在这种情况下,字段必须组合以识别有效的数据集。如果添加一个新的讲堂作为讲堂3,但不知道将是什么科目,留下教授和科目空白。由于所有三列都是主键,不能留下其他两列(教授,科目)空白。因此,可以将上述表分解成三个关系以实现5NF。
在第六范式中,关系变量被分解成不可约成分。对于时间变量或其他区间数据,这对于非时间关系变量相对不重要。在许多数据仓库中,第六范式的好处超过了缺点。
// 示例:上述可能的连接依赖是:
// (学生ID,名字)
// (学生ID,姓氏)
// (学生ID,成绩)
// 因此,可以将其分解为第六范式如下: