3 minute read

세미나에서의 피드백이 나와 정규화 vs 비정규화(반정규화) 데이터 베이스에 대해서 정리하고자 한다,

오늘 세미나를 하며 느낀건, 말을 못한다는건 잘 모르기 때문이라는 생각이 들었다.

나의 잘못된 지식이 누군가에게 전달되어 그 사람에겐 그게 진실이 된다면, 안하니 못한 세미나가 될것이다.

조금더 내가 더 잘 이해하고, 당당하게 목소리를 낼수 있기를,, (그게 아니면 사기꾼이고,,,)

그러므로 오늘도 기록

0.목차

  1. 정규화란?
  2. 함수적 종속성
  3. 장단점
  4. 정규화 원칙
  5. 제1 정규화
  6. 제2 정규화
  7. 제3 정규화
  8. BCNF 정규화

1. 정규화란?

정규화란 테이블의 속성들이 상호 종속적인 관계 를 갖는 특성을 이용하여 테이블을 무손실 분해__하는 과정으로, 정규화의 목적은 __중복을 최소화 하도록 설계된 데이터 베이스를 말한다. 즉, 하나의 종속성이 하나의 릴레이션에 표현될 수 있도록 분해하는 과정 이라 보면 된다.

한 릴레이션안에서 여러 개체들의 속성이 혼합된다면 정보가 중복 저장될 위험이 크고, 저장 공간의 낭비로 이어진다. 또한 중복된 정보로 인해 ‘갱신이상’ 또한 발생하게 될것이다.

* 갱신이상
중복된 데이터 중 일부만 수정되어 데이터의 모순이 일어나는 현상
https://kosaf04pyh.tistory.com/294

이러한 문제를 해결위해 정규화 과정을 거치는 것이고, 정규화 과정을 통해 정규형을 만족하게 된다.

정규형
- 특정 조건을 만족하는 릴레이션의 스키마 형태
- 제1~5정규형 BCNF정규형이 존재한다.
- 차수가 높아질수록 만족시켜야 할 제약 조건이 늘어난다.

2. 함수적 종속성

함수적 종속성은 애트리뷰트(속성)들 사이의 관계에 대한 제약 조건으로 애트리뷰트 A가 B의 결정자이면, 다음의 조건을 따라야 한다.

A이면 B이고 동시에 A이면서 C일 수 없지만, B이면 A인것은 아니다.

예를 들어 아래 테이블에서 회원번호와 이름이 각각 10, 한승우

  1. 한승우 인 동명이인의 사원이 존재한다고 할떄, 사원번호를 속성 a, 이름을 b속성이라고 한다면, a이면 반드시 b이지만, b이면 반드시 a라고 할 수 없다라는 말을 이해할수 있을것이다. 따라서 B는 A를 __종속__하고 있다고 말한다.

3. 장단점

  • 장점
    • 데이터베이스 변경시 이상현상(Anomaly) 제거
    • 저장 공간의 최소화 기능
    • 효과적인 검색 알고리즘 생성가능
    • 데이터 삽입시 릴레이션 재구성의 필요성 감소
    • 데이터 구조의 안정성 및 무결성 유지
  • 단점
    • 릴레이션간의 Join 연산 증가
      • 질의의 복잡도 증가
      • 질의에 대한 응답시간 저하

4. 정규화 원칙

  1. 정보의 무손실 표현
    • 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있으면 안된다.
  2. 분리의 원칙
    • 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜 표현한다.
  3. 데이터의 중복성이 감소되어야 한다.

(옛날 외웠었던 도부이결다조,,,)

5. 제1 정규화

제1 정규화 (비정규형-> 1NF)

제1 정규형을 갖추려면 도메인 원자값 이라는 조건을 만족해야 한다.

도메인 원자값을 만족한다란

  • 반복 그룹이 존재하면 안된다.
    • TOM 이라는 학생에 대한 정보인 이름, 메일, 대학, 전공은 초기 설정값이다. 그렇기 떄문에 해당 정보는 수강 내역을 확인하기 위해서 계속 반복되고 있기 떄문에 분리가 필요하다.
  • 모든 행은 식별자로 완전하게 구분되어야 한다.

