1. 정규화(Normalization)
정규화는 데이터베이스 설계의 핵심 부분으로, 데이터를 체계적으로 구성하여 효율과 일관성을 높이는 과정이다. 정규화가 중요한 이유는, 잘못 구성된 데이터베이스는 중복된 데이터, 업데이트 시의 문제, 데이터 무결성 문제 등을 야기할 수 있기 때문이다.
정규화의 기본 원칙
정규화의 기본적인 원칙은 중복을 최소화하고, 데이터 무결성을 유지하는 데 있다. 이를 통해 데이터를 더 작고, 관리하기 쉬운 부분으로 나누어 업데이트, 삭제, 추가 시 발생할 수 있는 문제들을 예방한다.
정규화 과정은 여러 단계로 나뉘어진다. 각 단계를 "정규형 (NF)"이라고 부른다. 데이터베이스 설계에 있어서 정규화는 매우 중요한 과정이다. 하지만 모든 것에는 장단점이 있듯이, 정규화도 장점과 함께 단점을 가지고 있다.
정규화의 장점
1. 데이터 중복 감소 : 정규화는 데이터 중복을 최소화한다. 이는 데이터의 일관성과 무결성을 유지하는 데 중요하다.
2. 데이터 무결성 향상 : 중복이 줄어들면서 데이터베이스 내의 오류 발생 확률이 감소하며, 데이터의 정확성과 신뢰성이 증가한다.
3. 쿼리 성능 개선 : 중복 데이터가 줄어들면 쿼리가 더 빨리 처리될 수 있다. 특히 대용량 데이터베이스에서 이 장점이 두드러진다.
4. 유지보수 용이성 : 데이터가 잘 조직되어 있으면 시스템의 변경이나 확장이 더 쉬워진다. 예를 들어서 새로운 데이터 유형을 추가하거나 혹은 기존 데이터를 수정 및 삭제할 때 오류 가능성이 줄어든다.
정규화의 단점
1. 조인 연산 증가 : 데이터가 여러 테이블로 분산되면서 필요한 정보를 얻기 위해 여러 테이블을 조인해야 한다. 이는 쿼리의 복잡성을 증가시키고 성능 저하를 가져올 수 있다.
2. 설계의 복잡성 증가 : 각 단계의 정규형을 적용할 때마다 테이블 구조가 복잡해질 수 있다. 이로 인해 데이터베이스 설계와 관리가 더 어려워질 수 있다.
3. 성능 저하 : 때로는 정규화가 성능을 저하시키는 일도 생긴다. 특히, 대량의 데이터를 처리해야 하는 응용 프로그램에서는 조인 연산이 성능에 부정적인 영향을 줄 수 있다.
2. 제 1 정규형 (1NF)
1NF는 테이블의 각 컬럼이 원자값을 가져야 한다는 규칙을 갖는다. 원자값이란 더 이상 나눌 수 없는 단일 값을 뜻한다.
예시
ID | 취미 |
1 | 등산,독서 |
2 | 영화감상 |
위 테이블에서는 한 컬럼에 "등산,독서"와 같이 여러 취미를 쉼표로 구분하여 저장하였다. 이는 취미 컬럼이 원자값을 가지지 않는 것에 위배된다. 때문에 아래와 같이 1NF를 통하여 각 취미를 별도의 행으로 분리하여 각 컬럼이 원자값을 가지게 하는 것을 목표로 한다.
1NF 만족
ID | 취미 |
1 | 등산 |
1 | 독서 |
2 | 영화감상 |
3. 제 2 정규형 (2NF)
2NF는 1NF를 만족하면서, 테이블의 모든 비키(Non-Key)컬럼이 테이블의 기본키에 완전히 함수적으로 종속되어야 한다.
예시
ID | 취미 | 이름 |
1 | 등산 | 홍길동 |
1 | 독서 | 홍길동 |
2 | 영화감상 | 이순신 |
사용자 ID와 취미로 구성된 테이블에서 사용자 이름이 추가된 경우이다. 위 테이블에서는 이름은 ID에만 종속되어 있지만, 취미에는 종속되어 있지 않는다. 때문에 사용자 정보와 취미를 별도의 테이블로 분리하여 2NF를 만족시킬 수 있다.
2NF 만족
취미 테이블:
ID | 취미 |
1 | 등산 |
1 | 독서 |
2 | 영화감상 |
사용자 테이블:
ID | 이름 |
1 | 홍길동 |
2 | 이순신 |
4. 제 3 정규형 (3NF)
3NF는 2NF를 만족하면서 모든 비키(Non-Key) 컬럼이 기본키에만 직접적으로 종속되어야 된다. 때문에 이행적 종속을 제거하는데 목표를 갖는다.
예시
사용자 테이블:
ID | 이름 | 도시 | 우편번호 |
1 | 홍길동 | 서울 | 1000 |
2 | 이순신 | 부산 | 2000 |
사용자 테이블에 도시,우편번호가 추가된 테이블이다. 위 테이블을 자세히 본다면 도시는 ID에 종속되어 있지만, 우편번호는 도시 컬럼에 종속되어 우편번호 -> 도시, 도시 -> ID 에 의존하게 됨에 따라 결국 우편번호 -> ID에 의존하게된다. 즉, 이행적으로 종속되어있음을 확인할 수 있다. 때문에 이행적 종속을 제거하고 도시 컬럼에만 종속시키기 위해 도시 테이블을 만든다.
3NF 만족
사용자 테이블 :
ID | 이름 | 도시 |
1 | 홍길동 | 서울 |
2 | 이순신 | 부산 |
도시 테이블 :
도시 | 우편번호 |
서울 | 1000 |
부산 | 2000 |
5. BCNF (Boyce-Codd Normal Form)
BCNF는 3NF를 만족하면서, 모든 결정자가 후보키가 되어야 한다. 즉, BCNF에서는 모든 함수적 종속성이 후보키에만 의존해야 한다. 후보키는 테이블을 유일하게 식별할 수 있는 최소한의 컬럼 집합을 말한다. 이는 3NF에서 요구하는 모든 비키(Non-Key) 속성이 기본키에만 의존해야 한다는 규칙을 한 단계 더 발전시킨 것입니다.
예시
강의 스케줄 테이블:
강사 | 강의실 번호 | 강의시간 |
김교수 | A101 | 오전 |
이교수 | A101 | 오후 |
박교수 | B201 | 오전 |
최교수 | B201 | 오후 |
위 테이블은 대학교의 강의 스케줄에 관련된 테이블이다. 이 테이블에서는 강의실 번호, 강의 시간, 강사 3개의 컬럼이 있다. 각 강의실에서는 특정 시간에 특정 강사가 강의를 진행한다. 위 테이블에서 '강의실 번호'와 '강의시간'은 함께 강의를 구분하는 기본키다. 하지만 '강사'는 강의실번호와 강의시간에 의해 결정되는 것이 아닌, 각각 별도로 결정될 수 있다. 즉 '강사'는 결정자이지만 후보키가 아닌 것이다. 이는 BCNF를 위반하는 것이다.
BCNF 만족
강의 스케줄 테이블 :
강의실 번호 | 강의시간 |
A101 | 오전 |
A101 | 오후 |
B201 | 오전 |
B201 | 오후 |
강사 할당 테이블 :
강사 | 강의실 번호 | 강의시간 |
김교수 | A101 | 오전 |
이교수 | A101 | 오후 |
박교수 | B201 | 오전 |
최교수 | B201 | 오후 |
위처럼 분리함으로 각 테이블은 BCNF를 만족하게 된다. 강의 스케줄 테이블에서는 '강의실 번호'와 '강의 시간'이 유일한 결정자이며, 강사 할당 테이블에서는 '강사'가 해당 강의실과 시간에 의해 결정되기 때문이다.
6. 제 4 정규형 (4NF)
4NF는 3NF를 만족하면서 모든 비중복성(non-trivial) 다중값 종속성이 후보키에만 의존할 때 달성된다. 간단히 말해서 테이블 내에서 어떤 컬럼이 다른 컬럼에 종속되어 있지 않아야 한다.
다중값 종속성 (Multivalued Dependency)
다중값 종속성은 한 테이블 내에서 하나의 컬럼이 다른 컬럼에 종속되어 있으나, 이 종속성이 키에 대한 것이 아니라, 컬럼 간의 관계에 의한 것을 말한다. 예를들어 A 컬럼의 값이 B 컬럼의 값에 영향을 주지만, B 컬럼의 값은 A 컬럼의 값에 독립적으로 여러 값을 가질 수 있는 것을 의미한다.
예시
학생 테이블 :
이름 | 취미 | 언어 |
홍길동 | 등산 | 한국어 |
홍길동 | 등산 | 영어 |
홍길동 | 요리 | 한국어 |
홍길동 | 요리 | 영어 |
이순신 | 독서 | 한국어 |
이순신 | 독서 | 중국어 |
위 테이블에서 취미와 언어는 이름에 다중값 종속되어 있고, 서로 독립적이다. 이는 각 학생의 취미와 언어가 다른 컬럼에 의존하지 않고 별도로 여러 값을 가질 수 있음을 의미한다. 이런 구조는 데이터 중복을 야기하며, 업데이트 이상 현상을 초래하게 된다.
4NF 만족
학생취미 테이블 :
이름 | 취미 |
홍길동 | 등산 |
홍길동 | 요리 |
이순신 | 독서 |
학생언어 테이블 :
이름 | 언어 |
홍길동 | 한국어 |
홍길동 | 영어 |
이순신 | 중국어 |
이순신 | 중국어 |
이렇게 분리함으로써 각 테이블은 이름에 대한 다중값 종속성을 해결하며 4NF를 만족하게 된다. 이 구조에서 데이터 중복이 줄어들고, 데이터 무결성이 향상된다.
7. 제 5 정규형 (5NF)
5NF는 테이블이 프로젝션-조인 과정을 통해서 분해된 후에도 원래의 테이블로 다시 조합될 수 있을 때 달성된다. 이는 테이블에 존재하는 모든 조인 종속성이 후보키를 기반으로 한다는 것을 의미한다.
예시
초기 테이블 구조 (5NF 위반 가능성이 있는 테이블) :
강사 | 과목 | 교실 |
김교슈 | 수학 | 101 |
김교수 | 물리 | 102 |
이교수 | 수학 | 101 |
이교수 | 물리 | 103 |
위 테이블에서 각 강사가 여러 과목을 가르치고, 각 과목은 여려 교실에서 진행된다. 이 경우 테이블에는 실제로 존재하지 않는 조합(예시: 김교수 -물리 - 103호 교실)이 암시될 수 있다. 이것은 아래와 같은 분리를 통해 강사와 과목, 과목과 교실 간의 실제 관계를 더 명확하게 표현하여 중복을 줄일 수 있다. 각 테이블은 5NF를 만족하며 이들 테이블을 조인하여 원래의 데이터를 복원할 수 있게 된다.
5NF 만족
강사와 과목 테이블 :
강사 | 과목 |
김교슈 | 수학 |
김교수 | 물리 |
이교수 | 수학 |
이교수 | 물리 |
과목과 교실 테이블 :
과목 | 교실 |
수학 | 101 |
물리 | 102 |
수학 | 101 |
물리 | 103 |
최종 요약
데이터베이스 정규화는 데이터의 중복을 최소화하고, 무결성을 유지하는 데 목적을 둔 프로세스이다. 각 정규형은 데이터베이스 설계에서 특정 유형의 문제를 해결하도록 도와준다.
1. 제 1 정규형 (1NF)
목적: 모든 컬럼의 값이 원자값(Atomic Value)이 되도록 한다.
특징: 각 컬럼에는 단일 값만 포함되며, 반복되는 그룹이나 배열을 허용하지 않는다.
2. 제 2 정규형 (2NF)
목적: 부분 함수적 종속성을 제거한다.
조건: 1NF를 만족하며, 모든 비키(Non-Key) 속성이 기본키 전체에 대해 함수적으로 종속되어야 한다.
함수적 종속성 (Functional Dependency)
정의: 한 속성(또는 속성의 집합)의 값이 다른 속성의 값을 유일하게 결정하는 관계.
예시: '학생 ID'가 '학생 이름'을 결정한다. 즉, '학생 ID'를 알면 '학생 이름'을 알 수 있다.
3. 제 3 정규형 (3NF)
목적: 이행적 종속성을 제거한다.
조건: 2NF를 만족하며, 모든 비키 속성이 기본키에 직접적으로 종속되어야 한다.
이행적 종속성 (Transitive Dependency)
정의: 한 속성 A가 다른 속성 B에 함수적으로 종속되고, B가 또 다른 속성 C에 함수적으로 종속될 때, A는 C에 이행적으로 종속된다 한다.
예시: '학생 ID'가 '학과 ID'에 종속되고, '학과 ID'가 '학과장'에 종속된 경우, '학생 ID'는 '학과장'에 이행적으로 종속된다.
BCNF (Boyce-Codd Normal Form)
목적: 모든 결정자가 후보키가 되도록 한다.
조건: 3NF를 만족하며, 모든 결정자가 후보키 집합에 속해야 한다.
4. 제 4 정규형 (4NF)
목적: 다중값 종속성을 제거한다.
조건: 3NF or BCNF를 만족하며, 모든 비중복성 다중값 종속성이 후보키에만 의존해야 한다.
다중값 종속성 (Multivalued Dependency)
정의: 한 속성 A의 값이 다른 속성 B의 여러 값에 종속되는 경우를 말한다. 이 때, A의 값에 대한 B의 모든 값이 독립적으로 존재할 수 있다.
예시: '학생'이 '과목'과 '취미' 두 가지 속성에 독립적으로 종속되는 경우. '학생'이 '수학'과 '영어'를 듣고, '등산'과 '독서'를 취미로 가질 수 있다.
5. 제 5 정규형 (5NF)
목적: 조인 종속성을 해결한다.
조건: 모든 조인 종속성이 후보키에 기반해야 한다.
조인 종속성 (Join Dependency)
정의: 한 테이블이 여러 테이블로 분해되었을 때, 이 분해된 테이블들을 조인하여 원래의 테이블을 완벽하게 복원할 수 있는 속성의 관계를 뜻한다.
예시: '학생-과목' 테이블과 '과목-교수' 테이블이 있을 때, 이 두 테이블을 조인하면 '학생-과목-교수'의 원래 데이터를 정확히 복원할 수 있다.
정규화의 중요성
장점: 데이터 중복 감소, 무결성 향상, 쿼리 성능 개선, 유지보수 용이성 증가 등
단점: 과도한 정규화는 데이터베이스 설계의 복잡성을 증가시키고, 성능 저하를 야기할 수 있음
'CapacityBuilding > SQLD 취득' 카테고리의 다른 글
[SQLD] SQL 기본 - SELECT, WHERE, GROUP BY, HAVING, ORDER BY 요약 (1) | 2024.02.06 |
---|---|
[SQLD] 데이터 모델과 SQL - 관계/조인, 트랜잭션, Null속성, 본질 vs 인조 식별자 요약 (2) | 2024.02.05 |
[SQLD] 데이터 모델링의 이해 - 관계, 식별자 요약 (0) | 2024.02.01 |
[SQLD] 데이터 모델링의 이해 - 엔터티, 속성 요약 (0) | 2024.01.31 |
[SQLD] 데이터 모델링의 이해 - 데이터 모델링의 이해 요약 (2) | 2024.01.30 |