[32일차]ERD(조금), 정규화, 비정규화

유태형·2022년 6월 13일
0

코드스테이츠

목록 보기
32/77

오늘의 목표

  1. ERD(조금)
  2. 정규화
  3. 비정규화



내용

ERD(조금)

테이블을 만들 때 흔히 제약조건으로 값을 어떻게 지정할 지가 몇가지 방식이 있습니다.

STORED : 기존의 방식으로 데이터 값을 저장합니다.
VIRTUAL : 기존의 방식과는 다르게 데이터를 저장하지 않고 정의만 저장합니다. 해당 칼럼을 읽으려고 할때 데이터에 대한 작업이 진행됩니다.

스키마 정의시 몇가지 자주 사용하는 조건들도 있습니다.

NOT NULL : null을 사용할 수 없도록 합니다. null입력시 에러 발생
DEFAULT NULL : 아무 값도 입력하지 않는다면 null을 기본값으로 저장합니다.
NOT NULLDEFAULT NULL 을 모두 사용 : 사용자가 임의로 NULL을 입력하면 에러가 발생하지만, 아무값도 입력하지 않을 시 NULL을 저장합니다.

CURRENT_TIMESTAP : 현재 시간을 나타냅니다.
DEFAULT_GENERATED : CURRENT_TIMESTAMP의 인자로 시간 기준을 전달합니다.




정규화

정규화 이유

  • Data Redundancy : 데이터가 중복되어 여러가지 문제점을 일으킵니다. 예를 들어 저장 공간이 낭비된거나, 일관된 처리가 어렵게 되거나(중복중 어떤 데이터 선택?), 효율성이 감소할 수 있습니다.

  • Data Integrety : 정규화는 데이터 무결성을 보장하여 데이터의 생명주기동안 정확성과 일관성을 유지하는 것을 뜻합니다.

  • Anomaly : 데이터 이상현상으로 3가지가 존재합니다. 만약 릴레이션 내에 데이터 중복이 존재한다면 의도치 않은 결과가 발생할 수도 있습니다.
    o 갱신 이상(update anomaly) : 데이터 업데이트 시 중복되는 데이터들 중 어떤 데이터를 선택해야하는지 모호성에서 오는 이상입니다.
    o 삽입 이상(insert anomaly) : 데이터를 추가 시 아직 정해지지 않은 속성이 존재한다면 추가할 수 없는 이상입니다.
    o 삭제 이상(deletion anomaly) : 데이터 삭제 시 한개만 지우려거 했지만 중복되는 값들을 가진 데이터들이 모두 지워지는 이상입니다.

정규화는 이상 현상들이 일어나지 않도록 방지하기 위해 속성들을 체계적으로 분리해 나가는 과정입니다.



정규화 요약

사진과 글로 작성한 것 보다 영상이 이해하는 데는 훨씬 유익한 것 같아 아래 링크를 남기겠습니다.

https://youtu.be/RXQ1kZ_JHqg
출처 : 에듀온유튜브

정규화는 기본적으로 단계별로 이루어 집니다. 즉 제3 정규화를 충족시키기 위해서는 제2 정규화를 만족해야 하고 제2 정규화를 충족시키기 위해서는 제1 정규화를 만족해야만 합니다.



제1 정규화(1NF)

제1 정규화는 도메인의 원장성을 충족시키는 것입니다. 쉽게 풀어 말하자면 모든 속성의 도메인이 복수의 값을 허용하지 않는 것입니다.(하나의 속성 = 하나의 단일 값)



제2 정규화(2NF)

제2 정규화는 제1정규화를 만족해아만 합니다. 또 제 2정규화는 부분적 함수 종속을 제거해야만 합니다.
제1 정규화를 만족하면서 키가 단일 속성이라면 무조건 제2 정규화를 만족합니다. 하지만 하나의 키가 여러 속성으로 이루어진 복합 키인 경우, 복합 키의 하나 이상의 속성이 다른 속성을 구분할 수 있으면 제2 정규화를 만족하지 않습니다.

다른 속성을 구분할 수 있는 복합 키의 부분 집합을 따로 릴레이션화 시켜서 부분 함수 종속성을 제거하고 완전 함수 종속성을 만족시켜야 합니다.

부분 함수 종속성 : 복합키의 일부(전부X)만으로 다른 속성을 구분할 수 있음
완전 함수 종속성 : 부분 함수 종속성이 없고, 복합 키여도 모든 복합키의 모든 속성을 합쳐야만 다른 속성을 구분할 수 있음



제3 정규화(3NF)

제3 정규화는 제2 정규화를 만족하고 이행적 함수 종속을 제거해야만 합니다. 이행적 함수 종속이란 A -> B이고 B -> C 이면 A -> C가 참인 논리입니다.

한 릴레이션에 A,B,C 속성이 존재하고 3개의 속성이 위와 같은 이행적 함수 종속을 만족한다면 A, B 속성의 릴레이션1, B, C속성의 릴레이션2로 릴레이션을 분리하여야 이행적 함수 종속을 제거할 수 있습니다.

보통 제3 정규화 까지만 하여도 보편적으로 정규화를 많이 충족 시킨 경우 입니다.



Boyce - Codd 정규화(BCNF)

BCNF는 자주 사용되지는 않습니다. 제3 정규형이면서, 복합 키일 때 후보키가 아닌 속성중 하나가 복합 키의 속성중 몇개를 다시 구분할 수 있을 때 BCNF를 위반합니다.

예를 들어 복합키(A,B) -> C(후보키X) 를 구분할 수 있지만, C(후보키X) -> B(복합키의 부분)을 구분할 수 있다면 BCNF를 위반하였으므로 릴레이션1(A,C), 릴레이션2(C,B)로 릴레이션을 분리 시킴으로써 결정자 이면서 후보키가 아닌것을 제거합니다.



제4 정규화(4NF)

4정규화는 BCNF이면서 다치 종속을 제거 해야만 합니다.
다치 종속이란 중복이 일어나는 속성이 여러개인 릴레이션을 의미합니다.

예를 들어 릴레이션1(A,B,C,D)가 있을 때 , 속성B가 중복을 가질 순 있습니다. 하지만 B도 중복이고 CD도 중복일 때(중복 데이터가 있는 열이 여러개일 때) 다치 종속이 발생합니다.(A -> B(중복...), A -> C(중복...))

중복데이터가 있는 속성을 1개 까지만 허용하도록 중복 릴레이션들을 분리 합니다.



제5 정규화(5NF)

5정규화는 4정규화를 만족하면서 조인 종속성을 이용합니다. 조인 종속성이란 두 테이블을 분리시켰다가, 조인 연산으로 다시 합쳤을 때 나누기 전과 다시 합한 테이블이 동일 해야 합니다.

조인 연산을 수행할 때 중복이 있을 수 있는 후보키가 아닌 속성을 가지고 조인 연산을 수행하면 의미없는 레코드가 발생할 수 있습니다.

하지만 중복이 있을 수 없는 후보키(주키) 속성을 가지고 조인 연산을 수행하면 분리전 있던 레코드만 생성하게 되므로 조인 종속성을 만족합니다.




비정규화

비정규화는 JOIN연산을 줄이고, 자주 사용되는 레코드나 속성만 따로 캐시처럼 빼내서 참조하거나 확장성을 확보하기 위해 사용됩니다. 의도적으로 데이터 모델을 통합, 중복, 분리하여 정규화 원칙을 분리하여 성능상 이점을 확보하는 행위입니다.

주로 열들을 분리시키는 수직 분할과 레코드들을 분리시키는 수평 분할 2가지가 존재합니다.



비정규화 장점

  • 자주 사용하는 레코드, 속성만 따로 빼놓아서 캐시처럼 사용가능 합니다.
  • 미리 join을 해 놓음으로써 연산 결과를 미리 정의해 놓을 수 있습니다.
  • 살펴볼 데이터가 줄기 때문에 큰 대여폭이 필요한 원본이라면 실행시간이 상당히 줄어듭니다.


비정규화 단점

  • 비정규화르 과도하게 할 경우 오히려 join연산이 더 오래 걸릴 수 도 있습니다.
  • 테이블 분리, 통합, 중복허용 등으로 인하여 이상현상이 발생할 수 있습니다.
  • 반 정규화 과정에서 데이터에 손상이 있을 수 있습니다.(안정성)



후기

데이터의 정규화는 데이터 설계시 매우 중요한 개념입니다. 다 외울 필요 까지는 없지만 3정규화 까지는 익혀두는 것이 필요해 보입니다.




GitHub

없음!

profile
오늘도 내일도 화이팅!

0개의 댓글