기록이 힘이다.

[모델링 노트] 02. 정규화 이야기 본문

IT서적

[모델링 노트] 02. 정규화 이야기

dev22 2023. 12. 20. 15:03
728x90

데이터 모델을 제대로 설계하기 위한 근본적인 해결책은 정규화뿐이다. 시스템에 따라 정규화가 필요없을 수 있지만, 그건 필요에 따른 선택일 뿐이며, 이마저도 원칙에 바탕을 둔 선택이다. 

 

정규화란?

식별자에 종속된 유사한 속성들을 모으고, 종속되지 않은 독립적인 속성들은 분리하여 속성을 명확히 구별하는 것이 정규화다. 

 

정규화를 수행하는 것은 중복 속성을 제거하기 위함이지 액세스 성능을 최적화하기 위함은 아니다. 정규화를 하면 엔터티는 분해되고 중복 속성은 제거되기 때문에 데이터를 추출할 때 성능이 떨어질 수 있다.

 

더이상 추가할 속성이 없는 모델보다, 제거할 속성이 없는 모델이 완벽한 모델이다. 중복을 최대한 제거하는 과정이 정규화다. 

 

함수 종속이란? 

함수 종속은 관계형 모델을 설계할 때 가장 중요한 데이터 종속성이다. 

 

한 속성의 값을 알면 다른 속성의 값은 저절로 결정되는, 두 속성 간의 일종의 제약이다. 

 

반례를 찾을 수 없다면 함수 종속이 성립하는 것이다. 

 

주문번호 -> 주문일자,고객번호,상품번호

X->Y 와 같이 속성 간의 종속(직접 종속) 관계가 발생하면 X와 Y는 항상 함께 존재해야 한다. 

 

X->Y->Z 와 같은 종속을 이행 종속이라 하며, 3정규형과 관련된 종속이다. 함수 종속은 일반적으로 직접 종속을 의미한다. 

 

함수 종속과 정규화

 엔터티는 정규화에 의해 생성되고 정규화는 함수 종속으로 수행되며, 함수 종속은 키가 없이는 존재할 수 없는 개념이다. 서로 연관돼 상호 작용하므로 결국 최종적으로 설계할 엔터티와 주 식별자는 별개가 아닌 한몸이나 마찬가지다. 

#계좌번호 관리부서번호 계좌명 고객주민등록번호 고객명 고객관리사원번호
12345678 100 홍길동 123456-7890123 홍길동 12345
23456789 110 오성 987654-3210987 오성(주) 23456

새로 설계할 때 정규화와 무관하게 화면이나 업무 요건 문장을 그대로 릴레이션으로 설계할 때 생길 수 있다. 

 

[정규형 릴레이션] 

#계좌번호 관리부서번호 계좌명
12345678 100 홍길동
23456789 110 오성

주 식별자에 따른 분류

 

[비정규형 릴레이션]

#계좌번호 관리부서번호 계좌명 고객주민등록번호 고객명 고객관리사원번호
12345678 100 홍길동 123456-7890123 홍길동 12345
23456789 110 오성 987654-3210987 오성(주) 23456

중복을 추가한 릴레이션, 성능 문제 등의 이유가 있을 때 비정규형 릴레이션으로 설계하게 된다. 

 

1정규화의 대상

- 다가 속성이 사용된 릴레이션

[고객]

#고객번호 고객명 주민등록번호 전화번호
100 홍길동 123456-7890123 123-4567,234-5678
101 강길동 234567-8901234 456-7890,567-8901

한 속성에는 반드시 하나의 값을 가져야 한다는 1정규형에 어긋나는 릴레이션이다. 

 

#고객번호 고객명 주민등록번호
100 홍길동 123456-7890123
101 강길동 234567-8901234
#고객번호 #전화번호
100 123-4567
100 234-5678
101 456-7890
101 567-8901

 

- 복합 속성이 사용된 릴레이션

정규화를 하기 전에 먼저 업무 요건을 고려해야 한다. 속성을 분리해야 업무에서 효율적으로 사용할 수 있는지를 검토해야 한다. 

고객
#고객번호
*고객성명
*주민등록번호
고객
#고객번호
*고객성
*고객명
*주민등록번호

 

- 유사한 속성이 반복된 릴레이션

모든 속성이 단일 값을 사용해야 한다는 것 이외에 1정규형에서 중요한 원칙은 한 릴레이션에서 반복 형태의 속성이 있어서는 안 된다는 것이다. 

#주문번호 고객번호 주문일자 상품번호1 주문수량1 상품번호2 주문수량2 상품번호3 주문수량3
1234 100 2023-12-20 P0001 2 A0001 1 {NULL} {NULL}
1235 101 2023-12-30 B0002 1 C0002 1 B0001 2

 

