가자미의 개발이야기

[데이터베이스] 정규화 본문

Computer Science/데이터베이스

[데이터베이스] 정규화

가자미 2021. 6. 5. 00:48

정규화 데이터의 중복 제거, 데이터 무결성을 지키기 위해.

 

무결성

-엔티티 무결성 : 기본키는 튜플들을 식별할 수 있게 해야하고(unique), null이 되어서는 안된다.

-참조 무결성 : 참조한 게 실제로 있어야 한다. (참조 값이 null이 가능해야 한다.)
 참조 무결성은 두 가지 중 하나를 준수하면 만족한다.

  (1) 외래 키의 값은 참조 릴레이션의 어떤 투플의 기본 값과 같다.

  (2) 외래 키가 자신을 포함하고 있는 릴레이션의 기본 키를 구성하고 있지 않으면 널값을 가진다.

-도매인 무결성 : 특정 속성의 값이 그 속성이 정의된 도메인에 속한 값이어야 한다

 

decomposition(분해) 큰 테이블을 두개로 쪼개는 것

하지만 lossy decomposition을 주의해야 한다.(나눈 걸 다시 합쳤는데 원래 것에서 정보 손실이 일어난 경우.)

이런 경우, 두 테이블은 이름으로 연결되는데, 만약 같은 이름의 두 사람이 있을 경우 정보 손실이 발생한다.

분해 후 다시 카티전 프로젝트를 했는데 원본과 달라졌다.

lossless decomposition 무손실 분해

무손실 분해
분해 후 다시 합쳤을 때 원본과 동일하면 무손실 분해다.

 

Function Dependencies 함수적 종속성

X와 Y를 임의의 속성 집합이라 할때, X의 값이 Y의 값을 유일하게 결정할 경우.

"X는 Y를 함수적으로 결정"하고, "Y는 X에 함수적으로 종속된다" 라고 한다.

 

쉽게 말해 X가 같을 때, Y도 같으면 된다.

 

K가 릴레이션 스키마 R의 슈퍼키이다. 와 K→R는 필요충분조건이다.

K가 릴레이션 스키마 R의 후보키이면  K→R이고, 어떤 속성 a가 K에 포함되는데 R을 함수적으로 결정하면 안된다.

함수적 종속성의 집합인 F가 있다고 할 때, F로부터 자연스럽게 유도되는 함수적 종속성이 있다.

(A→B ,B→C이면 A→C)

이렇게 나온 함수적 종속성의 집합을 F의 closure라고 하고 기호로 F+로 표시한다.

 

trivial 당연한 것

ID, NAME -> ID 이나 NAME->NAME 같은 함수적 종속성이 trivial이라고 한다.

일반적으로 b가 a에 포함되면, ab 은 Trivial 이다.

 

무손실 분해 추론하기

R을 R1과 R2로 분해했을 때

이 수식이 둘 중 하나만 trivial하게 추론 될 경우 무손실 분해이다.

 

종속성 보존

매번 데이터베이스가 업데이트 될 때마다 종속성 체크는 비효율.

분해된 릴레이션들 중 하나의 릴레이션에서만 종속성이 확인되면 종속성 보존.

→종속성 확인을 위해 카티전 프로젝트로 여러 릴레이션을 재구성해야 되는 경우는 비효율. 종속성 보존 안됨.

→함부러 분해하면 종속성 보존 안됨. 제약 조건을 보고 종속성에 영향 없게 분해.

 

Boyce-codd 정규화(BCNF)

R의 함수적 종속성 X→Y의 집합 F가 주어졌을 때,

F+가 둘 중 하나만 준수해도 BCNF를 충족한다.

X→Y가 trivial

X가 R의 슈퍼키

 

정보가 중복되어 저장되는 것을 싫어한다. 따로 테이블 분해 해주는 걸 원함.

 

만약 X→Y때문에 BCNF를 방해할 경우,

R을 (X와 Y의 합집합), (R-(Y-X))로 분해하면 BCNF를 충족할 수 있다.

 

하지만 BCNF와 종속성 보존을 동시에 만족시키지 못할 수 있다.