제1정규화

  • 과정
    1. 반복되는 부분을 체크한다. (학번(PK), 이름, 메일, 대학, 전공)
    2. 반복되는 부분과 그렇지 않은 부분을 분리한다. (pk 는 그대로 가져간다)
    3. 테이블을 나눈 후 반복되는 행은 삭제 한다.

제1 정규화_2

그런데 위 학생 테이블은 도메인 원자값 조건인 ‘모든 행은 식별자로 완전하게 구분된다’ 라는 조건을 만족시키지 못한다.

위 표의 수강내역은 pk 인 학번 만으로는 모든행이 구분되지 않는다. 그렇기 떄문에 추가적으로 key를 설정해 주어야 한다.

그래서 ‘수강 내역’ 테이블의 ‘학번+수강학기+과목명’을 복합하여 __식별자__로 만들어 해결하면 제1 정규화 과정이 마무리 된다.

6. 제2 정규화 - 부분함수 종속 제거

필요 충분 조건 : 후보키 k와 k에 속하지 않은 속성 a가 있을때 a를 결정하기 위해 k의 일부가 아닌 k전체를 참조할때 1NF 테이블은 2NF 이다.

즉 KEY가 아닌 값들은 모두 KEY에 종속되어야 한다는 말이다.

조건은 이러하다.

  1. KEY가 아닌 컬럼(속성)은 KEY컬럼에만 종속 되어야 한다.
  2. 1번 조건으로 인해 __복합키__일때 제2 정규형의 조건이 된다. (복합키가 아니라면 제3 정규형) 즉 key값에만 주목하면 된다.

위의 표를 다시 가져와 보자.

제1 정규화_3

우리는 제1 정규화를 진행하였던 수강내역 테이블에서 __복합키__로 ‘학번’, ‘수강학기’, ‘과목명’ 으로 만들었다. 그러면 제2 정규형에 만족을 하려면 __복합키(학번, 수강학기, 과목명)__와 __나머지 컬럼(성적, 제한인원)__이 확실하게 종속이 되어야 한다는 것이다.

‘성적’ 의 경우 학번과 수강학기 과목명을 알아야 성적을 알수 있기에 복합키에 종속이 되지만, 제한 인원의 경우 학번과는 따로 관계 가 없다.

그렇기에 __제한인원__의 경우 다시한번 아래와 같이 분리가 가능하다.

제2 정규화 4

7. 제3 정규화 -이행적 함수 종속 제거

필요충분조건 : 제2 정규형을 만족하고, 테이블 내의 모든 속성이 키에만 의존하며 다른 후보키에 의존하지 않는다.

  1. 모든 key가 아닌 컬럼은 key에 완전 종속된다.
  2. 모든 non-key컬럼은 key컬럼에만 종속되어야 한다.

위 학생 표를 보면 non-key컬럼인 대학과 전공 컬럼을 확인해보자

위 두개는 key가 아님에도 종속 관계가 성립된다.

대학의 경우 전공을 포함하기 때문이다.

정규화가 잘된 테이블은 갑-을 관계까지만 존재한다.

하지만 이 테이블의경우 갑(key:학번)- 을(non-key:대학) - 병(non-key:전공) 까지 존재하므로 이 관계를 또 한번 나눌수 있다.

제3정규

대학정보 테이블의 경우 대학이 전공을 포함한다. 하지만 key는 테이블의 튜플을 구분해야한다. 그래서 튜플을 구분하기 위해서 __전공이 key__값이 되어야 한다.

대학 정보를 참조하기 위해서는 학생 테이블의 전공을 외래키로 설정하여 대학정보 테이블을 참조할 수 있게 해야 한다.

https://velog.io/@yaincoding/NoSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-%EC%97%AD%EC%A0%95%EA%B7%9C%ED%99%94Denormalization https://mr-dan.tistory.com/10

Categories:

Updated: