归一化是一种数据库设计技术,旨在减少数据冗余并改善数据完整性。有几种正常形式定义了不同水平的归一化。让我们详细探讨它们:
1。第一种正常形式(1NF):
标准化数据库的第一步是确保其处于第一种正常形式。如果满足以下条件,则表格为1NF:
2。第二个正常形式(2NF):
如果表格为1NF,则表格为2NF,并且所有非键列在功能上完全取决于表的主键。这意味着,如果表的主键由多个列组成,则不应仅取决于键的一部分,而应取决于整个密钥。
3。第三正常形式(3NF):
如果在2NF中,则在3NF中有一个表格,并且没有传递依赖性。这意味着,如果非键列取决于另一个非键列,则应将其移至单独的表。换句话说,每个非钥匙列都必须提供有关钥匙,整个密钥的事实,除了密钥外。
4。Boyce-CODD正常形式(BCNF):
BCNF是3NF的更严格版本。如果该表在3NF中,则在BCNF中,并且其非平凡的功能依赖项x-> y,x是超键,也就是说,x是候选键,或者是超级键。 BCNF旨在消除由于某些类型的功能依赖性而导致在3NF表中仍可能出现的异常的可能性。
1NF和2NF之间的关键差异在于表中依赖关系的性质。
为了说明,请考虑使用复合主键在1NF中的表。如果非钥匙列仅取决于主键的一部分,则违反2NF。例如,如果表跟踪订单具有复合主键(OrderID,ProductID)和ProductPrice的列仅取决于ProductID,则将productPrice移至单独的表(使用ProductID作为主键)将原始表格带入2NF。
第三正常形式(3NF)通过消除及物依赖性来降低数据冗余性起着至关重要的作用。当非键列取决于另一个非键列时,会发生及依赖性,这又取决于主键。
例如,考虑一个2NF中的表,其中包括员工ID(主要密钥),deconcoldID和DepartmentName的列。如果部门名称依赖于部门ID,而部门又取决于员工,则部门名称通过dectionsID对员工ID具有传递性依赖性。此设置可以导致数据冗余,因为表中可以多次重复相同的部门名称。
为了解决这个问题,3NF将需要将部门名称转移到单独的部门表(以部门为主要键),从而消除了传递性依赖性。该归一化步骤可确保部门名称仅存储一次,从而减少冗余并提高数据完整性。当需要更新时,必须仅在一个地方进行,以最大程度地减少矛盾的风险。
当存在功能依赖性时,Boyce-CODD正常形式(BCNF)比第三正常形式(3NF)优选,而确定依赖性(依赖的左侧)不是超级钥匙。 BCNF提供了更严格的标准,以消除可以在3NF表中持续存在的异常。
考虑一个涉及大学课程注册系统的示例:
表:CoursereGistration
功能依赖性:
在这种情况下,表格为3NF,因为没有传递依赖性。但是,它违反了BCNF,因为教师 - > courseId意味着不是超级关键的教师,它决定了另一个非关键列,课程ID。
为了满足BCNF,我们需要将表分为两者:
Table1:CoursereGistration
Table2:教师
通过这样做,我们确保功能依赖性中的每个决定因素都是超键,从而满足BCNF标准。这种分离消除了潜在的异常情况,例如插入,删除和更新如果表保留在3NF中,可能会发生的异常。
以上是解释不同的正常形式(1NF,2NF,3NF,BCNF)。的详细内容。更多信息请关注PHP中文网其他相关文章!