클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

데이터 입출력 구현 6 - Session 39 : 정규화(Normalization) 본문

자격증 공부/정보처리기사 실기

데이터 입출력 구현 6 - Session 39 : 정규화(Normalization)

huenuri 2024. 9. 25. 12:10

이번 시간에는 정규화와 반정규화에 대해서 학습해볼 것이다. 강의 시간도 지금까지 들었던 수업 중에서 가장 많다. 하나당 30분이나 되니 열심히 잘 들어볼 것이다.

필기 때 이 내용을 어렵게 공부했던 기억이 난다. 바로 공부를 시작해보자.


 

 

 

 

세션 39 - 정규화(Normalization)

 

 

 

두 가지로 분해한 후에 조인했을 때 손실된 데이터가 없으면 무손실 분해라고 한다.

 

 

 

 

표 형태로 만들면서 어떤 이상 현상이 발생하는지 파악해야 한다. 원래는 동일한 데이터를 셀에 모두 적어주어야 하지만 불필요한 내용은 반복해서 적을 필요는 없다.


 

 

왼쪽에 있는 제품 번호를 뒤에도 추가시켜 연결해주면 된다.

 

 

 


 

 

 

 

주문번호로 고객번호, 주소는 알아낼 수 있지만, 주문수량은 알아낼 수 없다.

 

 

첫번째 줄은 완전 함수적 종속, 두번째 줄은 부분 함수적 종속이라고 한다. 테이블을 분리시킬 때 부분적 함수 종속만 꺼내는 것이다.

 

 

 


 

 

 

 

C는 A에 간접 종속되어 있다고 볼 수 있는데 이것을 이행적 함수적 종속이라고 한다. 이행적 함수 종속을 제거하려면 두 개씩 묶어주면 된다.

 

 

 


 

 

 

 

 

A, B가 복합키로 설정되어 있을 때 C를 결정하게 된다. A 하나만 가지고 C가 결정이 된다고 하면 부분적 함수 종속이 되어 이 법칙에 위배된다. C 하나를 가지고 A나 B를 결정하는 상황이 발생하기도 한다. 이때 C는 후보키가 될 수 없다.

 

 

학번과 과목명이 복합키로 사용되었다. 이때 담당교수는 후보키가 될 수 없기에 후보키가 아닌 속성을 분리하는 것이 BCNF이다.

 

 


 

 

 


 

문제 풀어보기

 

4정규형에서 B의 값이 여러 개 존재할 때 다치종속이라고 한다. 5정규형은 조인 종속을 하게 된면 원래의 데이터로 돌아가야 하는데, 안될 때가 있다. 그런 경우는 하나의 테이블을 두 개가 아닌 세 개로 분리했을 때이다. 조인 종속성을 갖는 속성들이 후보키가 아닐 때 문제가 발생한다.

4, 5 정규형은 이론적인 내용만 알고 있으면 된다. 다른 정규형은 시험에 나올 가능성이 높으니 충분히 숙지해야 한다.

 

정규화는 정말 어려웠다. 지금까지 배운 개념들 중 가장 어려운 것 같다. 그래도 잘 이해했는데 문제를 풀며 확인해보기로 하자.

1번은 서술형이니 넘길 것이다. 2번은 1정규형이다. 3번은 도메인 원자값, 부부적 함수 종속 제거, 이행 함수 종속 제거, 결정 함수 종속 제거, 다치 함수 종속 제거, 조인 함수 종속 제거이다.

4번은 다치 함수 종속 제거인 것 같다. 5번은 제3정규형이라고 찍었다. 그리고 다음 문제는 잘 모르겠다. 6번은 너무 어려워서 손도 못데겠다. 문제를 풀어보니 거의 찍었지 알고 푼 건 거의 없었다. 아마도 이 부분은 다시 공부해야 할 것 같다.

 

맞은 문제는 딱 하나 있는데 그것도 찍은 거였다. 다시 문제를 풀어보자. 정규화는 테이블의 속성들이 상호 종속적인 관계를 갖는 특성을 이용하여 테이블을 무손실 분해하는 과정이다. 정규형을 다시 한번 정리해보자!


 

 