예시) dept_advisor(a, b, c) 일때, b→c, ac→b 함수 종속성을 가지는데, b가 슈퍼키가 아니면, BCNF를 충족시키지 않는다.

그러나 BCNF를 지키기 위해 분해를 할 경우, ac→b를 충족시킬 수 없다.(종속성 보존 실패)

 

제3정규형 (3NF)

R의 함수적 종속성 X→Y의 집합 F가 주어졌을 때,

F+가 둘 중 하나만 준수해도 3NF를 충족한다.

X→Y가 trivial(BCNF)

X가 R의 슈퍼키(BCNF)

Y-X의 속성 A(Y에만 있는)가 R의 후보키에 포함된다.

 

중복의 문제가 발생 가능. null 발생 가능하다.

BCNF를 준수 시 제3정규형도 만족하지만, 제3정규형을 만족한다고 BCNF를 만족하는건 아니다.

 

BCNF와 3NF의 비교

공통점 : 무손실분해

차이점 : 종속성 보존은 3NF가 유리, 중복이나 null 문제는 BCNF 유리

 

Design goals

BCNF/Lossless join/종속성 보존 을 목표로 정규화.

하지만 모두 지킬 수 없으면, 종속성 보존을 포기하거나 3NF로 정규화

(sql에서는 함수적 종속성을 검증하는게 힘듬, 기본키로 간접적으로 확인하는 편)

 

결국 함수적 종속성을 포기하고 BCNF VS 중복 생성을 발생해도 3NF 둘중 뭐가 나은지 고민해야.

 

Multivalued dependencies (다치 종속성)

어떤 조건 하에 튜플이 존재할 것을 기대하는 종속성.

예시) 어떤 사람이 철수와 영희를 자녀로 가졌고 123과 456이란 번호를 가졌을 경우.

R = {ID, child_name, phone_number)

t1=(1, 철수, 123)

t2=(1, 철수, 456)

t3=(1, 영희, 123)

t4=(1, 영희, 456)
이렇게 데이터에 저장되어 있을 것이다.

 

이때 다치 중속성(MVD)는 ID→→child_name 혹은 ID→→phone_number라고 할 수 있다.

t1~t4 중 두개를 골랐을 때, 그에 다른 경우도 다 튜플로 저장되어 있어야 함을 의미한다.

 

ID→→child_name 이고 t1과 t4를 선택햇을 경우, t1의 다른(child_name만 다른) t3가 존재하고, t4의 다른 t2가 존재한다.

쉽게 말해 ID는 child_name에 따른 모든 조합이 존재해야 한다는 것을 의미한다.

(비록 하나로 결정은 못하지만 두가지로 결정이 된다.)

(그리고 나머지 속성들도 다중결정된다.)

(X→Y이면, X→Y이다.)

 

제 4 정규형 4NF

X→→Y 이 trivial (즉 Y가 X에 포함되거나, X와Y의 합집합이 R)

X가 R의 슈퍼키

모든 종속성이 둘 중 하나를 만족하면 4NF다.

4NF를 만족시 BCNF도 만족한다.

 

#반정규화

정규화는 저장 효율성을 고려하여 데이터베이스를 재구성하는 행위. 하지만 이로 인해 지나치게 많은 조인을 발생시켜 시간 효율이 낮아질 수 있음.

만약 시간 효율이 중요한 경우 고의적으로 정규화를 무시한 반정규화로 조인을 최소화 할 수 있다.(중복과 수정이 힘들어진다. 데이터 불일치도 발생가능) (반정규화 대신에 실체화된 뷰를 통해 특정 결과값을 저장해 시간을 줄일 수 있다.)

 

 

#정규화로 감지할 수 없는 이슈

 

필요 이상으로 많은 테이블을 사용할 경우

예시) R(회사이름, 년도, 순이익) vs R2(회사이름, 순이익)을 년도마다 테이블 만들기 vs R3(회사이름, 2020년 순이익, 2021년 순이익)

 

일시적인 데이터 다룰 경우

ID → 사는 곳. 이럴 경우 사는 곳은 자주 바뀔 수 있으므로 추천하지 않는다.