기록하는삶
[데이터베이스/DB] 데이터베이스 정규화(DB Nomalization), 이상현상(Anomaly), 1차/2차/3차 및 보이스코드 정규화의 쉬운 설명 본문
[데이터베이스/DB] 데이터베이스 정규화(DB Nomalization), 이상현상(Anomaly), 1차/2차/3차 및 보이스코드 정규화의 쉬운 설명
mingchin 2021. 9. 22. 01:41데이터베이스 정규화(DB Nomalization)
▶ 논리적 데이터 모델링 과정에서 관계형 데이터 모델 내의 이상현상을 야기하는 속성 간의 종속관계를 제거하기 위해 기존의 관계(relation)를 더 작은 여러 개의 관계로 무손실 분해하는 과정
▶ 이상현상(Anomaly) = 관계형 데이터 모델에서 관계(relation) 조작 시 데이터들이 불필요하게 중복되어 발생하는 오류로 삽입, 삭제, 갱신 이상이 있다.
① 삽입 이상(Insertion Anomaly): 새 데이터 삽입 시 불필요한 데이터도 함께 삽입해야 하는 현상
ex)
학번 | 이름 | 교수번호 | 지도교수 |
202101 | A | 001 | 지동 |
202102 | B | 002 | 지은 |
202103 | C | ? | ? |
새로운 학생 C의 데이터만을 등록하려고 하는데, 지도 교수의 데이터를 함께 입력해야만 한다.
② 삭제 이상(Deletion Anomaly): 일부 데이터(튜플)를 삭제하고자 할 때 의도와 상관 없는 데이터도 함께 삭제되는 현상
ex)
학번 | 이름 | 교수번호 | 지도교수 |
202101 | A | 001 | 이지동 |
002 | 이지은 | ||
202103 | C | 003 | 이지금 |
202104 | D | 004 | 이지동 |
학생 B의 데이터만을 삭제하려 하는데, 교수 이지은에 대한 데이터까지 함께 삭제해야 한다.
③ 갱신 이상(Update Anomaly): 일부 데이터(튜플)를 업데이트할 때 데이터의 불일치가 발생하는 현상
ex)
학번 | 이름 | 교수번호 | 지도교수 |
202101 | A | 001 | 이지동 |
202102 | B | 002 | 이지은 |
202103 | C | ||
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 강사가 추가로 '기초토익' 강좌를 열었더니 데이터 불일치 발생
→ 보이스/코드 정규화 진행: 종속성을 가지는 두 속성인 '담당강사번호'와 '인터넷강좌'를 포함하는 별도의 엔티티를 구성한다.
'AI > 데이터베이스(DB)' 카테고리의 다른 글
[몽고DB/Mongoose] 설치, DB서버 열기, 간단한 DB 활용 (0) | 2021.10.06 |
---|---|
[데이터베이스/DB] 데이터, 데이터베이스(DB), 데이터베이스시스템(DBS) (0) | 2021.09.22 |
[데이터베이스/DB] 엔티티(Entity)와 어커런스(Occurrence) (0) | 2021.09.22 |
[데이터베이스/DB] SQL의 정의와 종류, 트랜잭션(transaction)의 정의와 특징 (0) | 2021.09.22 |