- 이행적 종속성이 없어야 합니다: 이 규칙이 중요합니다. 3NF 테이블에서 어떤 비 기본 키 열도 기본 키에 간접적으로 다른 비-키 열을 통해 의존해서는 안 됩니다.
그것이 실제적으로 무엇을 의미하는지 살펴봅시다.
3NF를 달성하기 위해 테이블을 분해하기
테이블을 분해하여 3NF에 도달하는 과정을 살펴보겠습니다. DataCamp 코스에서 샘플 데이터를 사용하여 각 단계를 설명하겠습니다.
단계 1: 이행 종속성 식별
먼저, 테이블에서 기본 키에 간접적으로 의존하는 속성을 찾겠습니다. 일반적으로, 기본 키 이외의 어떤 속성이 의존하는 경우, 이는 이행 종속성을 나타냅니다. 이는 테이블을 분할할 시기임을 나타냅니다.
아래 세 개의 테이블을 살펴보세요. 어떤 것이 이행적 종속성을 가지고 있나요?
테이블 1: 과정
테이블 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 |
코스 테이블
이제 각 테이블에는 기본 키에 직접 의존하는 정보만 포함되어 있습니다: 강좌 ID은 이제 강좌 이름에 대한 기본 키로 강좌 테이블에 있고, 수강 ID은 수강 테이블의 기본 키입니다.
이 분해를 통해 테이블이 이제 3NF 요구 사항을 충족하게 되어 중복을 제거하고 각 테이블이 직접적으로 관련된 정보만을 저장하도록 보장합니다.
만약 직접 데이터베이스를 만들고 싶다면, PostgreSQL 데이터베이스 생성 강의를 살펴보세요. 좀 더 고급 사용자라면, Snowflake 데이터 모델링 입문을 시도해 볼 수도 있습니다. 여기에는 엔터티-관계 및 차원 모델링과 같은 아이디어가 포함되어 있습니다.
제3 정규형 사용의 장단점
그렇다면, 3NF에 도달하기 위해 이 모든 노력을 기울이는 이유는 무엇일까요? 여기에 주요 이점이 있습니다:
- 데이터 무결성 개선: 3NF는 추이 종속성을 제거함으로써 업데이트 및 삭제가 테이블 간에 모순되거나 오래된 데이터로 이어지지 않도록 도와줍니다.
- 중복 감소: 중복이 줄어들면 데이터베이스를 유지보수하기 쉬워지고 저장 공간이 줄어듭니다.
- 간편한 데이터 유지보수: 전용 테이블에 유사한 정보를 유지함으로써 중복 항목을 찾지 않고도 레코드를 쉽게 업데이트할 수 있습니다.
그렇다고 해도, 3NF 구조는 데이터 정확성을 지원하지만 종종 보다 세분화된 데이터로 이어져 가끔은 복잡한 쿼리가 추가적인 테이블 조인으로 인해 느려질 수 있습니다. 속도가 정규화에 우선하는 경우에는 BCNF 또는 4NF가 더 실용적인 옵션이 될 수 있습니다.
비교: 제1, 제2, 제3 및 BC 정규형
양식 차이를 살펴보겠습니다.
비교표: 제1, 제2, 제3 정규형
여기 제1NF, 제2NF, 제3NF 요구 사항을 이해하는 데 도움이 되는 비교표가 있습니다.
BCNF는 오버랩되는 후보 키로 인한 발생하는 이상 현상을 더 제거하는 3NF의 “엄격한” 형태입니다. 3NF만으로는 완전히 종속성을 제거하지 못하는 복잡한 경우에 특히 유용할 수 있습니다. BCNF는 비 주요 속성이 복합 후보 키의 일부인 속성에 종속되는 경우에 적용됩니다. 이게 복잡하게 들릴 수 있으니 예제를 통해 자세히 살펴보겠습니다.
현재 구조 (3NF에서)
3NF를 달성하기 위해 분해한 후, 두 개의 테이블이 있었습니다:
수강 테이블
코스 테이블
이 구조에서 각 테이블은 제 3 정규형에 있으며, 이중 종속성이 없으며, 데이터가 적절하게 정규화되어 있습니다.
새로운 요구사항 소개
이제 강좌에 새로운 속성을 추가하겠습니다: 각 강좌가 진행되는 강의실. 이 새로운 속성은 BCNF가 필요한 시나리오를 유발할 수 있습니다.
최신화된 강의 테이블 (3NF)
여기서,강좌 ID는 여전히 주 키이며, 다른 모든 속성은 직접적으로 이에 의존합니다. 그러나 각 교실이 한 번에 한 과목만 수용할 수 있는 새로운 규칙이 있다고 가정해 봅시다. 또한 강좌 이름 “SQL 기초“이 다른 강좌 ID (예: 201, 204 등)에서 다른 시간에 예약되면 제공될 수 있다고 가정해 봅시다. 이 경우 “SQL 기초“의 각 제공은 특정 강좌 ID와 관계없이 “101 호실”에서 진행될 것입니다. 결과적으로 강좌 이름은 또한 강의실을 고유하게 결정합니다.
이제 두 개의 후보 키가 있습니다:
- 강좌 ID
- 강좌 이름
두 후보 키가 모두 있는 상태에서 3NF가 다루지 않는 문제가 생겼습니다: 강의실은 과목 이름에 의존합니다 수강 과목 ID가 아닌
BCNF 적용
이 종속성 문제를 해결하기 위해, 우리는 BCNF와 더 잘 일치하는 두 개의 별도 테이블로 코스 테이블을 더 분해해야 합니다:
- 새로운 수업 테이블, 수업 ID와 수업 이름만 포함하는 테이블입니다.
- A CourseDetails 테이블은 강좌명과 교실의 연관성을 저장합니다.
여기서 어떻게 보이는지 확인해보세요:
개정된 강좌 테이블 (BCNF)
CourseDetails 테이블 (BCNF)
- In the Courses 테이블에서, Course ID 가 기본 키이며, 모든 속성이 오직 이에 의존합니다.
- CourseDetails 테이블에서 강좌 이름은 주 키이며, 강의실은 강좌 이름에만 의존합니다.
이 설정은 후보 키의 중첩으로 인한 의존성 문제를 제거하여 엄격하게 정규화된 구조를 보장합니다.
결론
세 번째 정규 형식은 데이터베이스 디자이너가 데이터를 깨끗하고 일관되게 유지하고 문제가 되는 의존성에서 자유롭게 하는 데 유용한 도구입니다. 3NF를 사용하면 데이터 무결성이 향상되어 관리가 원활해지고 중복이 줄어듭니다. 기억해야 할 것은 3NF가 대부분의 상황에서 잘 작동하지만, 더 복잡한 데이터베이스는 BCNF나 4NF와 같은 추가 형식을 사용하는 것이 도움이 될 수 있습니다.
이 문서가 도움이 되었다면 다음 단계로 나아가서 SQL Associate Certification을 취득하는 것을 고려해보세요. SQL 및 데이터베이스 관리 기술을 검증하고 잠재적인 고용주에게 자신의 전문 지식을 증명하는 훌륭한 방법입니다!