본문 바로가기

내배캠/TIL

데이터 베이스 정규화

정규화(Normalization)란?

정규화란 무엇일까? 위키백과에 검색한 결과 다음과 같이 나오게 된다.

 

정규화(normalization)는 관계형 데이터베이스의 설계에서 데이터 중복을 줄이고 데이터 무결성을 개선하기 위해 데이터를 정규형(normal form)에 맞도록 구조화하는 프로세스를 뜻한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다. 일반적으로 정규화란 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것을 포함한다. 정규화의 목적은 하나의 테이블에서의 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것이다.

 

결국 한 마디로 요약하면, 테이블을 정리한다는 뜻이다.

잘 정리되지 않은 (정규화되지 않은) 테이블은 데이터가 중복되고 효율성이 떨어지며 이상 현상이 발생할 수 있기 때문이다.

 

발생할 수 있는 이상 현상은 다음과 같다.

  • 삽입 이상 (Insertion Anomaly) : 데이터 삽입 시 의도와 다른 값들도 삽입
  • 삭제 이상 (Delete Anomaly) : 데이터 삭제 시 의도와 다른 값들도 연쇄 삭제
  • 갱신 이상 (Update Anomaly) : 속성값 갱신 시 일부 튜플만 갱신되어 모순 발생

 

그럼 정규화가 어떻게 진행될 수 있는지 알아보도록 하겠다.

 

 

제 1 정규화 (1NF)

제 1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다. 

아래 수강신청 테이블 예시를 보자

 

수강과목 ID 수강자 수강과목
1 김철수 Java, JavaScript
2 김영미 Spring
3 박민지 파이썬, Java

 

여기서 김철수와 박민지는 여러 개의 수강과목을 가지고 있다. 이렇게 될 경우 철수가 Java를 듣고 있는지 검색하려 해도 Java로만 검색이 되지 않고, Java, JavaScript로 검색을 해야 하는 문제가 발생한다. 또한 Java만 삭제하거나 수정하고 싶어도 같이 있는 JavaScript가 함께 수정 및 삭제되는 문제도 발생한다.

 

해당 테이블이 원자값을 갖도록, 즉 제1 정규형을 만족하도록 테이블을 분해하면 다음과 같은 모습이 된다.

 

수강과목 ID 수강자 수강과목
1 김철수 Java
2 김철수 JavaScript
3 김영미 Spring
4 박민지 파이썬
5 박민지 Java

 

다음과 같이 하나의 셀에 하나만 존재하도록 해야 데이터를 더 쉽게 관리하고 검색할 수 있다.

 

 

제 2 정규화 (2NF)

제 2 정규화란 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다는 뜻이다. 쉽게 말해 기본 키 중 일부 키에만 종속되는 값이 없어야 한다는 것이다.

여기서 기본 키는 PK를 말하는데 이는 각 레코드를 고유하게 식별할 수 있는 컬럼으로, 중복이 되면 안된다.

 

아래 학생 성적표 예시를 보자.

 

학생 이름 과목 교수 성적
김철수 Java 김 교수 90
김철수 JavaScript 오 교수 100
김영미 네트워크 김 교수 95
박민지 데이터베이스 오교수 70

 

여기서 학생 이름과 과목이 함께 복합 키로써 기본 키로 사용되고 있다. 근데 여기서 잘 보면 성적은 학생 이름과 과목에 완전하게 종속이 된다. 성적 값은 어떤 학생의 어떤 과목인지가 필수로 들어가야 하기 때문이다. 하지만 교수를 보면, 학생 이름이나 성적과 관련없이 과목에만 부분 종속이 되는 것을 볼 수 있다. 

 

이렇게 될 경우 데이터 중복이 발생하고 무결성이 유지되지 않는데, 새로운 학생의 성적만 입력하고 싶어도 교수까지 입력을 해야 하거나, 특정 과목의 교수가 바뀌었을 때 성적표 테이블의 모든 연관 행 교수를 전부 바꿔야 하는 문제가 생긴다. 교수가 한 과목만 가르친다면 해당 학생을 삭제하면 교수도 함께 삭제될 수도 있다.

 

위를 제 2 정규화를 적용해 테이블을 분리하면 다음과 같다.

 

학생 이름 과목 성적
김철수 Java 90
김철수 JavaScript 100
김영미 네트워크 95
박민지 데이터베이스 70
과목 교수
Java 김 교수
JavaScript 오 교수
네트워크 김 교수
데이터베이스 오 교수

 

 

이렇게 부분 종속, 즉 기본 키와 완전한 관련이 없는 것들을 분리하면 제 2 정규화를 만족하게 된다.

 

 

제 3 정규화 (3NF)

제 3 정규화란 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이란 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 말한다. 즉 기본 키를 제외하고 다른 컬럼에 의해 결정되는 데이터를 없애는 것이다.

 

아래 수강 테이블 예시를 보자.

 

수업 학과 교수
데이터베이스 컴퓨터 공학 김 교수
네트워크 컴퓨터 공학 김 교수
알고리즘 컴퓨터 공학 박 교수
응용 수학 수학과 이 교수
그래프 이론 수학과 정 교수

 

위 테이블은 학과가 수업, 교수가 학과에 종속되면서 교수가 수업에 종속되는 이행적 종속이 발생하게 된다. 이때 만약 아직 담당 교수가 없는 수업을 추가할 때 교수가 null이 들어가거나 교수를 수정할 때 여러 행을 수정하는 등의 문제가 발생하게 된다. 알고리즘 수업을 삭제하면 박교수도 같이 삭제되는 문제도 발생한다. 이 테이블에 제 3 정규화를 적용시키면 다음과 같다.

 

수업 학과
데이터베이스 컴퓨터 공학
네트워크 컴퓨터 공학
알고리즘 컴퓨터 공학
응용 수학 수학과
그래프 이론 수학과

 

학과 교수
컴퓨터 공학 김 교수
컴퓨터 공학 박 교수
수학과 이 교수
수학과 정 교수

 

 

제3 정규화를 적용시키면 각 테이블은 원자적인 값을 가지게 되고 데이터 중복이 줄어들며 이상 현상을 피할 수 있게 되어 유지 보수가 훨씬 용이해진다.

 

 

 

 

 

 

[참고 자료]

https://hstory0208.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%95%EA%B7%9C%ED%99%94Normalization%EB%9E%80-%EC%98%88%EC%8B%9C%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90

 

데이터베이스 정규화(Normalization)란? 예시를 통해 쉽게 이해해보자

정규화란? 데이터베이스 정규화는 데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정이다. 정규화를 하는 목적은 데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을

hstory0208.tistory.com

https://mangkyu.tistory.com/110

 

[Database] 정규화(Normalization) 쉽게 이해하기

지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz

mangkyu.tistory.com

https://velog.io/@wkdwoo/DB-%EC%A0%95%EA%B7%9C%ED%99%94

 

DB 정규화 1NF, 2NF, 3NF, BCNF

효율적이고 논리적인 데이터 저장의 기본, 정규화를 이야기한다.

velog.io

 

'내배캠 > TIL' 카테고리의 다른 글

카카오 로그인 개발하기  (5) 2024.09.09
JPA의 N+1 문제 해결하기  (0) 2024.09.06
JWT, Filter  (0) 2024.09.04
RDBMS vs NoSQL  (0) 2024.09.03
[스프링] 예외 처리  (0) 2024.08.29