정규화
: 데이터베이스의 이상현상을 막기 위해, 데이터의 중복을 최소화하면서 테이블을 보다 잘 조직된 상태로 분해하는 과정
이상현상(Anomaly)
- 삽입이상
- 갱신이상
- 삭제이상
정규화의 결과
- 데이터의 입력, 수정, 삭제 성능 향상
- 조인의 횟수가 증가하면 데이터의 조회 성능 하락 가능성 증가(무조건적인 하락 X)
- 불필요한 트랜잭션을 줄일 경우 시스템 성능이 향상될 수 있다.
정규화 절차 | 설명 |
제1정규화 | 릴레이션의 속성값이 모두 원자값만으로 구성되어야 한다. - 중복값을 제거한다. - 기본키를 설정한다. |
제2정규화 | 기본키가 2개 이상의 속성으로 이루어진 경우 부분 함수종속성을 제거한다. |
제3정규화 | 기본키를 제외한 칼럼 간의 종속성을 제거한다. 이행 함수종속성을 제거한다. |
BCNF | 기본키를 제외하고 후보키가 있는 경우 후보키가 기본키를 종속시키면 분해한다. |
정규화 절차
제 1 정규화(비정규형 -> 1차 정규형)
: 하나의 속성이 여러 속성값을 갖거나 하나의 테이블에 유사한 속성이 반복될 때 이를 별도 테이블로 분리
* 분리한 테이블은 1 : M의 관계를 갖는다.
제 2 정규화(1차 정규형 -> 2차 정규형)
: (복합식별자의 경우) 일반 속성이 주식별자의 일부에만 종속성을 갖는 부분 함수종속성을 제거
제 3 정규화(2차 정규형 -> 3차 정규형)
: 주식별자가 아닌 일반 속성 간에 함수종속성이 존재하는 이행 함수종속성을 제거
A -> B, B -> C 일 때, A -> C 이면 이 경우를 제거
BCNF(보이스코드 정규화)
: 일반 속성이 기본키를 결정하는 경우
관계와 조인의 이해
슈퍼타입/서브타입 관계 테이블 병합
(반정규화 -> 테이블 병합에 대한 부분)
* 반정규화 하는 가장 큰 이유 -> 조회 성능 향상
* 시스템의 운영 상황, 시스템의 운영되는 데이터, 조회하는 조회 스타일에 따라서 반정규화 하는 방법이 달라진다.
* 테이블 병합 연산 (JOIN, UNION) -> CPU 부하 높다
- One to One Type
- 개별로 발생되는 트랜잭션에 대해서는 개별 테이블로 구성
- Plus Type
- 슈퍼타입 + 서브타입에 대해 발생되는 트랜잭션은 JOIN 연산에 의한 성능저하를 가져오므로
- 슈퍼타입 + 서브타입 테이블로 구성
- Single Type
- 전체를 한 번에 조회하는 트랜잭션은 UNION 연산에 의한 성능저하를 가져오므로
- 전체를 하나의 테이블로 통합
슈퍼타입/서브타입 관계테이블 병합 예시
NULL 속성의 이해
NULL과의 연산
- 단일행 연산
- Null 값과의 연산 수행 결과는 Null
- ex) 100 + Null = Null
- 다중행 연산
- Null 값인 행을 제외하고 연산 수행
- ex) 10, 20, Null, 30 평균 = (10 + 20 + 30) / 3 = 20
SELECT SUM(COL1 + COL2 + COL3 + COL4) FROM TBL; # 단일행 연산 - 행별로 연산
SELECT SUM(COL1) + SUM(COL2) + SUM(COL3) + SUM(C0L4) FROM TBL; # 다중행 연산 - 열별로 연산
본질식별자 VS 인조식별자(2024 시험 도입)
본질식별자(원조식별자)
: 업무에 존재하는 원래의 식별자로, 원조식별자라고도 한다.
인조식별자(대리식별자)
: 업무에 존재하지 않으나 원래의 식별자가 너무 복잡하게 구성되어 있어 인위적으로 만든 식별자로, 대리식별자라고도 한다.
* 복합식별자인 경우 주로 사용
본질식별자로 주식별자를 구성하는 경우
일련번호 형태의 인조식별자를 만들어 주식별자로 추가하는 경우
- 인조식별자 사용의 장점
- 추가적인 연산 없이 시퀀스나 키 제약조건 등을 통해 주식별자를 생성할 수 있으므로 개발의 편의성이 향상될 수 있다.
- 인조식별자 사용의 단점
- 데이터의 중복이 발생할 수 있고 별도의 인덱스 생성 등이 필요하다. (운영 단계에서 인덱스 추가 후 성능 튜닝함)
=> 인조식별자는 모든 상황을 감안하고 고려해서 신중하게 결정해야 한다.
References
'🏆 자격증 > SQLD' 카테고리의 다른 글
[SQLD 총정리] 1과목 1장 데이터 모델링의 이해 (0) | 2024.08.23 |
---|---|
[SQLD 총정리] 2과목 3장 관리 구문 (0) | 2024.08.22 |
[SQLD 총정리] 2과목 2장 SQL 활용 (0) | 2024.08.22 |
[SQLD 총정리] 2과목 1장 SQL 기본 (0) | 2024.08.22 |
[과목 2] 1장 SQL 기본 (0) | 2024.08.19 |