제3 정규형(3NF)이란 무엇인가요?

거대한 비구조화 데이터베이스에서 반복적이고 중복된 정보로 가득 차 있는 상황을 상상해 보세요. 모든 업데이트나 삭제는 잠재적인 재앙이 되어 오류와 불일치를 초래할 위험이 있습니다. 제3 정규형(3NF)은 이러한 혼란을 피하기 위한 입증된 데이터베이스 정규화 방법입니다. 3NF를 구현하면 데이터 구조가 정리되어 효율적이고 조직적이며 불필요한 중복이 제거됩니다.

이 기사에서는 3NF가 어떻게 작동하는지, 왜 가치가 있는지, 그리고 이를 실천하는 방법에 대해 알아보겠습니다. 또한 3NF를 다른 형태와 비교하고 각각을 언제 사용하는지 배울 것입니다. 이러한 구조에 대해 더 많이 아는 것은 모두에게 유익하지만, 데이터베이스 설계자나 데이터 과학자라면 작업을 상당히 간소화하고 데이터베이스의 신뢰성을 유지하는 데 이 지식이 특히 가치가 있습니다. 데이터베이스 설계에 전반적으로 관심이 있다면 우리의 전체 데이터베이스 설계 과정도 살펴보세요.

제3 정규형(3NF) 정의

세 번째 정규형은 불필요한 종속성을 제거하는 데이터베이스 정규화의 중요한 개념입니다. 3NF는 제1 정규형(1NF)과 제2 정규형(2NF)을 기반으로 하며, 그들의 규칙을 상속합니다: 1NF는 각 셀에 원자(분리할 수 없는) 값이 필요하며, 2NF는 복합 기본 키에 대한 부분적 종속성을 제거합니다. 3NF는 이항 종속성을 제거함으로써 더 나아가며, 이는 비기본 키 속성이 주 키에 간접적으로 종속되는 상황을 나타냅니다.

이를 중점적으로 다루면, 3NF는 테이블의 각 비기본 키 열이 주 키에만 직접적으로 연결되도록 보장합니다. 더 구체적으로, 3NF는 데이터 삽입, 업데이트 또는 삭제 시 중복을 최소화하고 이상 현상을 피하는 데 도움을 줍니다.

1970년대에 Edgar F. Codd가 3NF를 소개하여 완전히 정규화된 데이터베이스 구조를 달성하기 위한 조건을 형식화했습니다. 몇 년 후 Carlo Zaniolo에 의해 재정립된 것은 “클래식” 3NF와 보다 제한적인 Boyce-Codd 정규형(BCNF) 간의 차이를 보다 명확하게 설명했습니다. 현재는 BCNF에 대해 과도하게 걱정하지 마십시오. 나중에 다시 다룰 것입니다.

세 번째 정규형을 위한 조건 이해

그렇다면 3NF를 달성하기 위해서는 정확히 무엇이 필요한가요? 테이블이 자격을 갖추기 위해서는 몇 가지 조건을 충족해야 합니다:

  • 2NF에 속해야 합니다: 이는 이미 원자적이며 반복 그룹이 없으며 어떤 복합 키에 대한 부분 종속성이 없음을 의미합니다.

3NF는 2NF와 1NF를 포함합니다. Image by Author

  • 이행적 종속성이 없어야 합니다: 이 규칙이 중요합니다. 3NF 테이블에서 어떤 비 기본 키 열도 기본 키에 간접적으로 다른 비-키 열을 통해 의존해서는 안 됩니다.

그것이 실제적으로 무엇을 의미하는지 살펴봅시다.

3NF를 달성하기 위해 테이블을 분해하기

테이블을 분해하여 3NF에 도달하는 과정을 살펴보겠습니다. DataCamp 코스에서 샘플 데이터를 사용하여 각 단계를 설명하겠습니다.

단계 1: 이행 종속성 식별

먼저, 테이블에서 기본 키에 간접적으로 의존하는 속성을 찾겠습니다. 일반적으로, 기본 키 이외의 어떤 속성이 의존하는 경우, 이는 이행 종속성을 나타냅니다. 이는 테이블을 분할할 시기임을 나타냅니다.

