본문 바로가기
DBMS/SQL

[데이터베이스] 정규화(Normalization) (1NF - 5NF)

by webcodur 2024. 4. 15.
728x90

 

목차

     

     

    아래 글을 이해하기 위해 부족한 개념은 다음 페이지를 참고한다

    함수적 종속에 대한 사항은 이번 글에서 다루지 않으니 별도 자료 참고

    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. 요약: 원자화된 값의 사용
    2. 설명: 제1 정규화는 데이터베이스 테이블의 각 컬럼에 원자값만을 포함시키는 것을 목표로 한다. 쉽게 말해서 콤마를 없애는 작업이다. 
    3. 1NF 결과: 모든 속성(컬럼)이 원자값을 가져야 하며, 각 행이 유일한 식별자(기본 키)를 가지고 있어야 한다.
    4. 핵심: 데이터 중복을 최소화하고, 갱신 이상을 방지하여 데이터 무결성을 유지할 수 있다.

    정규화 예시

    1️⃣ 정규화 전 테이블:

    학생ID  이름  수강 과목
    1 홍길동 수학, 과학
    2 이순신 역사

     

    2️⃣ 정규화 후 테이블:

    학생ID  이름  수강 과목
    1 홍길동 수학
    1 홍길동 과학
    2 이순신 역사

     

     

    제2 정규화 (2NF)

    개념

    1. 요약: 부분 함수적 종속성 제거
    2. 설명: 제2 정규화는 테이블이 제1 정규화를 충족한 상태에서 수행되며, 모든 비기본 키 속성이 기본 키의 전체에 대해서만 함수적으로 종속되도록 하는 것이 목표이다. 이는 기본 키가 복합 키인 경우, 기본 키의 일부에만 종속된 속성을 제거하여 분리하는 과정을 포함한다.
    3. 2NF 결과: 테이블이 1NF를 만족하고, 모든 비기본 키 속성이 기본 키의 전체에 대해 함수적으로 종속되어야 한다.
    4. 핵심: 제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)

    개념

    1. 요약: 이행적 함수적 종속성 제거
    2. 설명: 제3 정규화는 테이블이 제2 정규화를 충족한 상태에서 수행된다. 기본 키가 아닌 속성 간의 이행적 종속성을 제거하여 데이터 중복을 더욱 감소시키고 데이터베이스의 무결성을 향상시키는 것이 목표이다. 이 과정에서 기본 키가 아닌 속성이 다른 비기본 키 속성에 종속된 경우, 이를 별도의 테이블로 분리한다.
    3. 3NF 결과: 테이블이 2NF를 만족하고, 비기본 키 속성 간에 이행적 종속성이 제거됨
    4. 핵심: 제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 (보이스-코드 정규형)

    개념

    1. 요약: 모든 함수적 종속성이 슈퍼키에서만 발생하도록 함
    2. 설명: BCNF는 제3 정규화를 더욱 엄격하게 적용한 형태로, 테이블 내에서 모든 결정자가 후보 키가 되도록 한다. 이는 제3 정규화에서 허용되는 후보 키가 아닌 결정자에서의 함수적 종속을 제거하는 데 중점을 둔다. BCNF는 특히 복합 키를 포함하는 테이블에서 중요하다.
    3. BCNF 결과 : 테이블이 3NF를 만족하고, 모든 함수적 종속성의 결정자가 후보 키여야 한다.
    4. 핵심: 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)

    개념

    1. 요약: 다치 종속성 제거
    2. 설명: 제4 정규화는 테이블이 BCNF를 만족하면서, 모든 비중복적 다치 종속성(multivalued dependencies)이 제거되도록 하는 과정이다. 다치 종속성이란, 하나의 속성이 다른 속성에 대해 두 개 이상의 독립적인 값을 갖는 종속성을 의미한다. 이 정규화 과정을 통해 테이블에서 불필요한 데이터 중복을 더욱 줄이고, 더 복잡한 데이터 구조를 효율적으로 관리한다.
    3. 결과: 테이블이 BCNF를 만족하고, 다치 종속성이 제거된다.
    4. 핵심: 제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)

    개념

    1. 요약: 조인 종속성 제거 (= 조인 종속성 이용)
    2. 설명: 제5 정규화는 테이블이 이미 4NF를 만족하면서, 모든 조인 종속성이 후보 키를 통해서만 만족되도록 하는 과정이다. 조인 종속성이란 테이블을 분할했을 때, 그 분할된 테이블들을 다시 조인하였을 때 원래의 테이블과 정보 손실 없이 동일하게 재구성될 수 있는 종속성을 의미한다. 이 정규화 과정을 통해 데이터의 중복을 최소화하고, 더 복잡한 데이터 구조를 효율적으로 관리할 수 있다.
    3. 결과: 테이블이 5NF를 만족하며, 조인 종속성이 제거된다.
    4. 핵심: 제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 정규화 과정을 통해 각 속성 간의 독립성이 강화되고, 테이블의 무결성 및 쿼리 성능이 더욱 향상된다. 이는 데이터 관리의 효율성을 높이고, 데이터베이스 설계의 복잡성을 감소시킨다.