데이터베이스 정규화 예시로 이해하기 (1NF, 2NF, 3NF, 4NF, 5NF)

노을·2024년 12월 8일
0

데이터베이스

목록 보기
2/2

데이터베이스 지식이 궁금하기도 했고, 목표를 두고 명확한 결과가 있으면 동기부여를 받을 수 있지 않을까 해서 sqld 자격증을 취득했다.

공부를 하면서 5개의 정규화를 더욱 이해할 수 있게 되어 포스팅을 하게 되었다. 정규화는 예시 테이블을 보는게 제일 좋은데, 내가 이해가는 간결한 예시들을 모아놓았다.



제 1 정규화

각 속성에 하나의 값만 저장한다.

제 1 정규화 적용 전

학생ID이름수강 과목
1김철수수학, 영어
2이영희과학
3박지훈영어, 역사, 미술

수강과목 칼럼에 여러 값이 포함되어 있다. 그래서 특정 과목 기준으로 검색하기 어려워진다. "영어를 수강하는 학생"을 조회하려면 문자열을 분리하는 작업이 필요하다.

제 1 정규화 적용 후

학생ID이름수강 과목
1김철수수학
1김철수영어
2이영희과학
3박지훈영어
3박지훈역사
3박지훈미술

수강과목 칼럼은 하나의 값만 가진다. WHERE 수강 과목 = '영어'로 간단히 검색 가능!



제 2 정규화

엔티티의 모든 일반 속성은, 반드시 주 식별자의 모든 속성들에 부분종속이 아닌 완전 종속을 가져야 한다. (부분 함수 종속성 제거)

제 1 정규화를 만족하는 상태에서, 모든 일반 속성은 주식별자에 완전 함수 종속성을 가져야 한다.


제2정규화 적용 전 (부분 함수 종속성 존재)

학생ID과목교수명학점
1수학김교수A
1영어이교수B
2수학김교수B
3역사박교수A

주식별자는 학생ID+ 과목이다. 학생ID+ 과목의 값에 따라 다른 학생 이름, 교수명, 강의실이 정해진다.

학점학생ID과목에 완전 종속되어 있다.

근데 교수명은과목에만 종속된다. (부분 함수 종속성 존재)

제2정규화 적용 후

1. 강의 정보

과목교수명
수학김교수
영어이교수
역사박교수
  • 교수명과목에 종속되므로, 이를 분리한다.

2. 수강 정보

학생ID과목학점
1수학A
1영어B
2수학B
3역사A
  • 학점학생ID과목에 완전히 종속되므로 그대로 유지.



제 3 정규화

일반 속성들은 주식별자에만 함수적 종속을 가져야 한다. (이행적 함수 종속 제거)


제3정규화 적용 전

학생ID학생 이름학과ID학과명
1홍길동101컴퓨터공학
2이영희102경영학
2이영희101컴퓨터공학

주식별자는 학생ID이다.

학과ID는 학생ID로 결정된다. 근데 학과명은 학생 ID가 아닌 학과ID가 결정한다

(학생ID → 학과ID → 학과명라는 이행적 종속 발생)


제3정규화 적용 후

1. 학생

학생ID학생 이름
1홍길동
2이영희

2. 학생-학과

학생ID학과ID
1101
2102
2101

3. 학과

학과ID학과명
101컴퓨터공학
102경영학



제 4 정규화

하나의 속성이 여러 속성에 영향을 미친다. 근데 그 여러가지 속성들이 독립적이다. (다치 종속성 제거)


제4정규화 적용 전

학생ID언어악기
1영어피아노
1스페인어피아노
1영어기타
1스페인어기타
2중국어바이올린
2한국어바이올린

위 테이블에서는 학생이 여러 언어를 배우고, 여러 악기를 다룬다는 것을 알 수 있다.

근데 학생이 배우는 언어와 학생이 다루는 악기는 서로 독립적인 정보이다. (다치 종속성!)

따라서 중복되는 정보가 많아진다. (학생 1은 영어스페인어를 배우지만, 피아노기타도 각각 중복적으로 나오고 있다.)

제4정규화 적용 후

제4정규화를 적용하려면 언어악기를 각각 독립적인 테이블로 분리해야 한다.

1. 학생-언어

학생ID언어
1영어
1스페인어
2중국어
2한국어

2. 학생-악기

학생ID악기
1피아노
1기타
2바이올린



제 5 정규화

  • 데이터를 여러 테이블로 나누는 작업을 통해 중복을 없앤다.
  • 나눈 데이터를 필요할 때 조인해서 합쳤을 때도 원래의 정보와 동일하게 복원될 수 있어야 한다.
  • 조인을 통해서만 복원 가능한 데이터 구조를 방지한다.

제5정규화 적용 전

학생ID과목교수교재
1수학김교수수학책
1영어이교수영어책
2수학김교수수학책
3물리박교수물리책
  • 모든 정보가 하나의 테이블에 결합되어 있어 중복이 많다.
    • "김교수는 항상 수학책을 사용한다"는 정보가 여러 행에 반복됨.
  • 데이터 수정 시, 여러 곳을 동시에 수정해야 하는 데이터 일관성 문제가 발생한다.
    • 예: 김교수가 다른 책을 사용하기로 하면, 모든 관련 행을 수정해야 함.

조인 종속성

  • 테이블이 분리된 상태에서 조인을 통해서만 의미 있는 데이터를 복구할 수 있는 상태
  • 무조건 조인이 생겼다고 조인종속성이 발생한 것이 아니다.

조인 종속성 제거의 핵심

  • 필요한 경우, 조인으로 데이터를 조합할 수 있으나, 조인의 필요성을 최소화한 구조로 데이터 일관성을 높인다.
    • 예를 들어, "김교수는 항상 수학책 사용"이라는 정보는 과목-교수과목-교재 테이블로 충분히 관리됨.


제5정규화 적용 후

1. 학생과-과목

학생ID과목
1수학
1영어
2수학
3물리

2. 과목-교수

과목교수
수학김교수
영어이교수
물리박교수

3. 과목과-교재

과목교재
수학수학책
영어영어책
물리물리책

이렇게 테이블을 나누면 각 속성이 독립적으로 저장되고, 이제 데이터를 수정하거나 추가할 때 조인 종속성을 최소화할 수 있다. 예를 들어, 수학 과목에 대한 교수교재 정보가 바뀌면 해당 정보를 하나의 테이블만 수정하면 되므로 데이터 일관성을 유지할 수 있다.



반정규화

정규화된 데이터 구조를 의도적으로 변경하여 성능을 최적화하는 작업

장점

  • 조회 성능 향상 : 자주 사용되는 데이터는 중복 저장
  • 간단한 쿼리 : 조회 시 join 필요 없음

단점

  • 데이터 중복 : 변경 작업이 복잡해지고 저장소 사용량 증가
profile
진짜를 알면 곁가지를 몰라도 된다

0개의 댓글