정규화 과정

정규화는 여러 단계로 나뉘며, 단계가 올라갈수록 데이터 구조가 더 정교해진다.

 

1. 제1정규형(1NF: First Normal Form)

개념 : 제1정규형은 모든 속성이 원자값(Atomic Value)을 가져야 한다는 것을 의미한다. 즉, 하나의 속성에 여러 값이 들어가면 안 되고, 각 속성에는 하나의 값만 저장해야 한다.

  • 원자값 : 더 이상 분해할 수 없는 값
  • 조건
    • 모든 속성은 원자값이어야 한다.
    • 각 속성은 반복되는 그룹을 포함하지 않아야 한다.

예시 (정규화 전): 한 명의 학생이 여러 개의 전공을 가질 수 있다고 가정해보자.

학번 이름 전공
1001 홍길동 컴퓨터공학, 전자공학
1002 이몽룡 경영학

 

위 테이블은 전공 속성에 여러 값(컴퓨터공학, 전자공학)이 하나의 셀에 포함되어 있으므로 제1정규형을 만족하지 않는다.

 

1정규형으로 변환 : 각 속성에 하나의 값만 저장하도록 수정한다.

학번 이름 전공
1001 홍길동 컴퓨터공학
1001 홍길동 전자공학
1002 이몽룡 경영학

 

이제 각 속성에 하나의 값만 포함되므로 제1정규형을 만족한다.


 

 

2. 제2정규형(2NF: Second Normal Form)

개념 : 제2정규형은 제1정규형을 만족하고, 부분 함수 종속이 제거된 상태이다. 즉, 기본키의 일부에만 의존하는 속성이 있으면 안 된다. 모든 속성은 기본키 전체에 의존해야 한다.

  • 부분 함수 종속 : 기본키의 일부 속성에만 의존하는 비기본키 속성이 존재하는 경우
  • 조건
    • 제1정규형을 만족해야 한다.
    • 기본키의 일부가 아닌 전체에 의존하는 비기본키 속성만 존재해야 한다.

예시 (정규화 전): 학생의 학번과 수강 과목으로 구성된 테이블을 생각해보자.

학번 과목명 교수 학년
1001 데이터베이스 김교수 2학년
1002 경영학개론 박교수 1학년

 

여기서 교수명과목명에만 의존합니다. 즉, 학번이 아니라 과목명에 의존하므로 부분 함수 종속이 발생한 상태이다.

2정규형으로 변환 : 테이블을 분해하여 부분 함수 종속을 제거한다.

  • 학생 정보 테이블:
학번 과목명 학년
1001 데이터베이스 2학년
1002 경영학개론 1학년

 

  • 과목 정보 테이블:
과목명 교수
데이터베이스 김교수
경영학개론 박교수

 

이제 모든 속성이 기본키 전체에 의존하므로 제2정규형을 만족한다.


 

 

 

3. 제3정규형(3NF: Third Normal Form)

개념 : 제3정규형은 제2정규형을 만족하고, 이행적 함수 종속이 제거된 상태이다. 즉, 비기본키 속성이 다른 비기본키 속성에 의존하면 안 됩니다. 모든 비기본키 속성은 기본키에 직접 의존해야 한다.

  • 이행적 함수 종속 : 기본키 → 비기본키 → 또 다른 비기본키의 종속 관계가 있는 경우
  • 조건 :
    • 제2정규형을 만족해야 한다.
    • 비기본키 간의 종속성이 없어야 한다.

예시 (정규화 전) : 학생의 학번, 과목명, 교수명, 교수의 사무실 정보를 포함한 테이블을 생각해보자.

학번 과목명 교수명 사무실
1001 데이터베이스 김교수 301호
1002 경영학개론 박교수 202호

 

여기서 사무실교수명에 의존하고, 교수명은 과목명에 의존하는 이행적 종속 관계가 발생했다.

3정규형으로 변환 : 비기본키 속성 간의 종속성을 제거하기 위해 테이블을 분리한다.

 

  • 학생 과목 테이블:
