테이블 설계의 기본 정규화

2023. 6. 27. 13:04DB

728x90

테이블 설계

  • 테이블은 어떤 공통된 속성을 가진 집합이다.
    1. 테이블 명은 집합 명사나 복수 명사가 되어야한다.
    2. 테이블은 현실 세계의 개념이나 집합을 나타낸 것이다.
    3. 공통된 속성들 중 선택되어야 하는 것은 가장 상위의 개념 집합이다.
      1. 아래의 경우 중 2번째가 더 효율적이다. → 테이블에 접근 VS where 구문 사용
        1. 회원을 등급(일반,프리미엄)으로 나누는 경우 → 일반 유저 테이블, 프리미엄 유저 테이블
        2. 회원에 등급 컬럼이 있는 경우
  • 반드시 기본키를 설정할 것

 

결론 : 테이블이란 고유한 기본키를 가진 공통점에 의해 정의된 것들의 집합이다!

 

정규형

정규형은 데이터의 갱신이 발생한 경우에도 부정합이 발생하기 어려운 테이블의 형태이다.

 

제 1 정규형(1NF)

제 1 정규형의 정의는 ‘테이블 셀에 복합적인 값을 포함하지 않는다’이다.

(기본적으로 관계형 데이터베이스에서는 제 1정규형을 다 만족한다.)

 

💡 왜 그래야할까??

테이블 셀에 복합적인 값을 가질 수 있게 한다면, 레코드의 단일성을 보장하지 못 한다.

 

<사원 테이블>

사원ID 사원 이름 사원 나이 피부양자
1 44 김씨
2 34 박씨
3 55 조씨,남씨

 

위의 표는 제 1정규형을 만족하지 못 한다.

 

왜냐하면, 사원 ID 3인 행의 피부양자가 배열로 적혀있기 때문이다.

 

사원 집합에서 피부양자라는 집합까지 동시에 관리하는 것은 바람직하지 않다.

 

따라서, 사원이라는 집합과 피부양자라는 집합을 분리해서 관리하도록 하자!

 

<사원 테이블>

사원ID 사원 이름 사원 나이
1 44
2 34
3 55

 

<피부양자 테이블>

피부양자 ID 이름 나이 사원 ID
1 김씨 12 1
2 박씨 15 2
3 조씨 7 3
4 남씨 10 3

 

여기서 알 수 있는 사실 :  사원과 피부양자가 1:N 관계일때 N에 FK가 있어야 한다는 것!

 

제 2 정규형(2NF)

 

제 2 정규형은 제 1정규형을 진행한 테이블에 모든 속성이 기본 키에 완전 함수 종속 되도록 테이블을 분해하는 것입니다.

 

예를 들어서, 다음과 같이 수강 강좌 테이블이 있다고 하자(제 2정규화 x)

 

<수강 강좌 테이블>

학생 번호 강좌 이름 강의실 성적
501 DB 110 A+
401 DB 110 B
502 DS 111 A
501 DS 111 C
503 OS 111 B+

 

이 테이블의 기본키는 {학생 번호, 강좌 이름}으로 복합키이다.

 

하지만 이 테이블에는 다음과 같은 함수 종속이 존재합니다.

  • {학생 번호} → {성적}
  • {강좌 이름} → {강의실}

 

부분 함수 종속 즉, 기본 키를 구성하는 열의 일부에만 함수 종속이 존재하기 때문에 제 2 정규형을 만족하지 못 합니다.

따라서, 제 2 정규형을 만족시키기 위해서는 다음과 같이 분해하여야 합니다.

 

<수강 강좌 테이블>

학생 번호 강좌 이름 성적
501 DB A+
401 DB B
502 DS A
501 DS C
503 OS B+

<강좌 테이블>

강좌 이름 강의실
DB 110
DS 111
OS 111

 

  • 기존 테이블은 본래 가지고 있던 기본키를 가짐
  • 분해된 테이블은 기본키의 일부인 {강좌 이름}을 기본키로한 테이블

 

TIP : 기본키를 기준으로 생각해라, PK가 복합키가 아니면 제 2 정규형 만족.

 

💡 분해 안 할 경우 생기는 문제점이 뭘까??

DB 강의실이 변경된 경우 (갱신 이상)

분해되기 전 테이블에서는 갱신을 2번 해줘야함. → 복수의 행을 갱신해줘야 하기 때문에 불편함, 만약 다 갱신을 안 해줬을 경우에 위험함.
분해할 경우 갱신 1번만 해도 됨.

 

제 3 정규형(3NF)

제 3 정규형은 제 2 정규형을 진행한 테이블에서 이행적 종속을 없애도록 테이블을 분해한 것이다.

 

💡 이행적 종속이란

테이블의 함수 종속 중 함수 종속이 2단계에 걸쳐서 일어나는 것

{x} → {y} {y} → {z}

이 경우, 이행적 종속이 존재하는 것

 

<강좌 테이블>

강좌 이름 강의실 강좌 허용 인원
DB 110 50
DS 111 40
OS 111 40

 

기본키는 {강좌 이름이}고 위 테이블은 제 1,2 정규형을 만족한다.

 

현재, 다음과 같은 이행적 종속이 존재한다.

 

{강좌이름} → {강의실} , {강의실} → {강좌 허용 인원}

 

따라서, 다음과 같이 분리한다.

 

<강좌 테이블>

강좌 이름 강의실
DB 110
DS 111
OS 111

<강의실 테이블>

강의실 강좌 허용 인원
110 50
111 40

위 테이블의 기본키는 각각 {강좌 이름}, {강의실}이다.

 

💡 만약 분해하지 않았을 경우에는 제 2정규화와 마찬가지로 갱신 이상이 발생할 가능성이 있다.

 

 

내가 이해한 것  : 제 2 정규형과 제 3정규형의 차이는 함수 종속의 발생 위치가 복합키인 기본키인가 기본키 이외의 곳인가로 구분 되는 것 같다!

 

 

 

728x90