[데이터베이스] #7. 정규화

bien·2023년 5월 24일
0

데이터베이스

목록 보기
5/17
post-thumbnail

데이터의 구조가 정확하지 않다면 지원되는 여러 관리기능에도 불과하고 데이터의 일관성, 무결성 유지가 힘들다. 따라서 효율적인 데이터 구조를 만들어야 한다.

모델링 과정을 거치더라도 데이터의 형태, 입력되는 데이터의 양상에 따라서 때로는 효율적이지 않은 구조일 수 있다. 데이터를 살펴보고 이 데이터에 해당 구조가 적절한지 판단할만한 기준이 필요한데, 이를 "정규화" 라고 한다.

1. 좋은 릴레이션과 나쁜 릴레이션

릴레이션 => 논리적 모델링 데이터단계에서 수행하는 것.

잘못된 데이터베이스 모델링

나쁜 릴레이션의 예

💬 이 릴레이션은 아무 문제가 없는 릴레이션일까?
✔️ 등급이 GOLD이면 5% 할인율을, VIP는 10%의 할인율을 가진다는 측면에서 서로 다른 컬럼에서 부분적인 중복이 발생하고 있다. 정규화는 이러한 부분적인 중복을 문제삼고자 하는 것이다. 중복이 되기 때문에 저장 공간의 낭비가 일어나고, 만약 유관순 고객의 할인율만 8%로 변경하는 경우 DBMS의 입장에서 GOLD의 할인율을 혼동하는 등의 문제가 발생 가능하다.

잘못된 데이터베이스 모델링

  1. 데이터의 중복
    • 일관성 유지의 어려움
    • 저장 공간 낭비
  2. 갱신이상
    • 삽입 이상: 레코드 추가 시 불필요한 컬럼의 값이 없이는 추가하지 못하는 경우
    • 삭제 이상: 삭제 시 의도하지 않았던 다른 데이터가 삭제되는 경우
    • 수정 이상: 중복 저장된 레코드를 수정 시 모두 반영이 안되어 데이터베이스의 일관성이 깨지는 경우

갱신 이상

갱신 이상- 삽입 이상

3%의 할인율을 가진 NEW라는 등급을 추가하고자 할때, 테이블의 기본키가 고객번호이므로 고객번호, 고객명, 전화번호등 불필요한 정보들을 함께 저장해야만 한다는 단점이 있다.

갱신 이상- 삭제 이상

이번엔 NEW라는 등급과 그 할인율 3%만 삭제하고 싶은데, 앞의 윤봉길이라는 고객정보를 없애지 않으면 삭제하고자 하는 정보를 삭제할 수 없게 된다.

갱신 이상- 수정 이상

회사의 정책변경으로 VIP의 할인율을 8%로 줄일때, 일부 누락되어 안중근의 할인율 변경이 누락된 경우 데이터의 비일관성을 야기할 수 있다.

좋은 릴레이션의 개념

좋은 릴레이션의 개념

  1. 컴퓨터 프로그래머적 관점에서의 모델링

    어떻게 데이터를 저장해야 하는가?

  2. 릴레이션의 스키마가 얼마나 효율적으로 실세계를 반영하고 있는지 평가

  3. 고려사항

    • 한 릴레이션 내의 컬럼 간의 관계 분석
    • 원하지 않는 데이터의 종속과 중복 제거
    • 새로운 컬럼들이 데이터베이스에 추가될 때, 기존 컬럼과의 관계 수정을 최소화

좋은 릴레이션

  • 하나의 릴레이션을 두개의 릴레이션으로 분리: 중복 제거, 변경의 용이함 증진.

💬 그럼 분리, 통합 기준은 뭘까?
✔️ "함수적 종속성"을 논의함으로써 알 수 있다!


2. 함수적 종속성