현재 세 상품 이하로 주문하더라도 더 주문할 것을 대비한다면 다음 모델과 같이 1정규화를 해야 한다. 

- 중첩 릴레이션

#주문번호 #상품번호 고객번호 주문일자 주문수량
1234 P0001 100 2323-10-10 2
1234 A0001 100 2023-10-10 1

 

#주문번호 고객번호 주문일자 #상품번호 주문수량
1234 100 2323-10-10 P0001
A0001
2
1

중첩 릴레이션은 물리적으로 발생하지 않지만 논리적으로 간혹 발생한다. 

 

- 동일 속성이 여러 릴레이션에 사용된 경우

동일 속성이 여러 엔터티에 존재하는 것은 통합이 안 된 결과이므로 바람직하지 않다. 가능한 동일한 성격의 속성이 여러 엔터티에 존재하지 않도록 하는 것이 바람직하다. 

 

정규형과 비정규형의 특징 

비정규형

- 업무 요건의 변경에 매우 취약하다. 즉 모델의 확장성이 좋지 않다. 

- 인덱스 수가 증가하고, 속성을 종으로 보여주는 화면에 대한 쿼리가 복잡해진다. 

- 반복 속성이 추가될 가능성이 없을 때 사용할 수 있다. 

- 전체 속성 레벨로 관리되므로 해당 데이터의 자식 엔터티를 가질 수 없다. 

 

정규형 

- 업무 요건의 변경에 유연하다. 즉 확장성이 좋은 모델이다. 

- 인덱스 수가 감소하고, 속성을 횡으로 보여주는 화면에 대한 쿼리가 비교적 복잡해진다. 

- 반복 속성이 추가될 가능성이 존재할 때 사용한다. 

- 인스턴스 레벨로 관리되므로 데이터의 자식 엔터티를 가질 수 있다. 

 

비정규형의 가장 커다란 특징은 조회 성능이 좋아질 수 있다는 점이다. 비정규형의 특징이자 가장 커다란 단점은 업무 요건이 변경되면 대처하기 쉽지 않다는 점이다. 

 

2정규형

 

부분함수종속이 발생한 엔티티

정규화한 모델 

중복속성을 채택한 비정규형 

3정규형

식별자가 아닌 속성 간에는 종속성이 존재하면 안된다. 비식별자 속성 간에 발생하는 이행적 종속성과 관련 있다. 

3정규화 대상 엔티티 

3정규화한 모델

BC 정규형

BC 정규화 대상 엔터티

정규화한 모델 

코드 데이터는 코드 엔터티에서 통합 관리하는 것이 바람직하다. 그리고 업체나 과목 같은 엔터티는 실체나 기본 정보 성격의 데이터이므로 관리 속성이나 데이터가 적더라도 별도의 엔터티로 분리해 관리하는 것이 바람직하다. 

 

4정규형

다가 종속이 발생한 릴레이션

이는 사원과 기술, 사원과 언어라는 두 개의 다가 속성을 하나의 릴레이션에서 관리하기 때문이다. 

#사원 #기술 #언어
홍길동 모델링 영어
홍길동 모델링 한국어
홍길동 튜닝 영어
홍길동 튜닝 한국어
강길동 자바 한국어
강길동 자바 영어
강길동 자바 일어

 

다가 종속이 발생하여 M*N 만큼의 인스턴스가 생성돼 중복 데이터가 존재한다. 중복이 발생하면 데이터 이상이 발생해 데이터를 온전히 다루기 어렵다. 

#사원 #기술
홍길동 모델링
홍길동 튜닝
강길동 자바
#사원 #언어
홍길동 영어
홍길동 한국어
강길동 한국어
강길동 영어
강길동 일어

1정규화는 다가 속성을 엔터티로 분해하는 것이고 4정규화는 서로 관련이 없는 다가 속성을 개별 엔터티로 분해하는 것이다. 

 

5정규형

DBMS 에서 실제로 사용하기에는 적합하지 않지만, 다른 정규형과 구분하기 위해서 알아야 하는 정규형이다. 

2,3,BC정규형은 함수 종속 개념을 기반으로 수행되며, 4정규형은 다가 종속 개념을 기반으로 수행된다. 반면에 5정규형은 조인 종속 개념을 기반으로 수행된다. 

 

5정규형이 만족하도록 설계하면 오히려 엔터티가 늘어나며, 중복 성격의 데이터가 생긴다. 또한 사용하려면 어차피 조인해야 하기 때문에 실익이 없다.