[ 프로젝트 ] 정규화와 반정규화
- 데이터베이스 스키마
데이터베이스의 전체적인 구조를 나타내는 설계도구로, 모든테이블, 칼럼, 데이터형식, 테이블간 관계등을 정의한다. ERD (Entity-Relationship Diagram) 와 같은 도구를 사용해 데이터베이스 스키마를 시각적으로 나타낼 수 있다.
- 데이터베이스 테이블 구조
특정테이블 내의 칼럼, 데이터형식, 기복/외래키, 제약조건 등을 정의한다. 테이블 설계시 중복을 피하고 데이터무결성을 유지하는 구조를 선택해야한다.
- 정규화 (Normalization) : 데이터베이스 테이블에 적용할 정규화규칙
정규화는 데이터베이스 테이블을 분리해 중복을 제거하고 데이터무결성을 유지하는 과정이다. 정규화규칙을 적용하려면 중복되거나 불필요한 데이터를 식별해야한다. 일반적으로 정규화는 1NF 부터 3NF, BCNF 까지 수행되며, 필요에 따라 4NF, 5NF까지 수행될 수 있다.
제1정규형 (1NF)
하나의 컬럼에는 하나의 값만 있어야 하며(원자적), 컬럼내 다중값이나 중첨된 구조를 포함해선 안된다.
제2정규형(2NF)
1NF를 만족하며, 모든 비기본키 컬럼이 기본키에 완전함수 종속돼야한다. 이는 테이블이 기본키에만 의존하도록 만들기 위한것이다.
제3정규형(3NF)
2NF를 만족하며, 비기본키 컬럼간의 종속성이 없어야한다. 즉, 비기본키 컬럼이 기본키를 통해서만 종속돼야한다.
보이스-코드 정규형(BCNF)
3NF를 만족하며 모든 결정자가 후보키에 속하도록 해야한다. 즉, 복합키가 있는 테이블에 대해 정규화를 더 강화하는 것이다.
제4정규형(4NF)
BCNF를 만족하며 다중값 종속성을 제거해야한다. 이는 다중값 속성을 별도의 테이블로 분리하여 정규화하는 것이다.
제5정규형(5NF 또는 PJNF)
4NF를 만족하며, 조인종속성을 제거해야한다. 이는 중복된 데이터를 최소화하고 데이터 무결성을 유지하기 위한것이다.
- 반정규화(Denormalization) : 데이터베이스 테이블에 적용할 반정규화규칙
반정규화는 정규화된 테이블을 다시 합치거나, 중복데이터를 허용하는 것으로 성능향을을 위해 수행된다. 이때 주의점은 데이터 무결성과관리의 어려움이 발생할 수 있다.
→ 반정규화를 적용하면 좋은 테이블 : 장바구니 테이블
JOIN 연산을 줄이기 위해 테이블을 합쳐 데이터 중복을 허용한다.
즉, 장바구니 테이블 자체가 상품명, 상품가격, 상품수량 컬럼을 가지고 있는 형태다.
장바구니테이블은 고객이 장바구니에 담은 제품의 목록, 수량등을 저장한다. 이 데이터는 고객이 장바구니에 담은 제품을 쉽게 확인하고, 수량을 변경, 삭제할 수 있어야한다. 정규화된 테이블에선 이런 데이터를 여러 테이블에 저장해야하는데, 이는 데이터베이스 성능을 저하시키고 데이터베이스 관리를 어렵게 만든다. 또 장바구니 테이블은 고객이 장바구니에 담은 제품의 목록을 빠르게 조회할 수 있어야한다. 정규화된 테이블에선 이런 데이터를 여러테이블에 저장해야하는데 성능저하는 물론 고객이 장바구니에 담은 목록을 빠르게 조회하게 어렵게 만든다.
- 정규화와 반정규화 요약정리
정규화와 반정규화는 데이터중복, 무결성, 성능 등의 관점에서 데이터베이스 테이블의 구조와 관계를 변경하는 과정이다. 상황에 따라 적절한 정규화 또는 반정규화를 선택해 데이터베이스를 설계해야한다.
정규화
- 데이터중복을 제거하고 데이터무결성을 향상시키기 위한 테이블 분리
- 데이터베이스 테이블을 작은 테이블로 나눠 중복을 최소화하고 테이블간의 관계를 정의해 무결성 유지
- 정규화된 데이터베이스는 중복이 적고 데이터무결성이 높지만,
데이터를 조회하려면 여러 테이블을JOIN해야 하므로 성능저하가 발생할 수 있다.
반정규화
- 데이터베이스 성능향상을 위해 테이블을 합치거나 중복데이터 허용
- 반정규화된 데이터베이스는 데이터액세스의 성능이 향상되지만,
데이터중복으로 데이터무결성이 저하되거나 유지관리가 어려워 질 수 있음.