서론
데이터 모델은 설계의 시작을 하는 단계이며, SQL은 설계를 실제로 구현하고 다루는 도구이다. 그 과정 중 좀더 철저한 설계를 하며 자연스레 정규화와 트랜잭션의 개념이 탄생했다. 정규화는 그 설계를 깔끔하게 다듬는 작업을, 트랜잭션은 그 데이터를 안정적으로 다루기 위한 실행의 안전장치의 역할을 한다.
정규화
정규화란 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위로 분리하는 과정이다. 즉, 데이터 중복을 제거하고, 데이터 무결성을 유지하며, 이상(anomaly)을 방지하기 위한 과정이다. 쉽게 말하면, 데이터를 쪼개서 더 효율적이고 오류 없는 구조로 만드는 작업이다.
- 제 1정규화: 모든 속성은 반드시 하나의 값만 가져야 한다.
- 제 2정규화: 엔터티의 모든 일반속성은 반드시 주식별자에 종속되어야 한다.
- 제 3정규화: 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
단, 너무 세세하게 쪼개면 조인이 많아져서 성능 저하 발생할 수 있다.
반정규화
반정규화란 데이터 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.
테이블 반정규화
- 테이블 병합
- 1:1 관계 테이블 병합
- 1:M 관계 테이블 병합
- 슈퍼 서브 타입 테이블 병합
- 테이블 분할
- 테이블 수직 분할(속성 분할)
- 테이블 수평 분할(인스턴스 분할, 파티셔닝)
- 테이블 추가
- 중복 테이블 추가
- 통계 테이블 추가
- 이력 테이블 추가
- 부분 테이블 추가
칼럼 정규화
- 중복 칼럼 추가
- 파생 칼럼 추가
- 이력 테이블 칼럼 추가
트랜잭션(Transaction)
트랜잭션이란 데이터를 조작하기 위한 하나의 논리적인 작업 단위이다. 즉 데이터베이스에서 “실패하면 없던 일로 돌릴 수 있는, 안전한 작업 단위”이다. 주의할 것으로 종종 값에 NULL이 들어가는 데 이 때 NULL은 존재하지 않음, 즉 값이 없음을 의미한다. 즉, 숫자 0과 NULL의 의미가 다르다는 것이다.
본질 식별자 (Natural Identifier)
본질 식별자는 현실 세계에서 고유하게 식별 가능한 데이터 속성을 그대로 기본키로 사용하는 방식이다. 예를 들어, 주민등록번호, 이메일, 사번, ISBN, 학번 등이 있다. 이러한 방법은 실제 업무에서 식별에 사용하는 값이므로 직관적이고 외부 시스템과 연동할 때 유용하다는 장점이 있다. 그러나 현실에서는 중복되거나 변경될 가능성이 존재하며, 외래키로 사용될 때 데이터 길이가 길어져 성능에 불리하다. 특히, 복합키로 구성되면 관리가 복잡하다.
인조 식별자 (Surrogate Identifier)
DB 내부에서 생성된 의미 없는 고유 번호를 식별자로 사용하는 방식이다. 보통 자동 증가 번호(AUTO_INCREMENT), UUID, 시퀀스 등으로 생성된다. 예를 들어, 고객 번호, 게시글 번호, 사원 ID 등이 있다. 단순하고 일관적이며, 변경될 일이 없어 데이터 안정성이 높고 외래키 연결 시 짧고 효율적이라 성능 최적화에 유리하다는 장점이 있다. 그러나 업무적인 의미가 없어 실제 데이터를 보면 이 값만으론 누구인지 알 수 없고 추가적으로 식별용 컬럼이 필요할 수 있다.
구분 | 본질 식별자 (Natural Key) | 인조 식별자 (Surrogate Key) |
의미 | 실제 업무에서 의미 있는 값 | DB 내부에서 생성된 의미 없는 값 |
예시 | 주민번호, 이메일, 학번 등 | 자동 증가 ID, UUID 등 |
변경 가능성 | 있음 | 없음 |
외래키 연결 시 | 느릴 수 있음 (길고 복잡함) | 빠름 (숫자, 단순함) |
직관성 | 높음 | 낮음 |
사용 권장 | 작은 시스템, 의미 있는 키 필요 시 | 중대형 시스템, 확장성 필요 시 |
댓글