SQLD: 정규화, 관계와 조인
1과목의 데이터 모델과 SQL 파트에 해당하는 부분으로, 설계도에서 정규화, 조인, 트랜잭션 등을 파악할 수 있는지 물어보는 문제들이 있다.
정규화
데이터에 대한 중복을 제거하고, 데이터가 관심사별로 처리되도록 엔터티를 쪼개 성능을 향상시키는 활동이다.
반정규화: 중복을 포함하며, 엔터티를 합치는 개념이다.
거의 대부분 정규화를 하지만, 간혹 특수한 사례에 대해 반정규화를 한다.
정규화시 입력/삭제/수정 연산의 성능이 무조건 향상되지만, 조회에 대해서는 성능의 향상 또는 저하가 발생할 수 있다.
입력/삭제/수정 - DML
함수적 종속
정규화를 하기 위해 알아야 하는 개념으로, 어떤 기준 값(컬럼=속성)에 의해 나머지 데이터가 종속되는 현상을 의미한다.
F(X) = Y
X를 결정자라고 했을 때, 나머지 속성들 Y가 종속되어 종속자가 된다.
상세 정규화 과정
비정규형에서 도메인 원자성이라는 조건을 만족시키면 1NF가 된다. 1NF는 1차정규화를 완료한 1차정규형이다. 1NF에서 부분종속성을 제거하면 2NF가 되며, 이행종속성제거를 하면 3NF가 된다.
도메인원자성
부분종속성제거
이행종속성제거
결정자제거
다치종속
조인속성
비정규형: 데이터가 중복이 되어있어 정규화가 필요한 상태의 데이터
도메인 원자성 = 1차정규화
1차정규화
엔터티에서 다중 속성이 있거나, 하나의 속성에 여러 속성값이 있으면 원자값으로 쪼개준다.
직원 ID | 이름 | 연봉 | 연락처 |
---|---|---|---|
A0001 | 강홍정 | 5000 | 010-1231-1234, 02-123-1234 |
A0002 | 정치호 | 6000 | 02-222-2222 |
A0003 | 강태우 | 7000 | 010-3333-333 |
위 테이블과 같이 하나의 인스턴스의 속성에 두 개 이상의 값이 있다면 해당 인스턴스를 두 개의 인스턴스로 나누어 주는 것이다.
직원 ID | 이름 | 연봉 | 연락처 |
---|---|---|---|
A0001 | 강홍정 | 5000 | 010-1231-1234 |
A0001 | 강홍정 | 5000 | 02-123-1234 |
A0002 | 정치호 | 6000 | 02-222-2222 |
A0003 | 강태우 | 7000 | 010-3333-333 |
(1차정규형)
도메인: 속성이 입력받을 수 있는 값의 범위
예: 나이는 숫자로, 0부터 150사이의 값
직원 ID | 이름 | 연봉 | 연락처 | 주소1 | 주소 2 |
---|---|---|---|---|---|
A0001 | 강홍정 | 5000 | 010-1231-1234 | 중구 택지로 1번지 | 서울 중앙 보훈기관 123호 |
위와 같은 형태로 같은 의미의 속성이 나누어져 있는 겨우 또한 정규화의 대상이다.
직원 ID | 이름 | 연봉 | 연락처 | 주소 |
---|---|---|---|---|
A0001 | 강홍정 | 5000 | 010-1231-1234 | 중구 택지로 1번지 |
A0001 | 강홍정 | 5000 | 010-1231-1234 | 서울 중앙 보훈기관 123호 |
즉, 1차 정규화란 도메인의 원자성을 확보하기 위한 활동이며, 이는 하나의 속성 아래에는 하나의 값만 있어야 하기 떄문에 이를 보장하기 위한 행동이다.
2차 정규화
2차 정규화는 1NF -> 2NF 형태로 엔터티를 변경하는 활동이다.
식별자에 부분 종속 하는 대상을 쪼개어 준다.
= 부분 종속 제거
3차 정규화
엔터티에서 일반속성끼리 함수종속이 발생하면 쪼개준다.
이행종속이란 특성 식별자 X로 Y를 식별할 수 있고, Y로 Z를 식별할 수 있으면 X도 Z를 식별한다는 것이다.
직원 ID | 이름 | 연봉 | 연락처 | 부서ID | 부서명 |
---|---|---|---|---|---|
A0001 | 강홍정 | 5000 | 02-123-1234 | D001 | 인사부 |
A0002 | 정치호 | 6000 | 02-222-2222 | D002 | 급여부 |
A0003 | 강태우 | 7000 | 010-3333-333 | D001 | 인사부 |
결정자 (직원ID) -> 종속자(나머지 컬럼들)
| 직원 ID | 이름 | 연봉 | 연락처 | 부서ID | | —— | —— | —— | —— | —— | | A0001 | 강홍정 | 5000 | 02-123-1234 | D001 | | A0002 | 정치호 | 6000 | 02-222-2222 | D002 | | A0003 | 강태우 | 7000 | 010-3333-333 | D001 |
부서ID | 부서명 |
---|---|
D001 | 인사부 |
D002 | 급여부 |
관계와 조인
조인이란?
조인이란 식별자를 상속해 이를 이용하여 데이터를 결합해 여러 엔터티에서 필요한 데이터를 한번에 가져오는 것이다.
원래라면, 여러 엔터티를 모두 조회하여 필요한 정보를 하나씩 가져와야 하지만, 조인을 사용하여 한 번에 가져옴으로 성능적인 개선을 이룬다.
계층형 데이터 모델
계층구조를 가진 데이터를 저장한 모델 자기 자신의 엔터티와 관계가 발생하는 경우
상호배타적 관계
A와 B가 C집단에는 소속되어있지만, 서로 공통적인 부분이 없는 관계
Note: 설계도를 보고, 현재 어떤 상태인지 이해할 수 있는가를 판단하는 것 같다.