정규화와 반정규화
데이터베이스 정규화란 데이터 중복을 줄이고, 업데이트 시 오류를 방지하기 위해 데이터를 구조화하는 과정이다.
반면, 반정규화는 정규화된 구조를 일부러 중복되게 만들어 성능 향상이나 쿼리의 단순화를 목적
여기서 기본적인 정규형과 반정규화에 대해 간단한 예시와 함께 정리해보자.
제 1정규형 (1NF)
정의: 모든 필드의 값이 원자값이어야 하고, 각 필드에서 여러 값이나 리스트를 허용하지 않음.
예시: 학생들의 취미를 기록한다고 할 때, 한 학생이 여러 취미를 가지고 있다면 이를 하나의 필드에 나열하지 않고, 각 취미를 별도의 행으로 나누어 기록한다.
- 1NF 전: 학생 A - 읽기, 그리기
- 1NF 후:
- 학생 A - 읽기
- 학생 A - 그리기
제 2정규형 (2NF)
정의: 1NF를 만족하고, 모든 비-주요 컬럼이 기본키 전체에 완전 함수적 종속이어야 함.
예시: 학생과 수업 정보를 기록할 때, 학생 ID와 수업 ID를 복합 기본키로 사용한다면, 수업 이름은 수업 ID에만 종속되어야 한다.
- 2NF 전: (학생 ID, 수업 ID, 수업 이름)
- 2NF 후:
- 학생 수업 테이블: (학생 ID, 수업 ID)
- 수업 테이블: (수업 ID, 수업 이름)
제 3정규형 (3NF)
정의: 2NF를 만족하고, 비-주요 컬럼이 기본키에만 종속되며, 비-주요 컬럼 간의 종속성이 없어야 함.
예시: 학생 주소와 우편번호를 기록할 때, 우편번호가 주소에 종속적이라면, 우편번호와 주소 정보는 별도의 테이블로 분리한다.
- 3NF 전: (학생 ID, 주소, 우편번호)
- 3NF 후:
- 학생 테이블: (학생 ID, 주소)
- 주소 테이블: (주소, 우편번호)
반정규화
정의: 정규화된 데이터베이스를 의도적으로 중복된 형태로 만드는 과정으로, 성능 향상이나 쿼리 단순화를 목적으로 함.
예시: 게시판에서 각 게시글마다 조회수를 표시해야 할 때, 조회수를 별도의 테이블에 저장하는 대신 게시글 테이블에 직접 조회수 필드를 추가해 관리한다. 이는 쿼리 복잡성을 줄이고 성능을 향상시키는 데 유리하다.
- 반정규화 전:
- 게시글 테이블: (게시글 ID, 제목, 내용)
- 조회수 테이블: (게시글 ID, 조회수)
- 반정규화 후: 게시글 테이블에 조회수 필드 추가 (게시글 ID, 제목, 내용, 조회수)
정규화는 데이터 구조의 일관성과 무결성을 유지하기 위해 필수적이지만, 특정 상황에서는 반정규화를 통해 데이터베이스의 성능과 관리 효율을 높일 수 있다.
반정규화는 모든 정규화를 마친 후 성능상 이유가 있을때 고려하는 것이 원칙
정리
- 1NF (제1정규형): 각 필드에는 하나의 값만 들어가야 한다.
- 2NF (제2정규형): 기본키가 아닌 모든 필드가 기본키에 완전히 종속되어야 한다.
- 3NF (제3정규형): 비기본키 필드가 다른 비기본키 필드에 종속되지 않아야 한다.
'기타' 카테고리의 다른 글
[SQL] GROUP BY (ROLLUP,CUBE) 이해하기 (0) | 2024.02.26 |
---|---|
[SQL] 서브쿼리 (스칼라, 인라인 뷰, 중첩 서브쿼리) (0) | 2024.02.25 |
[SQL] CASE 문 (0) | 2024.02.02 |
[SQL] INNER JOIN (0) | 2024.02.01 |
ELB - ALB,NLB (0) | 2023.09.02 |