Может кто-нибудь объяснить мне разницу между 3NF и BCNF? Было бы здорово, если бы вы также могли привести несколько примеров. Спасибо.
В чем разница между 3NF и BCNF?
Ответ 1
Разница между 3NF и BCNF тонкая.
3NF
Определение
Отношение находится в 3NF, если оно находится в 2NF, и никакой атрибут non-prime транзитивно зависит от первичного ключа. Другими словами, отношение R находится в 3NF, если для каждой функциональной зависимости X ⟶ A в R выполняется хотя бы одно из следующих условий:
- X - это ключ или суперкласс в R
- A является основным атрибутом в R
Пример
Учитывая следующее соотношение:
EMP_DEPT (firstName, employeeNumber, dateOfBirth, адрес, departmentNumber, departmentName)
Сотрудник может работать только в одном отделе, и каждый отдел имеет много сотрудников.
Ключ-кандидат employeeNumber.
Рассмотрим следующие функциональные зависимости:
- employeeNumber ⟶ firstName, dateOfBirth, address, departmentNumber
- departmentNumber ⟶ departmentName
Учитывая вышеизложенное определение, можно сделать вывод, что отношение EMP_DEPT не находится в 3NF, потому что вторая функциональная зависимость не соответствует ни одному из двух условий 3NF:
- departmentNumber не является ключом или суперключем в EMP_DEPT
- departmentName не является основным атрибутом в EMP_DEPT
BCNF
Определение
Отношение R находится в BCNF, если оно находится в 3NF, и для каждой функциональной зависимости X ⟶ A в R, X является ключом или суперклюком в R. Другими словами, единственная разница между 3NF и BCNF заключается в том, что в BCNF это нет второго условия 3NF. Это делает BCNF более строгим, чем 3NF, поскольку любое отношение, которое находится в BCNF, будет в 3NF, но не обязательно каждое отношение, которое находится в 3NF, будет в BCNF.
Пример
Учитывая следующее соотношение:
STUDENT_COURSE (studentNumber, socialSecurityNumber, courseNumber)
Студент может помочь во многих курсах, и в курсе может быть много учеников.
Ключами-кандидатами являются:
- socialSecurityNumber, CourseNumber
- studentNumber, номер курса
Рассмотрим следующие функциональные зависимости:
- studentNumber ⟶ socialSecurityNumber
- socialSecurityNumber ⟶ studentNumber
Учитывая вышеизложенное, можно сделать вывод о том, что STUDENT_COURSE не находится в BCNF, поскольку по меньшей мере studentNumber не является ключом или суперключем в STUDENT_COURSE.