기록하는삶

[데이터베이스/DB] 데이터베이스 정규화(DB Nomalization), 이상현상(Anomaly), 1차/2차/3차 및 보이스코드 정규화의 쉬운 설명 본문

AI/데이터베이스(DB)

[데이터베이스/DB] 데이터베이스 정규화(DB Nomalization), 이상현상(Anomaly), 1차/2차/3차 및 보이스코드 정규화의 쉬운 설명

mingchin 2021. 9. 22. 01:41
728x90
반응형

데이터베이스 정규화(DB Nomalization)

▶ 논리적 데이터 모델링 과정에서 관계형 데이터 모델 내의 이상현상을 야기하는 속성 간의 종속관계를 제거하기 위해 기존의 관계(relation)를 더 작은 여러 개의 관계로 무손실 분해하는 과정

이상현상(Anomaly) = 관계형 데이터 모델에서 관계(relation) 조작 시 데이터들이 불필요하게 중복되어 발생하는 오류로 삽입, 삭제, 갱신 이상이 있다.

① 삽입 이상(Insertion Anomaly): 새 데이터 삽입 시 불필요한 데이터도 함께 삽입해야 하는 현상

ex)

학번 이름 교수번호 지도교수
202101 A 001 지동
202102 B 002 지은
202103 C ? ?

새로운 학생 C의 데이터만을 등록하려고 하는데, 지도 교수의 데이터를 함께 입력해야만 한다.

② 삭제 이상(Deletion Anomaly): 일부 데이터(튜플)를 삭제하고자 할 때 의도와 상관 없는 데이터도 함께 삭제되는 현상

ex)

학번 이름 교수번호 지도교수
202101 A 001 이지동
202102 B 002 이지은
202103 C 003 이지금
202104 D 004 이지동

학생 B의 데이터만을 삭제하려 하는데, 교수 이지은에 대한 데이터까지 함께 삭제해야 한다.

③ 갱신 이상(Update Anomaly): 일부 데이터(튜플)를 업데이트할 때 데이터의 불일치가 발생하는 현상

ex)

학번 이름 교수번호 지도교수
202101 A 001 이지동
202102 B 002 이지은
202103 C 003 → 002 이지금 → 이지은
202104 D 004 이지동

학생 C의 담당 교수 데이터를 업데이트 했더니, 지도교수 이지금의 교수 번호가 003이라는 데이터가 사라져버렸다.

1차 정규화(1NF_Normal Form으로 만들기)

▶ 릴레이션이 각 속성의 속성값이 원자 값(Atomic value)로만 구성되도록 무손실 분해하는 과정. 즉 각 속성의 값이 하나씩만 존재하도록 엔티티를 구성한다. 그 결과 만들어지는 릴레이션을 '1차 정규형(1NF)을 만족한다'고 한다.

ex) 1차 정규화가 필요한 상황

학번 이름 학년 전화번호
202101 A 1 010-1111-2222
202102 B 3 010-3333-4444
202103 C 4 010-5555-6666
010-7777-8888
202104 D 2 010-9999-0000

→ 1차 정규화 진행: 반복되는 항목(학번 202103의 두 개의 전화번호)이 있는 속성을 분리, 다음과 같이 별도의 엔티티로 구성한다.

학번 이름 학년
202101 A 1
202102 B 3
202103 C 4
202104 D 2
학번 전화번호
202101 010-1111-2222
202102 010-3333-4444
202103 010-5555-6666
202103 010-7777-8888
202104 010-9999-0000

2차 정규화(2NF로 만들기)

▶ 릴레이션이 제 1차 정규형이면서 부분함수종속성을 가지는 경우, 릴레이션의 무손실 분해를 통해 부분함수종속성을 없애는 과정. 그 결과 만들어진 릴레이션을 '2차 정규형을 만족한다'고 한다.

ex) 2차 정규화가 필요한 상황

'직원의 능력'을 엔티티로 구성하고 싶은 경우, 이름과 능력이라는 속성을 복합키로 기본키(Primary key)를 구성해야만 한다. 그런데 아래와 같이 '주소지'를 하위 속성으로 구성할 경우, 주소지는 복합키의 구성 속성 중 하나인 '이름'만으로 식별이 가능하다.즉, 부분함수종속성의 존재한다. (부분함수종속성: 'X_이름+Y_능력'을 기본키로 설정하여 '(X+Y) → Z_주소지'의 관계를 구성하였는데, 'X_이름' → 'Z_주소지'의 부분적인 종속관계가 존재함)

