[SQLD] 2-1. 정규화 - 키워드 요약 | 정리 | SQLD 공부 | 개발자 자격증 :: 매운코딩
728x90
300x250

[과목1. 데이터 모델링의 이해 - 2-1. 정규화]

 

1.     1정규형 : 모든 속성은 반드시 하나의 값을 가져야 한다.

<위반 사례>

(1) 다중값 :  

하나의 데이터에 쉼표를 기준으로 여러 개 들어가는 경우

(ex. 고객이 연락처가 2개일 경우, 고객 테이블에 쉼표로 구분이 아닌 고객연락처 테이블을 생성하여 거기에서 별도 관리)

(2)   중복 데이터를 속성으로 분리 :

(ex. 주문에 대한 상세 상품내역들을 상품1, 상품2, 상품3이렇게 모두 컬럼화하여 관리하는 경우 주문상세 테이블을 생성하여 거기에서 별도 관리)

 

2.     2정규형 : 엔터티의 일반 속성은 주식별자 전체에 완전 종속적이어야 한다.

è 주식별자 외의 나머지 속성들은 모두 주식별자에 종속되어야 한다는 것.

<위반 사례>

(1)   주문 테이블[주문번호(PK), 상품번호(PK), 상품명] 일 경우, 상품명 속성은 주식별자인 주문번호+상품번호에 종속되는 것이 아닌 상품번호에 의해서만 함수종속성을 가지고 있다.

만일, 상품명을 변경하고자 한다면 주문상세에서 모든 상품명에 대한 데이터를 다 변경해야한다. 시점에따라 모두 반영되기 전에 조회를 한다면 일관되지 않는 데이터가 보일 수 있다. (갱신이상)

해결> 상품이라는 테이블을 생성하여 [상품번호-상품명]으로 상품명을 관리한다.

 

3.     3정규형 : 엔티티의 일반속성 간에는 서로 종속적이지 않는다.

<위반 사례>

(1)   이행 종속 : 주문 테이블[주문번호(PK), 고객번호, 고객명]일 경우에
주문번호->고객번호가 종속관계이고, 고객번호->고객명이 종속관계이면 주문번호->고객명이다.
이 경우를 두번 종속이 되어 맺어진 관계로 이행 종속으로 본다.
고객 테이블을 생성하여 고객번호-고객명 / 주문번호-고객번호로 나누어 해결한다.

데이터 중복에 대한 문제 개선, 고객 속성변경이 주문에 영향을 주지 않는 구조이다.

 

4.     반정규화와 성능

è 반정규화 장점 : 최적의 SQL로 읽기 성능 향상, 트랜잭션 처리 빨라짐

(1)   성능 향상 사례 :

조인을 거는 쿼리에서 조인된 테이블의 모든 데이터를 읽고 가져오기 때문에 데이터가 많아질수록 성능이 나빠진다. 그래서 성능향상을 위해 구분 컬럼을 속성으로 추가하여 조인 없이 SQL을 수행한다.

(ex. 주문[주문번호,고객번호,주문상태] – 결제[결제번호,주문번호,결제수단코드] 테이블에서 고객번호를 알기위해 주문,결제를 조인하지 않고 결제테이블에 고객번호 컬럼도 추가해두어 조인없이 수행.)

(2)   성능 저하 사례 :

주문 테이블에 송장번호까지 넣게되면.. 배송 테이블을 조인하지 않아도 되기 때문에 조회 성능은 빨라진다. 그러나 송장번호 갱신(update)로직이 추가되어 오히려 저하된다.

5.     반정규화 정리

(1)   조회(SELECT) 성능을 향상시키지만, 불필요한 입력(INSERT)/갱신(UPDATE)/삭제(DELETE) 로직이 추가된다.

(2)   이로인해, 데이터 불일치로 인한 정합성 문제뿐만 아니라 불필요한 트랜잭션으로 인한 성능 문제를 만들어낸다.

(3)   조회 성능에서 미미한 이점을 얻고, 불필요한 갱신으로 성능을 손해본다면반정규화가 합리적 판단이라고 할 수 없다.

(4)   반정규화는 합당한 근거를 기반으로, 꼭 필요할때만 적용해야 한다.

728x90

+ Recent posts