함수적 종속성의 정의

  1. 릴레이션 인스턴스를 분석하여 속성들간의 연관관계를 표현한 것.
    인스턴스: 컬럼들만 나열된 스키마가 아니라, 특정 시점에 스키마에 맞춰 입력되어 있는 레코드의 상황

  2. 릴레이션의 효율성을 향상시켜 좋은 릴레이션으로 변환하는데 이용되는 중요한 개념

정의
임의의 릴레이션 스키마R의 인스턴스 r(R)에 포함되는 서로 다른 두 레코드 r1, r2와 컬럼집합 X와 Y에 대해, r1[x]=r2[x]일 때, r1[y]=r2[y]이면 함수적 종속성 X->Y가 성립한다.


X가 같을 때 Y가 같으면 함수적 종속성 만족
X가 같을 때 Y가 하나라도 다르면 함수적 종속성 불만족
X가 모두 다를 때 Y값의 일치 여부는 고려대상이 아님. 함수적 종속 만족

함수적 종속성의 판별

유관순, 안창호 2가지 경우에서 등급이 GOLD이니 할인율이 5%다.
손병희, 지청천, 안중근 3가지 경우에서 등급이 VIP니 할인율이 10%다.
특정 컬럼의 값이 같을 때, 해당 레코드의 다른 컬럼의 값들이 서로 일치한다. 따라서 한 컬럼의 값을 굳이 보지 않더라도, 특정 컬럼의 값을 알고 있으면 나머지 컬럼이 추론 가능함. = 함수적 종속

함수적 종속성의 확장

우리가 한 릴레이션의 함수적 종속성을 눈으로 하나하나 따져가며 골라낸 것을 F라고 이야기한다. 그럼 만약 수만개의 레코드가 있다고 할때, 우리가 눈으로 하나하나 다 골라내는것이 가능할까? 이런 경우 수학적 기법으로 더 찾아낼수도 있다! = 확장

  1. 함수적 종속성은 릴레이션의 효율성 여부에 중요한 판단기준
  2. 그러나 릴레이션의 인스턴스만으로 내제된 모든 함수적 종속성을 찾아내기 어려움
  3. 판별되지 않은 모든 함수적 종속성을 찾기 위해 추론 규칙을 사용하여 함수적 종속성을 확장
  4. 클로저(closure)
    • 판별된 함수적 종속성 집합으로부터 유추할 수 있는 모든 함수적 종속성 집합