이름 능력 주소지
이지동 문서 작업 부산
이지은 노래 서울
이지은 서울
이지은 연기 서울
이지금 SNS 마케팅 강원도

→ 2차 정규화 진행: 부분함수종속성을 가지는 '주소지'라는 속성을 별도의 엔티티로 구성한다. (부분함수종속성 제거)

이름 능력
이지동 문서 작업
이지은 노래
이지은
이지은 연기
이지금 SNS 마케팅
이름 주소지
이지동 부산
이지은 서울
이지금 강원도

3차 정규화(3NF로 만들기)

▶ 릴레이션이 제 2차 정규형이면서 2개 이상의 하위속성 간에 이행함수종속성이 존재하는 경우, 릴레이션의 무손실 분해를 통해 해당 이행함수종속성을 없애는 과정. 그 결과 만들어진 릴레이션을 '3차 정규형을 만족한다'고 한다.

ex) 3차 정규화가 필요한 상황

대회명과 연도가 함께 복합키로서 기본키가 되어야 한다. 이때 '우승자'라는 속성과 '우승자 생일'이라는 속성은 잘 식별되기는 하지만, '우승자 생일' 속성은 사실 기본키가 아닌 하위속성인 '우승자'라는 속성에 의해 식별되는 이행함수종속성이 존재한다. (이행함수종속성: X(대회명+연도) → Y(우승자) 이고 Y(우승자) → Z(우승자 생일) 이면 X → Z이다.)

출처: 이행함수종속성, 네이버 백과

대회명 연도 우승자 우승자 생일
서울시 노래자랑 2020 이지은 1993.5.16
부산시 노래자랑 2020 이지동 1993.5.15
강원도 노래자랑 2019 이지금 1993.5.17
서울시 노래자랑 2021 이지동 1993.5.15
부산시 노래자랑 2021 이지은 1993.5.16

→ 3차 정규화 진행: 이행함수종속성을 갖는 속성들을 별도의 엔티티로 분리. 즉 '우승자' 속성과 '우승자 생일' 속성을 별도로 분리한다.

대회명 연도 우승자
서울시 노래자랑 2020 이지은
부산시 노래자랑 2020 이지동
강원도 노래자랑 2019 이지금
서울시 노래자랑 2021 이지동
부산시 노래자랑 2021 이지은
우승자 우승자 생일
이지동 1993.5.15
이지은 1993.5.16
이지금 1993.5.17

보이스/코드 정규화(Boyce/Codd NF로 만들기)

▶ 릴레이션이 제 2차 정규형이면서 복합키인 기본키를 구성하는 속성과 하위 속성 간에 이행함수종속성이 존재하는 경우, 릴레이션의 무손실 분해를 통해 해당 이행함수종속성을 없애는 과정. 그 결과 만들어진 릴레이션을 '보이스코드 정규형(BCNF)을 만족한다' 혹은 '강한 3차 정규형을 만족한다'고 한다.

ex) 보이스/코드 정규화가 필요한 상황

'고객아이디 + 인터넷강좌'가 복합키로서 기본키가 되고, 하위속성인 '담당강사번호'를 식별하지만, '담당강사번호'가 다시 또 다시 기본키를 구성하는 속성 중 하나인 인터넷 강좌를 식별하는 종속성이 존재한다.

출처: 네이버 지식백과
출처: 네이버 지식백과, 예시의 속성간의 종속관계
출처: 네이버 지식백과, 발생할 수 있는 이상현상. 보이스/코드 정규화가 필요한 상황이다.

① 삽입 이상(Insertion Anomaly)

P005 강사가 강좌를 열었는데 아직 수강생이 없는 경우 삽입이 불가(기본키가 NULL을 가짐)

② 삭제 이상(Deletion Anomaly)

고객 banana가 수강을 취소했더니, 강사 P002의 강좌 정보까지 삭제됨

③ 갱신 이상(Update Anomaly)

P004 강사가 추가로 '기초토익' 강좌를 열었더니 데이터 불일치 발생

→ 보이스/코드 정규화 진행: 종속성을 가지는 두 속성인 '담당강사번호'와 '인터넷강좌'를 포함하는 별도의 엔티티를 구성한다.

출처: 네이버 지식백과

 

728x90
반응형