Post

[DB 데이터베이스] 정규화(Normalization) 및 이상(Anomaly)

정규화 (Normalization) 란?


데이터베이스의 설계에서 중복을 최소화 할 수 있도록 데이터를 구조화하는 작업을 정규화라고 합니다.

데이터베이스를 잘못 설계하면 이상(Anomaly) 현상이 발생하게 됩니다.

따라서 정규화는 이러한 이상 현상을 방지하고 하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정입니다.



갱신 이상(Update Anomaly) 의 종류



다음과 같은 릴레이션이 있을 경우, 이상 현상이 발생할 수 있습니다.

학번주소과목성적
1401서울C 프로그래밍A-
1401서울C++ 프로그래밍A0
1402경기JAVA 프로그래밍B+
1501제주컴퓨터구조론A+
1601강원데이터베이스C+


1. 수정 이상(Modification Anomaly)

중복된 데이터의 일부가 수정되어 데이터의 불일치가 발생하는 경우

1401번 학생의 주소가 변경되었는데, 2개 데이터 중 1개만 변경을 하게되면 한 학생의 정보가 달라지는 모순이 발생함


2. 삽입 이상(Insertion Anomaly)

어떤 데이터를 저장하기 위해, 불필요한 정보도 함께 저장해야 하는 경우

학생이 듣는 과목 정보를 입력하려 했는데, 시험보기 전이라 성적이 없는데도 해당 데이터를 입력해야 함


3. 삭제 이상(Deletion Anomaly)

필요한 정보를 함께 삭제하지 않으면, 어떤 정보를 삭제하는 것이 불가능한 경우

1501번 학생의 과목을 삭제하게 되면, 1501번 학생의 다른 정보도 같이 삭제되어 학생의 정보가 사라짐



함수 종속성 (Functional Dependency)


릴레이션의 특정 속성 값이 다른 속성의 값을 고유하게 결정하게 하는 것을 의미합니다.

특정 속성 A가 B를 결정할 수 있을 때, B는 A에 함수적으로 종속되어 있다라고 하며 A -> B 라고 표기합니다.

여기서 A는 결정자, B는 종속자라고 합니다.


학번이름과목
1401김나나C 프로그래밍
1401김나나데이터베이스
1501박다다C++ 프로그래밍
1602이라라JAVA 프로그래밍


위의 릴레이션에서 학번에 의해 학생 이름이 고유하게 구분되므로 함수 종속 관계에 있다고 할 수 있습니다.

따라서 기호로 표현하면 아래와 같습니다.

학번 -> 이름


정규화 과정



제 1 정규형 (1NF)


  • 릴레이션의 각 속성은 모두 원자값이어야 합니다.
  • 기본키를 이용하여 각 행 식별이 가능해야 합니다.
  • 중복되는 속성이 없어야 합니다.


[수정 전]

학번이름과목
1401김나나C프로그래밍, 데이터베이스
1501박다다C++ 프로그래밍
1602이라라JAVA 프로그래밍


[수정 후]

학번이름과목
1401김나나C 프로그래밍
1401김나나데이터베이스
1501박다다C++ 프로그래밍
1602이라라JAVA 프로그래밍


제 2 정규형 (2NF)


  • 제 1 정규형을 만족해야 합니다.
  • 부분 함수 종속성을 제거해야 합니다.
  • 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형입니다.


[수정 전]

학번과목번호학과성적
1401A11컴퓨터공학과A-
1401A12컴퓨터공학과A0
1402B11정보보호학과B+
1501C10기계공학과A+
1601D13수학과C+

위 릴레이션은 학번 -> 학과로 부분 함수 종속성을 가지고 있습니다.

즉, 현재 기본키가 [학번, 과목번호]로 이루어져 있는데 학번만으로 학과에 대한 결정을 할 수 있어 제 2 정규형을 만족하지 않습니다.


[수정 후]

학번과목번호성적
1401A11A-
1401A12A0
1402B11B+
1501C10A+
1601D13C+
학번학과
1401컴퓨터공학과
1401컴퓨터공학과
1402정보보호학과
1501기계공학과
1601수학과


학번을 기준으로 릴레이션을 분리하여 제 2 정규형을 만족하게 하였습니다.


제 3 정규형 (3NF)


  • 제 2 정규형을 만족해야 합니다.
  • 모든 속성이 기본키에 대해서만 의존되어야 합니다.
  • 이행 함수 종속성 (X -> Y 이고 Y -> Z이면 X -> Z임) 을 제거`해야 합니다.


[수정 전]

학번학과등록금
1401컴퓨터공학과400
1402정보보호학과450
1501기계공학과350
1601수학과300

학번 -> 학과

학과 -> 등록금

학번 -> 등록금

이행적 함수 종속 관계가 나타나기 때문에 두 릴레이션으로 분리해줍니다.


[수정 후]

학번학과
1401컴퓨터공학과
1402정보보호학과
1501기계공학과
1601수학과
학과등록금
컴퓨터공학과400
정보보호학과450
기계공학과350
수학과300


강한 제 3 정규형 (BCNF)


  • 제 3 정규형을 만족해야 합니다.
  • 모든 결정자가 후보키여야 합니다.


[수정 전]

학번과목번호교수
1401A11James
1401A12Brian
1402B11Mina
1501C10Lilly
1601D13Tom

[학번, 과목번호] -> 교수

교수 -> 과목번호

BCNF는 모든 결정자가 후보키여야 하는데, 교수는 후보키가 아니므로 이를 만족하지 않습니다.


[수정 후]

학번교수
1401James
1401Brian
1402Mina
1501Lilly
1601Tom
교수과목번호
JamesA11
BrianA12
MinaB11
LillyC10
TomD13


This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.