아래 세 개의 테이블을 살펴보세요. 어떤 것이 이행적 종속성을 가지고 있나요?

테이블 1: 과정

Course ID Course Name Difficulty
201 SQL 기초 초보
202 파이썬 소개 초보
203 데이터 과학 이해 중급

테이블 2: 강사

Instructor ID Instructor Name Expertise
1 사라 존슨 데이터 과학
2 톰 윌리엄스 머신 러닝
3 에밀리 브라운 파이썬

표 3: 등록 인원

Enrollment ID Student Name Course ID Course Name
1001 Alice Smith 201 SQL 기초
1002 Bob Green 202 파이썬 입문
1003 Charlie Blue 201 SQL 기초

답은…표 3!

이 표에서 강좌 이름강좌 ID에 의존하지만 직접 등록 ID(기본 키)에 의존하지 않습니다. 이 간접 의존성으로 인해 강좌 이름은 추이적 의존성입니다.

단계 2: 데이터를 새 테이블로 분리

추이 종속성을 해결하기 위해 Table 1을 두 개의 테이블로 분할할 것입니다. 각 테이블은 직접 종속적인 데이터에 중점을 둘 것입니다.

개정된 수강 테이블

Enrollment ID Student Name Course ID
1001 Alice Smith 201
1002 Bob Green 202
1003 Charlie Blue 201

코스 테이블

Course ID Course Name
201 SQL 기초
202 파이썬 입문

이제 각 테이블에는 기본 키에 직접 의존하는 정보만 포함되어 있습니다: 강좌 ID은 이제 강좌 이름에 대한 기본 키로 강좌 테이블에 있고, 수강 ID수강 테이블의 기본 키입니다.

이 분해를 통해 테이블이 이제 3NF 요구 사항을 충족하게 되어 중복을 제거하고 각 테이블이 직접적으로 관련된 정보만을 저장하도록 보장합니다.

만약 직접 데이터베이스를 만들고 싶다면, PostgreSQL 데이터베이스 생성 강의를 살펴보세요. 좀 더 고급 사용자라면, Snowflake 데이터 모델링 입문을 시도해 볼 수도 있습니다. 여기에는 엔터티-관계 및 차원 모델링과 같은 아이디어가 포함되어 있습니다.

제3 정규형 사용의 장단점

그렇다면, 3NF에 도달하기 위해 이 모든 노력을 기울이는 이유는 무엇일까요? 여기에 주요 이점이 있습니다:

  • 데이터 무결성 개선: 3NF는 추이 종속성을 제거함으로써 업데이트 및 삭제가 테이블 간에 모순되거나 오래된 데이터로 이어지지 않도록 도와줍니다.
  • 중복 감소: 중복이 줄어들면 데이터베이스를 유지보수하기 쉬워지고 저장 공간이 줄어듭니다.
  • 간편한 데이터 유지보수: 전용 테이블에 유사한 정보를 유지함으로써 중복 항목을 찾지 않고도 레코드를 쉽게 업데이트할 수 있습니다.

그렇다고 해도, 3NF 구조는 데이터 정확성을 지원하지만 종종 보다 세분화된 데이터로 이어져 가끔은 복잡한 쿼리가 추가적인 테이블 조인으로 인해 느려질 수 있습니다. 속도가 정규화에 우선하는 경우에는 BCNF 또는 4NF가 더 실용적인 옵션이 될 수 있습니다.

비교: 제1, 제2, 제3 및 BC 정규형

양식 차이를 살펴보겠습니다.

비교표: 제1, 제2, 제3 정규형

여기 제1NF, 제2NF, 제3NF 요구 사항을 이해하는 데 도움이 되는 비교표가 있습니다.

Feature 1NF 2NF 3NF
원자적 데이터
부분 종속성 없음
이행적 종속성 없음

제3 정규형 대 보이스-코드 정규형 (BCNF)

BCNF는 오버랩되는 후보 키로 인한 발생하는 이상 현상을 더 제거하는 3NF의 “엄격한” 형태입니다. 3NF만으로는 완전히 종속성을 제거하지 못하는 복잡한 경우에 특히 유용할 수 있습니다. BCNF는 비 주요 속성이 복합 후보 키의 일부인 속성에 종속되는 경우에 적용됩니다. 이게 복잡하게 들릴 수 있으니 예제를 통해 자세히 살펴보겠습니다.

