3NF와 BCNF 적용

이성혁·2024년 9월 15일

Database

목록 보기
23/24
post-thumbnail

3NF와 중복 데이터

먼저, 3NF(제3정규형)에 대해 살펴보겠습니다. 3NF는 2NF를 만족하면서, 모든 비주요 속성(Non-Prime Attribute)기본 키(Primary Key)에 대해 이행적 종속(Transitive Dependency)을 가지지 않아야 한다는 규칙을 요구합니다.

이행적 종속이란 A → B, B → C인 관계가 있을 때, A → C도 성립하는 것을 의미합니다. 이러한 종속이 발생하면 테이블 내에 중복 데이터가 생성될 수 있습니다.

다음과 같은 테이블을 예로 들어 보겠습니다:

어카운트 ID은행 이름계좌 번호등급월급 비율임직원 ID임직원 이름
1국민은행123-456스타0.7101소니
2우리은행987-654실버0.3101소니
3국민은행654-321로얄1.0102메쉬

이 테이블에서 임직원 이름임직원 ID에 의해 결정됩니다. 또한, 어카운트 ID가 같으면 임직원 ID도 같으므로, 어카운트 ID임직원 이름을 이행적으로 결정합니다. 이로 인해 임직원 이름에 중복 데이터가 발생할 수 있습니다.

이 문제를 해결하기 위해, 3NF는 모든 비주요 속성이 어떤 키에 대해서도 이행적으로 종속되면 안 된다는 규칙을 제시합니다.

3NF로 테이블 분리

위 테이블의 중복을 제거하기 위해, 임직원 ID임직원 이름을 별도의 테이블로 분리해 봅시다.

임직원 테이블

임직원 ID임직원 이름
101소니
102메쉬

어카운트 테이블

어카운트 ID은행 이름계좌 번호등급월급 비율임직원 ID
1국민은행123-456스타0.7101
2우리은행987-654실버0.3101
3국민은행654-321로얄1.0102

이렇게 테이블을 분리하면 임직원 이름에 대한 중복 데이터가 사라지고, 3NF를 만족하게 됩니다.

BCNF와 더 나은 정규화

  • BCNF(Boyce-Codd 정규형)는 3NF의 확장된 형태로, 모든 유효한 비자명 함수 종속성(Non-Trivial Functional Dependency)에서 좌측의 X슈퍼키여야 한다는 규칙을 추가합니다. 즉, 모든 함수 종속의 결정자가 슈퍼키가 되어야 함을 의미합니다.

예를 들어, 다음과 같은 함수 종속성이 존재한다고 가정해 봅시다:

  • 등급은행 이름

이 경우, 등급은행 이름을 결정하지만, 등급은 슈퍼키가 아니므로 BCNF를 위반하게 됩니다.

이 문제를 해결하기 위해 등급은행 이름을 별도의 테이블로 분리합니다.

등급 테이블

등급은행 이름
스타국민은행
실버우리은행
로얄국민은행

어카운트 테이블

어카운트 ID계좌 번호월급 비율임직원 ID등급
1123-4560.7101스타
2987-6540.3101실버
3654-3211.0102로얄

이로써 등급이 슈퍼키가 되어 BCNF를 만족하게 됩니다.

결론

이번 포스트에서는 3NF와 BCNF를 적용하여 데이터베이스를 정규화하는 방법을 살펴보았습니다. 테이블을 분리하고 중복 데이터를 제거함으로써 데이터베이스의 효율성을 높일 수 있음을 확인했습니다.

정규화는 데이터베이스 설계에서 매우 중요한 과정이며, 데이터의 무결성과 일관성을 유지하는 데 큰 도움이 됩니다. 다음 포스트에서는 인덱스를 통해 쿼리 성능을 최적화하는 방법을 다루겠습니다.


출처

https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe

profile
항상 배우는 자세로 🪴

0개의 댓글