함수적 종속성 추론규칙

  1. 암스트롱 공리(Armstrong's axiom)
    3번까지가 암스트롱 공리. 4~6은 이게 확장된 것
  1. 재귀성 규칙 : 𝑋⊇𝑌이면, 𝑋→𝑌이다
  2. 부가성 규칙: 𝑋→𝑌이면, 𝑋𝑍→𝑌𝑍이다
  3. 이행성 규칙: 𝑋→𝑌이고, 𝑌→𝑍이면, 𝑋→𝑍이다.
  4. 분해 규칙: 𝑋→𝑌𝑍이면, 𝑋→𝑌이다.
  5. 합집합 규칙: 𝑋→𝑌이고, 𝑋→𝑍이면, 𝑋→𝑌𝑍이다.
  6. 의사 이행성 규칙 : 𝑋→𝑌이고, 𝑊𝑌→𝑍이면, 𝑊𝑋→𝑍이다

💬 고객번호는 고객명을 종속할까?
✔️ 같을때 같은가? 고객번호, 고객명의 중복이 없으므로 같은게 없다. 따라서 종속한다. 하나의 고객번호에 하나의 고객명으로 정해진다. 함수적으로 종속한다.

💬 고객명은 등급에 종속할까?
✔️ 같을때 같은가? 그렇다. 따라서 함수적으로 종속한다. 중요한건 같을때 같은지를 보는거지, 같지 않을때 어떤지는 중요하지 않다. 중복되는 유관순은 없고, 단 하나뿐인 유관순의 등급이 GOLD이므로 같을때 같다고 볼 수 있다. 따라서 종속한다!

💬 {고객번호, 고객명}은 할인율에 종속한다.
✔️ 고객번호와 고객명의 쌍이 같은 레코드가 없다. 따라서 할인율이 같든지 말든지 고려할 이유가 없음. 따라서 종속성은 참이다.

⭕️ 결과적으로, 고객번호는 {고객명, 등급, 할인율}에 종속한다.

카노니컬 커버

  1. 함수적 종속성 추론 규칙으로 확장된 클로저에는 자명한 종속성중복된 종속성을 포함한다는 문제점이 있다.

    • 자명한 종속성: A -> A (의미가 당연)
    • 중복된 종속성: X -> AB, X->B (의미가 여러번 존재)
  2. 불필요한 함수적 종속성을 제거한 표준형으로 변환 후 정규화를 수행

  3. 표준형 조건

    • F의 모든 함수적 종속성의 오른편 속성은 반드시 한개
      ex. {x,y}->{z} 가능. {x} -> {a,b} 불가능.
    • F에서 X->A를 X의 진부분집합 Y에 대하여 Y->A로 교체했을 때, 그 집합이 F와 동등한 집합이 불가능.
    • F에서 어떤 함수적 종속성을 제거했을 때, 그 집합이 F와 동등한 집합이 불가능.

이같은 표준형의 과정을 거쳐 불필요한 함수적 종속성을 가지치키 한 것을 카노니컬 커버라 하고, 다음과 같이 표기함.


3. 정규화

정규형의 개념

정규형

정규화는 정규형을 만들어내기 위함. "어떤 릴레이션이 정규형을 만족해? 그럼 정규화를 거쳐서 정규형을 만족하도록 만들어야지!" = 정규화

  1. 이상 현상을 최소화하도록 특정 조건을 갖춘 릴레이션의 형식
  2. 정규형의 분류


가면갈수록 제약조건이 까다로워지고 효율성이 높은 릴레이션이됨. 일반적으로 현업에서는 제4, 제5 정규형까지는 하지 않는다.

정규화의 목적

정의
특정 정규형의 조건을 만족하도록 릴레이션과 속성을 재구성하는 과정

  1. 정규화의 기능
    • 데이터베이스 내에 모든 릴레이션을 효과적으로 표현
    • 보다 간단한 관계 연산에 기초하여 검색 알고리즘을 효과적으로 작성할 수 있도록 지원
    • 바람직하지 않은 삽입, 수정, 삭제 등의 이상 발생 방지
    • 새로운 형태의 데이터가 삽입될 때 릴레이션 재구성의 필요성을 축소

DB 모델링 시, "사용자 요구 분석> 개념적 데이터모델링 > 논리적 데이터모델링 > 정규화 > 물리적 구현"으로 정갈하고 효율적인 릴레이션 스키마 제작 가능!

제1정규형

  1. 가장 조건이 단순한 정규형
  2. 관계형 모델에 조건에 따라 자동 적용되는 정규형

정의
릴레이션 스키마에서 정의된 모든 속성의 도메인이 원자값을 갖는 상태

컬럼값의 원자성 성립 = 제 1 정규화 성립

제 1정규화가 필요한 릴레이션

콤마, 파이프 등 구분자 특수기호를 사용하여 하나의 컬럼값에 여러가지 의미를 넣는 경우가 있음. 이는 관계형 모델 사용 자체의 문제가 발생할 수 있으므로 권장되지 않습니다!

김규식 관리자가 관리하는 도크에 대해 어떤 배가 입항시간이 언제이고 출항시간이 언제인지 유추할 수 없다. 각각 값의 정확한 매칭을 알 수 없으므로 항상 원자값을 가져야 한다.

예제 릴레이션의 설명

예제를 직접 보기전에 배경지식 설명.
거대한 배를 수입, 수출할때 외국의 바다 환경까지 정확히 알기 힘들어 거대한 배의 주차문제를 도와주는 작은 차들이 있고, 주체를 도와 지시하는 관리자도 있음. 이에 관해 릴레이션을 만들어 볼 것.

  1. 선박이 항구에 정박하기 위해 정밀한 작업이 요구
    • 풍향과 풍속, 파도와 안개 상황등을 고려
    • 딘순히 수신호 뿐만 아니라 소형 배들로 정박하려는 대형 배를 밀어 안전하게 위치시키는 작업을 고려
  2. 도선사: 배를 도크에 안전하게 접안시키고 항로를 인도하는 일을 하는 사람
  3. 도크: 선박의 건조, 수리, 계선, 하역 작업등을 위해 축조된 설비 및 시설의 총칭(주차장 같은거)

제1정규화를 적용한 릴레이션

함수적 종속성 판별

Q. 도크번호는 도크관리자를 종속하는가?
A. O. 항상 특정 도크번호에 따라 같은 도크관리자가 같다.

Q. 목적이 담당관리자를 종속하는가?
A. O. 같을때 같은지만 고려하면 된다. 다를때 어떤지는 고려할 필요 없다.

Q. 목적이 도크번호를 종속하는가?
A. O. 이하동문

함수적 종속성 다이어그램

위의 릴레이션에서 못해도 8개, 9개의 함수족 종속성을 찾을 수 있음. 이를 쫙 나열하면 이해하기 힘들고 직관성이 떨어진다. 이를 이해하기 쉽게 도식화할 수 있다!

  1. 릴레이션 내의 속성간의 종속 관계를 직관적이고 이해하기 쉽게 도식화 한 표현 방식
    • 직사각형: 속성 또는 속성 집합
    • 화살표: 함수적 종속성

도크 릴레이션의 함수적 종속성 다이어그램

화살표의 시작과 끝을 잘 파악해야 한다!
{도크번호, 입항시간}이 같이 출항시간을 종속.


제 2정규형

제 2정규형의 정의

  1. 릴레이션이 제 1정규형을 만족하고 기본키의 부분집합이 특정 속성을 종속하고 있지 않은 상태

정의
주어진 릴레이션의 인스턴스가 기본키가 아닌 속성들이 기본키에 완전히 종속되어 있는 상태.

제 2정규형의 적용

  • 출항시간, 목적, 담당도선사: 릴레이션의 키인 {도크번호, 입항시간}에 종속됨. 키에 완전히 종속되어 있다.
  • 도크관리자: 키가 아니라 키의 일부분인 {도크번호}에 종속. 키에 부분적으로 종속되어 있다.
    => 부분 종속은 중복을 야기시킨다. 이 부분을 따로 빼내 효율성을 증진시켜야 한다.

릴레이션의 무손실 분해

아무렇게나 분해하면 될까? 그럼 손실 분해가 일어날 수 있다. 필요에 의해 레코드를 구분하여 두개의 테이블을 생성하고, join을 통해 묶어서 결과를 도출해야 하는데, 분해한 릴레이션을 다시 join했을 때 분해 전의 릴레이션으로 돌아가지 못하는 것을 손실분해라 한다.

  1. 무손실 분해(lossless decomposition)

X가 Y를 종속할때, 서로 같은 컬럼을 공유하지 않으면, Y만 떼어낸 릴레이션과 X와 Y컬럼으로만 구성된 두개의 릴레이션으로 분해해도 아무런 문제가 발생하지 않는다.

  1. 도크관리 릴레이션 무손실 분해
    • {도크번호} ➝ {도크관리자}
    • {도크번호} ∩ {도크관리자} = Ø

도크관리 - {도크관리자}(R-Y, 릴레이션에서 도크관리자 제거.),
{도크번호, 도크관리자}(XY)

제 2정규형의 적용

제 2정규화의 함수적 종속성 다이어그램

두개의 다이어그램(릴레이션)으로 분리. 제 2정규화의 조건. 모든 키가 아닌 속성들이 기본키에 종속되어 있는가? 라는 질문에 성립한다.


제 3정규형

정의
릴레이션이 제2정규형을 만족하고, 기본키가 아닌 속성들이 어떤 키에도 이행적으로 종속되지 않은 상태

이행적 종속성 : 𝑋 → 𝑌이고 𝑌 → Z이면. 𝑋 → Z이다.

제 3정규화의 정의

이행적 종속성이 있으면 부분적 종속성이 발생하니, 이행적 종속성을 끊어내야 한다. 어떻게 해야 할까? "담당도선사"만 빠져나가면 된다.

제 3정규화의 적용

위의 도크 릴레이션에서 목적 -> 담당도선사를 따로 빼내어 부분 종속성을 제거할 수 있다.

결과물 자체가 효율적이지 않아 보이더라도, 데이터가 수백, 수천만개가 될때를 고려해서 생각해보면 효율성극대화 될 것임을 알 수 있다.


BC 정규형

BC정규형의 정의

정의
릴레이션이 제 3정규형을 만족하고 릴레이션에 성립하는 X->Y형태의 모든 함수적 종속성에 대하여 X가 슈퍼키인 상태

  1. 입출항관리 릴레이션의 함수적 종속성
    • {도크번호, 입항시간} → {목적}
    • {도크번호, 입항시간} → {출항시간}
    • {목적} → {도크번호}

기본키가 아니며, 슈퍼키도 아닌 일반 속성인 {목적}이 도크번호라는 속성을 종속하고 있다. => BC정규형을 위반

BC정규화의 적용

목적이 결정자고, 도크번호가 종속자이므로 기본키의 도크번호가 목적으로 대체됨. 결과적으로 하나의 릴레이션이 4개로 나뉘게 된다.

정규화 결과

<제 1 정규화가 이루어진 릴레이션>

< BC정규화까지 거친 릴레이션 >

정보 손실없이 무손실로 정규화를 거쳤기 때문에 JOIN을 이용하면 정규화 이전으로 데이터 손실없이 돌아갈 수 있다!

역정규화의 개념

역정규화: 정규화의 반대. 분할한 릴레이션을 다시 원래로 돌리는 것

  1. 정규화
  • 릴레이션 분할을 통해 데이터의 중복을 최소화하는 과정
  • 사용 과정에서 많은 조인 연산을 유발

(조인은 DBMS에 많은 내부연산을 유발하는 명령어중 하나. 사용자가 무언가를 요구할 때 많은 시간을 요구한다. 실제 현실에서는 이론이 아니라 성능, 퍼포먼스가 중요할때가 많다. 빠른 검색이 가능한 환경을 구성하기 위해선, 이러한 정규화를 다시 역정규화 하는 과정이 필요하다.)

  1. 역정규화
    • 정규화의 반대 과정
    • 정규화를 통해 분리되었던 릴레이션을 통합하는 재조정을 수행하고 정보의 부분적 중복을 허용하는 기법
    • 데이터 접근 성능을 개선
  2. 정규화되지 않은 스키마와 역정규화 스키마는 구별
    그럼 정규화를 하지 않은건가요? 아닙니다. 정규화를 가치고, 앞단계로 되돌리는 추가작업입니다!

아... 정규화진짜 너무 헷갈린다.

📌 정규화

  • 제 1 정규형: 릴레이션 스키마에서 정의된 모든 속성의 도메인이 원자값을 갖는 상태. (=컬럼값의 원자성 성립)
  • 제 2 정규형: 주어진 릴레이션의 인스턴스가 기본키가 아닌 속성들이 기본키에 완전히 종속되어 있는 상태. (기본키에 완전히 종속되도록 릴레이션을 구분한다.)
  • 제 3 정규형: 제 2정규형 만족 & 기본키가 아닌 속성들이 어떤 키에도 이행적으로 종속되지 않은 상태.
  • BC 정규형: 제 3정규형 만족 & X->Y 함수적 종속성 만족 시 X가 슈퍼키(유일성)인 상태.

으으 머리아퍼

profile
Good Luck!

0개의 댓글