데이터베이스 작업 중에는 중복 데이터 및 일관되지 않은 업데이트와 같은 문제가 발생하는 것이 일반적입니다. 두 번째 정규 형식은 첫 번째 정규 형식(1NF)을 기반으로하여 더 깨끗하고 효율적인 테이블을 만들기 위한 데이터베이스 정규화 단계입니다.
2NF를 이해하는 것은 데이터베이스 설계나 데이터 관리에서 작업하는 사람에게 매우 중요하며, 세 번째 정규 형식(3NF)과 같은 더 높은 정규 형식을 위한 기초를 마련합니다. 이 기사에서는 2NF가 어떻게 작동하며 테이블을 2NF 요구 사항을 충족시키는 방법과 실제 예제를 살펴볼 것입니다. 또한 2NF의 장단점과 가장 잘 맞는 사용 사례에 대해 이야기할 것입니다.
두 번째 정규 형식 이해
두 번째 정규 형식은 부분 종속성을 제거하는 데 중점을 둔 데이터베이스 정규화 단계입니다. 관계형 데이터베이스의 선구자인 Edgar F. Codd가 정규화 작업 중 일환으로 소개했습니다.
테이블이 2NF에 들어가기 위해서는 먼저 첫 번째 정규 형식의 규칙을 만족해야 합니다:
- 원자성: 각 셀은 단일 값만 포함해야 합니다 (반복 그룹이나 배열이 없어야 함).
- 고유한 행: 테이블에 명확한 기본 키가 있어야 합니다.
2NF는 추가 규칙을 하나 더 가지고 있습니다: 부분 종속성 제거.
부분 종속성이 발생하는 경우는 비주요 속성(어떤 후보 키에도 속하지 않는 열)이 전체 키가 아닌 키의 일부에만 의존할 때 발생합니다. 2NF 규칙은 모든 비주요 속성이 전체 기본 키에 의존하도록 보장하며, 키의 일부가 아닌 전체에 의존해야 합니다. 테이블에 부분 종속성이 남아있으면 중복 데이터가 데이터베이스에 스며들어 효율성을 떨어뜨리고 업데이트나 삭제 중에 일관성 문제가 발생할 수 있습니다.
이론 자체만으로는 조금 지루할 수 있으므로 실제 예시를 살펴봅시다.
Datacamp 학생들의 수강 등록 테이블입니다.
Student ID | Course ID | Course Name | Instructor Name |
---|---|---|---|
1001 | 201 | SQL 기초 | Ken Smith |
1002 | 202 | 파이썬 소개 | 말린 오도넬 |
1001 | 202 | 파이썬 소개 | 말린 오도넬 |
여기서 주요 키는 학생 ID와 과목 ID의 복합입니다. 그러나 비주요 속성 과목명과 수강료는 과목 ID에만 종속되어 있으며 전체 키에는 종속되어 있지 않습니다. 이는 2NF를 위반합니다.
테이블을 2NF를 달성하기 위해 분해하는 단계:
테이블이 2NF의 규칙을 따르는지 확인하려면 다음을 수행해야 합니다:
- 모든 후보 키 식별: 테이블에서 행을 고유하게 식별하는 속성의 최소 집합을 결정합니다. 이들이 후보 키입니다.
- 함수 종속성 결정: 테이블 내의 모든 함수 종속성을 식별합니다. 특히, 후보 키의 일부에만 비주요 속성(어떤 후보 키에도 속하지 않는 속성)이 의존하는 종속성을 찾습니다.
- 부분 종속성 제거: 각 부분 종속성에 대해:
- 종속 속성을 키 일부와 함께 새 테이블로 이동합니다.
- 새 테이블에 고유한 기본 키가 있는지 확인합니다.
- 부분 종속성이 없어질 때까지 반복: 모든 테이블의 비주요 속성이 해당 기본 키에 완전히 종속되어 있는지 확인합니다.
실무에서 두 번째 정규형의 예시
이제 두 가지 예시를 살펴보겠습니다.
예시 1: 수강 신청 테이블
이전에 우리는 다음과 같은 수업 등록 테이블을 보았습니다:
Student ID | Course ID | Course Name | Instructor Name |
---|---|---|---|
1001 | 201 | SQL 기초 | 켄 스미스 |
1002 | 202 | 파이썬 소개 | 머린 오도넬 |
1001 | 202 | 파이썬 소개 | 머린 오도넬 |
이전 섹션에서 설명한 단계를 따라가 보겠습니다.
1. 우리의 후보 키를 식별합니다.
이 경우에 후보 키는 학생 ID와 강좌 ID의 복합 키입니다. 이 고유한 조합은 테이블의 각 행을 식별합니다.
2. 우리의 기능 종속성을 결정하세요.
코스 이름 및 강사 이름은 코스 ID에 따라 달라집니다. 완전한 합성 키(학생 ID, 코스 ID)가 아닙니다. 이것은 속성이 합성 키의 일부에만 의존하기 때문에 부분 종속성입니다.
3. 부분 종속성 제거
키의 일부에만 의존하는 속성을 새로운 테이블로 이동해야합니다 (과정명 및 강사명). 이 테이블은 과정 ID에만 기반을 둔 새로운 테이블이어야 합니다.
분해 후, 새로운 테이블은 다음과 같습니다:
강좌 등록 테이블
Student ID | Course ID |
---|---|
1001 | 201 |
1002 | 202 |
1001 | 202 |
강좌 세부 정보 테이블
직접 손으로 데이터베이스를 만들고 싶다면, 우리의 PostgresQL 강좌를 확인해보세요. 좀 더 고급 과정을 원하신다면, 개체-관계 및 차원 모델링과 같은 아이디어를 다루는 스노우플레이크의 데이터 모델링 소개를 시도해보세요.
예시 2: 주문 테이블
이 Orders 테이블부터 시작하겠습니다. 위에서 개요한 단계를 따라가보고 테이블을 직접 분해해보세요!
Order ID | Product ID | Order Date | Product Name | Supplier Name |
---|---|---|---|---|
1 | 201 | 2024-11-01 | Laptop | TechSupply |
1 | 202 | 2024-11-01 | Mouse | TechSupply |
2 | 201 | 2024-11-02 | Laptop | TechSupply |
3 | 203 | 2024-11-03 | Keyboard | KeyMasters |
1. 후보 키 식별
주문 ID와 제품 ID의 조합은 각 행을 고유하게 식별하며 (주문 ID, 제품 ID)를 복합 후보 키로 만듭니다. 각 열은 행을 고유하게 식별할 수 없습니다.:
- 주문 ID만으로는 고유하지 않습니다. 여러 제품이 동일한 주문에 포함될 수 있습니다.
- 제품 ID만으로도 고유하지 않습니다. 동일한 제품이 다른 주문에 나타날 수 있습니다.
이것은 (주문 ID, 제품 ID) 또한 우리의 기본 키라는 것을 의미합니다.
2. 우리의 기능적 종속성을 결정합니다.
주문 일자는주문 ID에 따라 달라집니다 (전체 복합 키가 아닙니다). 이것은 부분 종속성입니다.
제품 이름와공급 업체 이름은제품 ID에 의존합니다(전체 복합 키가 아닙니다). 이들은 부분 의존성입니다.
3. 부분 의존성 제거
테이블을 더 작은 테이블로 분할해야 합니다. 각각은 하나의 논리적 의존성을 다룹니다.
먼저, 주문 ID에 대한 정보를 포함하는 주문 정보 테이블을 생성합니다.
주문 테이블
Order ID | Order Date |
---|---|
1 | 2024-11-01 |
2 | 2024-11-02 |
3 | 2024-11-03 |
그 다음, 제품 ID에 대한 정보를 포함하는 테이블을 생성합니다.
주문 테이블
Product ID | Product Name | Supplier Name |
---|---|---|
201 | 노트북 | TechSupply |
202 | 마우스 | TechSupply |
203 | 키보드 | KeyMasters |
원본 테이블은 이제 합성 키와 주문 및 제품 간의 관계로 축소되었습니다.
Order ID | Product ID |
---|---|
1 | 201 |
1 | 202 |
2 | 201 |
3 | 203 |
이제 우리의 데이터베이스는 2NF에 있습니다. 1) 모든 부분 종속성이 제거되었고, 2) 비주요 속성은 각각의 기본 키에 전적으로 의존합니다.
제2정규형을 구현할 때
그래서 왜 데이터베이스를 2NF로 리팩터링해야 할까요? 그것 자체로 충분한 것인가요, 아니면 한 단계 더 나아가 3NF를 목표로 해야 할까요?
두 번째 정규형의 혜택과 한계
두 번째 정규형은 여러 가지 이점을 제공하여 데이터베이스 정규화 과정에서 유용한 단계입니다:
- 데이터 무결성 향상: 부분 종속성을 제거함으로써 2NF는 삽입, 업데이트 및 삭제 이상을 최소화하여 더 신뢰할 수 있는 데이터베이스를 만듭니다.
- 중복 감소: 2NF는 데이터 반복을 줄여 저장 공간 사용을 최적화하고 데이터 유지 관리를 간단하게 합니다.
- 개선된 데이터 구조: 세 번째 정규형으로 진행하는 것과 같은 추가 정규화를 위해 더 깨끗하고 효율적인 데이터베이스 디자인을 만들어줍니다.
하지만 일부 제한 사항이 있습니다:
- 복잡성 증가: 2NF를 충족시키기 위해 테이블을 분해하면 특히 복합 키와 종속성을 다룰 때 디자인 프로세스가 더 복잡해질 수 있습니다.
- 추가 조인: 테이블을 분할하면 쿼리에서 더 많은 조인이 필요할 수 있으며, 대용량 데이터셋이나 복잡한 쿼리를 처리하는 시스템에 영향을 줄 수 있습니다. 아래에서 자세히 다루겠습니다.
- 잔여 중복: 2NF는 부분 종속성을 줄이지만, 이차 종속성에 대해 다루지 않으므로 3NF에서 해결되기 전까지 일부 중복이 남을 수 있습니다.
두 번째 정규형에서의 성능 고려 사항
테이블을 분해하여 부분 종속성을 제거하면 데이터베이스 성능에 직접적인 영향을 줄 수 있습니다. 한편으로는 2NF를 달성하면 데이터 중복이 줄어들고 일관성이 향상되어 삽입, 업데이트 또는 삭제 작업 중 더 적은 이상현상이 발생할 수 있습니다. 다른 한편으로는 정규화가 테이블 수를 증가시킬 수 있으며, 이는 관련 데이터를 검색할 때 추가 조인이 필요하다는 것을 의미합니다. 이는 대규모 데이터셋에서 쿼리 성능에 영향을 줄 수 있습니다.
정규화된 데이터베이스가 성능을 유지하는지 확인하려면 다음 모베스트 프랙티스를 따르십시오:
- 인덱싱: 분해된 테이블 간 조인을 가속화하기 위해 인덱스를 사용하십시오.
- 쿼리 최적화: 추가 조인의 비용을 최소화하기 위해 쿼리를 최적화하십시오.
- 하이브리드 접근법: 보고서 테이블과 같이 성능이 중요한 영역에서 정규화와 비정규화를 결합합니다.
- 정기 모니터링: 프로파일링 도구를 사용하여 데이터베이스 성능을 지속적으로 평가하여 잠재적인 문제를 발견하십시오.
2NF는 제3 정규형을 달성하기 위한 과도기 단계일 뿐인가요?
대부분의 경우, 데이터베이스 디자이너들은 데이터 중복을 줄이고 전반적인 데이터 무결성을 향상시킬 수 있는 세 번째 정규형을 달성하기 위해 노력합니다. 그러나 3NF를 달성하는 것은 종종 더 많은 테이블과 관계를 생성하는 등 추가적인 작업이 필요하며, 이는 쿼리 실행에서 복잡성과 성능 트레이드오프를 도입할 수 있습니다.
2NF만 사용하는 경우에도 충분할 수 있는 경우가 있습니다. 간단함과 신속한 구현이 우선시되는 경우, 예를 들어 소규모 프로젝트, 프로토타이핑 또는 데이터 중복이 최소한인 상황 등에서는 2NF가 충분할 수 있습니다. 예를 들어, 모든 속성이 이미 단순 기본 키에 완전히 의존하는 시스템의 경우, 2NF를 달성함으로써 부분 의존성을 줄이는 주요 목표를 달성할 수 있을 수 있습니다.
두 번째 정규형을 넘어서: 세 번째 정규형으로
데이터베이스를 더 정규화하고 싶다면, 계속해서 테이블을 리팩토링하여 세 번째 정규형에 도달할 수 있습니다.
3NF는 2NF를 바탕으로 이행적 종속성을 다루면서 진화합니다 – 주 키 대신 다른 비-키 속성에 종속되는 상황입니다. 이 진화는 각 속성이 주 키에 직접 종속되고 다른 것에는 종속되지 않도록 보장합니다.
예를 들어, 수강 신청을 추적하는 테이블에서:
- 2NF: 해당 속성들이 해당 기본 키에 완전히 의존함을 보장합니다 (예: 학생 ID 및 과목 ID). 이렇게 하면 비기본 키 속성이 복합 키의 일부에만 의존하는 부분 종속성이 제거됩니다.
- 3NF: 교수 세부 정보 또는 학과 정보와 같은 속성이 별도의 테이블에 저장되어, 이원 종속성을 제거합니다.
데이터 무결성과 효율성이 중요한 복잡한 시스템에 적합한 3NF는 데이터 양이 증가할수록 더욱 중요해집니다. 3NF 및 보다 제한적인 형태인 BCNF에 대해 더 자세히 알고 싶다면 세 번째 정규형이란? 문서를 확인하세요.
결론
두 번째 정규형은 데이터베이스 정규화에서 1NF와 같은 더 낮은 형태와 3NF와 같은 더 높은 형태 사이의 연결고리 역할을 합니다. 부분 종속성을 제거함으로써 2NF는 중복을 줄이고 데이터의 신뢰성을 향상시킵니다. 일부 복잡성을 동반할 수 있지만, 향상된 데이터 무결성과 간편한 유지보수의 장점으로 인해 효과적인 데이터베이스 설계의 중요한 부분이 됩니다.
당신의 기술을 더욱 향상시키기 위해 준비가 되었다면, 정규화 기술 및 실무 응용에 대한 이해를 깊게 하기 위해 데이터베이스 디자인 과정을 탐험해보세요. 또한 SQL 및 데이터베이스 관리 기술을 검증하고 잠재적인 고용주들에게 자신의 전문성을 증명할 수도 있습니다. SQL 협회 인증도 가능합니다!
마지막으로, 비즈니스에서 의사결정을 하는 사람이라면, 더 청결하고 효율적인 데이터베이스를 만들어야 한다는 사실을 알고 계신다면, 더욱 효율적인 데이터베이스를 만들기 위해DataCamp for Business 데모 요청을 고려해보세요. 우리는 팀의 역량을 변화시켜 비즈니스 효율성과 혁신을 이끄는 확장 가능한 데이터베이스 시스템을 만들 수 있도록 도와드릴 수 있습니다. 우리는 맞춤 학습 경로와 사용자 정의 트랙까지 제공할 수 있습니다.
Source:
https://www.datacamp.com/tutorial/second-normal-form