현재 구조 (3NF에서)

3NF를 달성하기 위해 분해한 후, 두 개의 테이블이 있었습니다:

수강 테이블

Enrollment ID Student Name Course ID
1001 앨리스 스미스 201
1002 밥 그린 202
1003 찰리 블루 201

코스 테이블

Course ID Course Name
201 SQL 기초
202 파이썬 소개

이 구조에서 각 테이블은 제 3 정규형에 있으며, 이중 종속성이 없으며, 데이터가 적절하게 정규화되어 있습니다.

새로운 요구사항 소개

이제 강좌에 새로운 속성을 추가하겠습니다: 각 강좌가 진행되는 강의실. 이 새로운 속성은 BCNF가 필요한 시나리오를 유발할 수 있습니다.

최신화된 강의 테이블 (3NF)

Course ID Course Name Classroom
201 SQL 기초 101호 강의실
202 파이썬 입문 102호 강의실
203 데이터 과학 이해 101호 강의실

여기서,강좌 ID는 여전히 주 키이며, 다른 모든 속성은 직접적으로 이에 의존합니다. 그러나 각 교실이 한 번에 한 과목만 수용할 수 있는 새로운 규칙이 있다고 가정해 봅시다. 또한 강좌 이름SQL 기초“이 다른 강좌 ID (예: 201, 204 등)에서 다른 시간에 예약되면 제공될 수 있다고 가정해 봅시다. 이 경우 “SQL 기초“의 각 제공은 특정 강좌 ID와 관계없이 “101 호실”에서 진행될 것입니다. 결과적으로 강좌 이름은 또한 강의실을 고유하게 결정합니다.

이제 두 개의 후보 키가 있습니다:

  1. 강좌 ID
  2. 강좌 이름

두 후보 키가 모두 있는 상태에서 3NF가 다루지 않는 문제가 생겼습니다: 강의실과목 이름에 의존합니다 수강 과목 ID가 아닌.

BCNF 적용

이 종속성 문제를 해결하기 위해, 우리는 BCNF와 더 잘 일치하는 두 개의 별도 테이블로 코스 테이블을 더 분해해야 합니다:

  1. 새로운 수업 테이블, 수업 ID수업 이름만 포함하는 테이블입니다.
  2. A CourseDetails 테이블은 강좌명교실의 연관성을 저장합니다.

여기서 어떻게 보이는지 확인해보세요:

개정된 강좌 테이블 (BCNF)

Course ID Course Name
201 SQL 기초
202 파이썬 입문
203 데이터 과학 이해

CourseDetails 테이블 (BCNF)

Course Name Classroom
SQL 기초 101호
파이썬 입문 102호
데이터 과학 이해 101호

이 새로운 구조로 각 테이블이 BCNF 조건을 만족합니다:

  • In the Courses 테이블에서, Course ID 가 기본 키이며, 모든 속성이 오직 이에 의존합니다.
  • CourseDetails 테이블에서 강좌 이름은 주 키이며, 강의실강좌 이름에만 의존합니다.

이 설정은 후보 키의 중첩으로 인한 의존성 문제를 제거하여 엄격하게 정규화된 구조를 보장합니다.

결론

세 번째 정규 형식은 데이터베이스 디자이너가 데이터를 깨끗하고 일관되게 유지하고 문제가 되는 의존성에서 자유롭게 하는 데 유용한 도구입니다. 3NF를 사용하면 데이터 무결성이 향상되어 관리가 원활해지고 중복이 줄어듭니다. 기억해야 할 것은 3NF가 대부분의 상황에서 잘 작동하지만, 더 복잡한 데이터베이스는 BCNF나 4NF와 같은 추가 형식을 사용하는 것이 도움이 될 수 있습니다.

이 문서가 도움이 되었다면 다음 단계로 나아가서 SQL Associate Certification을 취득하는 것을 고려해보세요. SQL 및 데이터베이스 관리 기술을 검증하고 잠재적인 고용주에게 자신의 전문 지식을 증명하는 훌륭한 방법입니다!

Source:
https://www.datacamp.com/tutorial/third-normal-form