학번 과목명
1001 데이터베이스
1002 경영학개론

 

  • 과목 교수 테이블:
과목명 교수명
데이터베이스 김교수
경영학개론 박교수

 

  • 교수 정보 테이블:
교수명 사무실
김교수 301호
박교수 202호

 

이제 비기본키 간의 종속성이 없어지고, 모든 비기본키 속성은 기본키에만 직접적으로 의존하므로 제3정규형을 만족한다.


 

 

 

4. BCNF (Boyce-Codd Normal Form)

개념 : BCNF는 제3정규형을 강화한 형태로, 모든 결정자가 후보키여야 한다는 조건을 만족하는 정규형이다. 제3정규형에서는 이행적 종속만을 제거했지만, BCNF는 후보키가 아닌 속성이 다른 속성을 결정할 수 없도록 더 강력한 조건을 추가한 것입니다.

  • 결정자(Determinant) : 다른 속성을 결정하는 속성이다. 기본키는 모든 다른 속성을 결정할 수 있어야 한다.
  • BCNF 조건 : 모든 결정자가 후보키여야 한다.

예시 (BCNF 위반): 다음과 같은 릴레이션이 있다고 가정해보자.

교수명 과목명 강의실
김교수 데이터베이스 101호
박교수 경영학개론 102호
  • 이 릴레이션에서 교수명과목명복합키로 작용하여 강의실을 결정하고 있다.
  • 문제는 "한 명의 교수가 하나의 과목만 가르친다"는 제약이 있다면, 교수명만으로도 강의실을 결정할 수 있다. 이는 후보키가 아닌 속성(과목명)이 기본키의 일부에만 의존하는 경우로, BCNF 위반이다.

BCNF로 변환 : 교수명만으로도 강의실을 결정할 수 있으므로 릴레이션을 분해해야 한다.

  • 교수-강의실 테이블:
교수명 강의실
김교수 101호
박교수 102호

 

  • 교수-과목 테이블:
교수명 과목명
김교수 데이터베이스
박교수 경영학개론

 

이제 모든 결정자가 후보키이므로 BCNF를 만족한다.

그럼 이제 문제를 다시 풀어보자.


 

 

2번은 제1 정규화이다. 테이블의 도시 속성이 다중값을 갖고 있으니 정규화를 수행한 후에는 한 개의 값, 즉 원가값만 갖고 있다.

3번은 틀린 부분이 있으니 고쳐보자. 도메인을 원자 값만으로 구성, 부분적 함수적 종속 제거, 이행적 함수적 종속 제거, 결정자이면서 후보키가 아닌 것 제거, 다치 종속 제거, 조인 종속성 이용이다.

4번은 정규화이다. 5번에서 주문번호는 고객아이디와 주소, 고객 아이디는 주소로 함수적 종속이 되어 있다. 고객아이디와 주소가 기본키인 주문번호에 대해 완전 함수적 종속이므로 제 2정규형이다. 그러나 <주문목록> 테이블에서 고객아이디가 주문번호에 함수적 종속이고, 주소가 고객아이디에 함수족 종속이므로 주소는 기본키인 주문번호에 대해 이행적 함수적 종속을 만족한다.

이는 이행적 함수 종속이 된다. 따라서 답은 제 3정규형이고, 여기서 수행된 작업은 이행적 함수 종속이다. 이제 문제를 조금 이해할 것 같다.

 

6번은 부분적 함수 종속이 되고 있는 업체번호와 업체명만 분리되었으로 제 2정규형이다. 

 


 

 

 

학습을 마치고

정규화 과정이 정말 어려워서 공부하는데 1시간 반 이상 걸린 것 같다. 쉬는 시간도 없이 공부에 열중해보았다. 이제 70% 이상 이해한 것 같다. 다음에 한번 더 복습을 하면 그때는 거의 이해할 수 있을 것이다.

공부하는 게 정말 재미있다. 이제 좀 쉬었다가 반정규화에 대해서 공부해보려고 한다.