gpt4 book ai didi

database-design - 3NF 和 BCNF 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 08:01:02 29 4
gpt4 key购买 nike

有人可以向我解释 3NF 和 BCNF 之间的区别吗?如果您还可以提供一些示例,那就太好了。谢谢。

最佳答案

3NF 和 BCNF 之间的区别是微妙的。

3NF

定义

如果一个关系在 2NF 中并且没有非主属性传递依赖于主键,那么它就在 3NF 中。换句话说,如果对于 R 中的每个函数依赖 X ⟶ A,至少满足以下条件之一,则关系 R 是 3NF:

  • X 是 R 中的键或超键
  • A 是 R 中的主要属性

  • 例子

    鉴于以下关系:

    EMP_DEPT(名字,雇员编号,出生日期,地址,部门编号,部门名称)

    一个员工只能在一个部门工作,每个部门有很多员工。

    候选键是 员工编号 .

    考虑以下函数依赖:
  • 员工编号 ⟶ 名字、出生日期、地址、部门编号
  • 部门编号⟶部门名称

  • 鉴于上面的定义,可以得出结论,关系 EMP_DEPT 不在 3NF 中,因为第二个函数依赖不满足 3NF 的两个条件中的任何一个:
  • DepartmentNumber 不是 EMP_DEPT 中的键或超键
  • 部门名称不是 EMP_DEPT 中的主要属性

  • BCNF

    定义

    如果关系 R 在 3NF 中并且对于 R 中的每个函数依赖 X ⟶ A,则关系 R 在 BCNF 中,X 是 R 中的键或超键。换句话说,3NF 和 BCNF 之间的唯一区别是在 BCNF 中它不存在3NF 的第二个条件。这使得 BCNF 比 3NF 更严格,因为 BCNF 中的任何关系都将在 3NF 中,但不一定每个 3NF 中的关系都将在 BCNF 中。

    例子

    鉴于以下关系:

    STUDENT_COURSE(studentNumber, socialSecurityNumber, courseNumber)

    一个学生可以协助许多类(class),在一个类(class)中可以有很多学生。

    候选键是:
  • 社会保障号 , 类(class)编号
  • 学生号 , 类(class)编号

  • 考虑以下函数依赖:
  • 学生号 ⟶ 社会保障号
  • 社会保障号 ⟶ 学生号

  • 鉴于上述定义,可以得出结论 STUDENT_COURSE 不在 BCNF 中,因为至少 studentNumber 不是 STUDENT_COURSE 中的键或超键。

    关于database-design - 3NF 和 BCNF 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749913/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com