목차
아래 글을 이해하기 위해 부족한 개념은 다음 페이지를 참고한다
함수적 종속에 대한 사항은 이번 글에서 다루지 않으니 별도 자료 참고
https://webcodur.tistory.com/65 : 함수적 종속
https://webcodur.tistory.com/66 : 키 (5종류)
(선요약) 정규화 쉽게 기억하기
다음은 각 정규화 단계의 요약이다.
1. 제1정규화 (1NF) : 모든 도메인이 원자값 | 콤마 없애기
- 각 컬럼에는 하나의 값만 존재해야 하므로, 하나의 필드에 여러 값이 콤마로 구분되어 있는 것을 없애고 각각 별도의 행으로 나타내야 한다.
2. 제2정규화 (2NF) : 부분 함수 종속 제거
- 복합 키를 사용하는 테이블에서 각 컬럼이 키의 일부가 아니라 전체 키에 함수적으로 종속되어야 한다는 개념을 강조한다. 즉, 모든 비기본 키 속성이 기본 키 전체에 종속되어야 한다.
3. 제3정규화 (3NF) : 이행 함수 제거
- 모든 비기본 키 속성이 기본 키에만 직접적으로 종속되어야 하며, 비기본 키 속성이 다른 비기본 키 속성에 종속되지 않도록 해야 한다. 다른 속성을 거쳐 종속되는 간접적 종속을 제거하는 것이 핵심이다.
4. BCNF (보이스-코드 정규형) : 모든 결정자가 후보키
- 모든 결정자가 후보 키여야 한다. 즉, 어떤 속성이 다른 속성을 결정할 때, 그 결정자는 반드시 후보 키의 일부이어야 함을 의미한다.
5. 제4정규화 (4NF) : 다치 종속 제거
- 테이블에서 하나의 키가 여러 값에 종속될 때 이러한 종속성을 분리하여, 키 하나에 종속되는 값들이 서로 독립적인 여러 테이블로 나누어 관리되어야 한다.
6. 제5정규화 (5NF) : 조인 종속 제거(이용)
- 테이블을 나누었다가 다시 조인하여도 정보 손실이 없도록 설계하는 것이 핵심이다.
제1 정규화 (1NF)
개념
- 요약: 원자화된 값의 사용
- 설명: 제1 정규화는 데이터베이스 테이블의 각 컬럼에 원자값만을 포함시키는 것을 목표로 한다. 쉽게 말해서 콤마를 없애는 작업이다.
- 1NF 결과: 모든 속성(컬럼)이 원자값을 가져야 하며, 각 행이 유일한 식별자(기본 키)를 가지고 있어야 한다.
- 핵심: 데이터 중복을 최소화하고, 갱신 이상을 방지하여 데이터 무결성을 유지할 수 있다.
정규화 예시
1️⃣ 정규화 전 테이블:
학생ID | 이름 | 수강 과목 |
1 | 홍길동 | 수학, 과학 |
2 | 이순신 | 역사 |
2️⃣ 정규화 후 테이블:
학생ID | 이름 | 수강 과목 |
1 | 홍길동 | 수학 |
1 | 홍길동 | 과학 |
2 | 이순신 | 역사 |
제2 정규화 (2NF)
개념
- 요약: 부분 함수적 종속성 제거
- 설명: 제2 정규화는 테이블이 제1 정규화를 충족한 상태에서 수행되며, 모든 비기본 키 속성이 기본 키의 전체에 대해서만 함수적으로 종속되도록 하는 것이 목표이다. 이는 기본 키가 복합 키인 경우, 기본 키의 일부에만 종속된 속성을 제거하여 분리하는 과정을 포함한다.
- 2NF 결과: 테이블이 1NF를 만족하고, 모든 비기본 키 속성이 기본 키의 전체에 대해 함수적으로 종속되어야 한다.
- 핵심: 제2 정규화를 통해 데이터 중복을 더욱 감소시키고, 갱신 이상의 가능성을 줄인다.
정규화 예시
1️⃣ 정규화 전 테이블:
학생ID | 과목ID | 이름 | 과목명 |
1 | 101 | 홍길동 | 수학 |
1 | 102 | 홍길동 | 영어 |
2 | 101 | 이순신 | 수학 |
2️⃣ 정규화 과정:
단계 1: 기본키 확인과 부분 함수적 종속성 파악
- 기본키: 학생ID와 과목ID의 조합.
- 부분 함수적 종속성 파악:
- 학생ID -> 이름
- 과목ID -> 과목명
이름 속성은 학생ID에만 종속되어 있고, 과목ID 와는 무관하다.
과목명은 과목ID에 종속되어 있고, 학생ID와는 무관하다. 이 상태는 부분 함수적 종속성을 나타낸다.
단계 2: 부분 함수적 종속성 제거를 위한 테이블 분할
- 학생 정보 테이블 생성: 학생ID와 이름을 가지는 테이블을 생성한다. 이는 학생ID가 기본키이다.
- 과목 정보 테이블 생성: 과목ID와 과목명을 포함하는 테이블을 생성한다. 이 테이블에서 과목ID는 기본키이다.
단계 3: 등록 정보 테이블 생성
- 등록 정보 테이블: 원래 테이블에서 학생ID와 과목ID를 사용하여 학생과 과목 간의 관계를 나타내는 테이블을 생성한다. 이 테이블의 기본키는 여전히 학생ID와 과목ID의 조합이다.
3️⃣ 정규화 후 테이블:
학생 :
학생ID | 이름 |
1 | 홍길동 |
2 | 이순신 |
과목 :
과목ID | 과목명 |
101 | 수학 |
102 | 영어 |
등록 정보 :
학생ID | 과목ID |
1 | 101 |
1 | 102 |
2 | 101 |
제3 정규화 (3NF)
개념
- 요약: 이행적 함수적 종속성 제거
- 설명: 제3 정규화는 테이블이 제2 정규화를 충족한 상태에서 수행된다. 기본 키가 아닌 속성 간의 이행적 종속성을 제거하여 데이터 중복을 더욱 감소시키고 데이터베이스의 무결성을 향상시키는 것이 목표이다. 이 과정에서 기본 키가 아닌 속성이 다른 비기본 키 속성에 종속된 경우, 이를 별도의 테이블로 분리한다.
- 3NF 결과: 테이블이 2NF를 만족하고, 비기본 키 속성 간에 이행적 종속성이 제거됨
- 핵심: 제3 정규화를 통해 데이터 중복을 감소시키고, 데이터베이스의 무결성 및 유지 관리의 효율성을 개선한다.
정규화 예시
1️⃣ 정규화 전 테이블 (제2 정규화 후):
과목ID | 과목명 교수 | 교수 | 연락처 |
101 | 수학 | 김교수 | 010-1234-5678 |
102 | 영어 | 이교수 | 010-8765-4321 |
2️⃣ 정규화 과정:
단계 1: 이행적 종속성 파악
- 이행적 종속성 확인: 과목ID -> 교수 -> 교수 연락처의 관계는 이행적 종속성을 나타낸다. 교수 연락처는 교수에 종속되며, 교수는 과목ID에 종속된다.
단계 2: 이행적 종속성 제거를 위한 테이블 분할
- 교수 정보 테이블 생성: 교수와 교수 연락처를 포함하는 테이블을 생성한다. 교수ID를 새로운 기본키로 도입하여 과목 테이블과 관련성을 유지한다.
- 과목 테이블 수정: 교수 대신 교수ID를 포함시켜 교수 정보 테이블과 연결한다.
3️⃣ 정규화 후 테이블:
과목 :
과목ID | 과목명 | 교수ID |
101 | 수학 | 1 |
102 | 영어 | 2 |
교수 정보 :
교수ID | 교수 | 교수 연락처 |
1 | 김교수 | 010-1234-5678 |
2 | 이교수 | 010-8765-4321 |
제3 정규화 과정을 통해 각 테이블은 최소의 중복과 최대의 독립성을 갖게 되며, 데이터 무결성과 관리 효율성이 증가한다.
BCNF (보이스-코드 정규형)
개념
- 요약: 모든 함수적 종속성이 슈퍼키에서만 발생하도록 함
- 설명: BCNF는 제3 정규화를 더욱 엄격하게 적용한 형태로, 테이블 내에서 모든 결정자가 후보 키가 되도록 한다. 이는 제3 정규화에서 허용되는 후보 키가 아닌 결정자에서의 함수적 종속을 제거하는 데 중점을 둔다. BCNF는 특히 복합 키를 포함하는 테이블에서 중요하다.
- BCNF 결과 : 테이블이 3NF를 만족하고, 모든 함수적 종속성의 결정자가 후보 키여야 한다.
- 핵심: BCNF를 통해 후보 키가 아닌 결정자로 인해 발생할 수 있는 무결성 문제를 해결하고, 데이터베이스의 정확성과 신뢰성을 높인다.
정규화
1️⃣ 정규화 전 테이블 (제3 정규화 후):
과목ID | 과목명 | 교수ID | 교수 연락처 |
101 | 수학 | 1 | 010-1234-5678 |
102 | 영어 | 2 | 010-8765-4321 |
2️⃣ 정규화 과정:
현재 과목ID를 제외한 비기본키 속성이 서로 종속족이지 않는 제3정규화가 완료된 상태이다. 얼핏 보면 과목ID ⇒교수ID ⇒ 교수 연락처로 보여, 이 경우 3차 정규화를 수행해야겠지만, 현재는 과목ID ⇒ 교수ID는 아닌 교수ID가 독립적으로 교수ID ⇒ 교수 연락처를 유지하는 상태이기 떄문이다. 여기서 BCNF 를 수행하게 된다.
단계 1: 함수적 종속성과 결정자 확인
- 함수적 종속성 분석: 교수ID-> 교수 연락처에서 교수ID는 교수 연락처의 결정자로 작용한다.
- 결정자의 후보 키 여부: 교수ID는 과목ID, 과목명과 독립적으로 교수 연락처를 결정할 수 있으다. 과목ID는 이 테이블의 후보 키로, 각 과목을 유일하게 식별한다. 교수ID는 연락처 정보를 결정하는 결정자이지만, 본 테이블에서는 후보 키가 아니다. (BCNF 위반)
단계 2: BCNF 위반 해결을 위한 테이블 분할
- 교수 정보 테이블 분할: 교수ID와 교수 연락처를 별도의 테이블로 분리하여 교수ID가 기본키가 되도록 한다.
- 이렇게 분리함으로써 모든 결정자가 후보 키가 된다.
3️⃣ 정규화 후 테이블:
과목 :
과목ID | 과목명 | 교수ID |
101 | 수학 | 1 |
102 | 영어 | 2 |
교수 정보 :
교수ID | 교수 연락처 |
1 | 010-1234-5678 |
2 | 010-8765-4321 |
BCNF를 통해 모든 함수적 종속성이 슈퍼키에서만 발생하도록 함으로써 데이터베이스의 무결성과 신뢰성이 크게 향상된다. 이는 데이터의 정확성을 보장하고, 관리를 더욱 효율적으로 할 수 있게 한다.
제4 정규화 (4NF)
개념
- 요약: 다치 종속성 제거
- 설명: 제4 정규화는 테이블이 BCNF를 만족하면서, 모든 비중복적 다치 종속성(multivalued dependencies)이 제거되도록 하는 과정이다. 다치 종속성이란, 하나의 속성이 다른 속성에 대해 두 개 이상의 독립적인 값을 갖는 종속성을 의미한다. 이 정규화 과정을 통해 테이블에서 불필요한 데이터 중복을 더욱 줄이고, 더 복잡한 데이터 구조를 효율적으로 관리한다.
- 결과: 테이블이 BCNF를 만족하고, 다치 종속성이 제거된다.
- 핵심: 제4 정규화를 통해 테이블 구조의 복잡성을 줄이고, 데이터의 무결성을 높이며, 쿼리 성능을 개선한다.
정규화
1️⃣ 정규화 전 테이블 (BCNF 정규화 후):
과목ID | 과목명 | 교수ID | 교재 |
101 | 수학 | 1 | 산수 교재 |
101 | 수학 | 1 | 대수 교재 |
102 | 영어 | 2 | 문법 교재 |
102 | 영어 | 2 | 작문 교재 |
2️⃣ 정규화 과정:
단계 1: 다치 종속성 파악
- 다치 종속성 확인: 과목ID와 교수ID가 결정되면 교재는 여러 개의 값(다치 종속)을 가질 수 있다. 이는 과목ID에 대해 교재가 다치 종속성을 가진다는 것을 의미한다.
단계 2: 다치 종속성 제거를 위한 테이블 분할
- 과목-교재 테이블 생성: 과목ID를 기준으로 교재 정보를 분리하여 새로운 테이블을 생성한다. 이 테이블은 과목ID와 교재를 포함하며, 과목ID가 기본키가 된다.
3️⃣ 정규화 후 테이블:
과목 :
과목ID | 과목명 | 교수ID |
101 | 수학 | 1 |
102 | 영어 | 2 |
과목-교재 :
과목ID | 교재 |
101 | 산수 교재 |
101 | 대수 교재 |
102 | 문법 교재 |
102 | 작문 교재 |
제4 정규화 과정을 통해 각 속성 간의 독립성이 강화되고, 테이블의 무결성 및 쿼리 성능이 향상된다. 이는 데이터 관리의 효율성을 높이고, 데이터베이스 설계의 복잡성을 감소시킨다.
제5 정규화 (5NF)
개념
- 요약: 조인 종속성 제거 (= 조인 종속성 이용)
- 설명: 제5 정규화는 테이블이 이미 4NF를 만족하면서, 모든 조인 종속성이 후보 키를 통해서만 만족되도록 하는 과정이다. 조인 종속성이란 테이블을 분할했을 때, 그 분할된 테이블들을 다시 조인하였을 때 원래의 테이블과 정보 손실 없이 동일하게 재구성될 수 있는 종속성을 의미한다. 이 정규화 과정을 통해 데이터의 중복을 최소화하고, 더 복잡한 데이터 구조를 효율적으로 관리할 수 있다.
- 결과: 테이블이 5NF를 만족하며, 조인 종속성이 제거된다.
- 핵심: 제5 정규화를 통해 테이블 구조의 복잡성을 더욱 줄이고, 데이터의 무결성을 높이며, 쿼리 성능을 개선한다.
정규화
1️⃣ 정규화 전 테이블 (4NF 정규화 후):
학생ID | 과목 코드 | 교수님 이름 |
S1 | C1 | Prof. A |
S1 | C2 | Prof. B |
S2 | C1 | Prof. A |
S2 | C3 | Prof. C |
2️⃣ 정규화 과정:
단계 1: 조인 종속성 파악
- 조인 종속성 확인: 과목 코드와 교수님 이름의 조합은 과목 코드에 의해 결정되며, 이 조합은 학생 ID와는 독립적이다. 즉, 테이블을 분할하여도 원래 테이블을 재구성할 수 있다.
단계 2: 조인 종속성 제거를 위한 테이블 분할
- 학생과 과목 테이블 (학생 ID, 과목 코드)
- 과목과 교수 테이블 (과목 코드, 교수님 이름)
- 학생 정보 테이블 (학생 ID, 학생 이름, 학생 연락처 등)
3️⃣ 정규화 후 테이블:
1. 학생과 과목 :
학생 ID | 과목 코드 |
S1 | C1 |
S1 | C2 |
S2 | C1 |
S2 | C3 |
2. 과목과 교수 :
과목 코드 | 교수님 이름 |
C1 | Prof. A |
C2 | Prof. B |
C3 | Prof. C |
3. 학생 정보 :
학생 ID | 학생 이름 | 학생 연락처 |
S1 | John Doe | 123-456-7890 |
S2 | Jane Doe | 987-654-3210 |
제5 정규화 과정을 통해 각 속성 간의 독립성이 강화되고, 테이블의 무결성 및 쿼리 성능이 더욱 향상된다. 이는 데이터 관리의 효율성을 높이고, 데이터베이스 설계의 복잡성을 감소시킨다.
'DBMS > SQL' 카테고리의 다른 글
[SQL] SQL 정규표현식 가이드 (0) | 2024.04.30 |
---|---|
[데이터베이스] SQL 치팅시트: DDL, DML, DCL 커맨드 목록 (0) | 2024.04.21 |
[데이터베이스] DB용어 - 키 (슈퍼키, 후보키, 기본키, 대체키, 외래키) (1) | 2024.04.14 |
[데이터베이스] DB용어 - [완전, 이행, 부분] 함수(적) 종속 (0) | 2024.04.14 |
[데이터베이스] 무결성 제약 조건 (Integrity Constraints : IC) (0) | 2024.03.21 |