- 정규화
- 데이터의 정합성을 위해, 주로 쓰기의 경우 (Insert, Update, Delete)에 적용하는 경우이다.
- 1NF, 2NF, 3NF, BCNF가 있다.
- 1NF의 경우에는 인덱싱이 되지 않기 때문에 하면 안된다.
- 2NF, 3NF,BCNF 의 경우, 중복된 데이터가 발생하고, 레코드가 증가하게 되므로 중복 제거에 초점을 맞추고 있다.
- 1NF : 한 컬럼에는 하나의 값만 들어가야 하고, 리스트 형식처럼 , 등을 통해 다수의 데이터를 넣으면 안된다.
- 예 : 이용자의 전화번호를 2개 이상 받는 경우, 컬럼을 나누어 모바일, 집전화 로 나눠 저장해야 한다.
- 2NF : 만일 키가, A + B 키를 통해 구현되는 조합키일 경우, 컬럼은 A 컬럼이나 B 컬럼에만 종속되면 안된다.
- 즉, C 컬럼이 추가되어야 하는 경우, 해당 컬럼이 A 컬럼에만 종속 받는 값이거나, B 컬럼에만 종속 받는 값이면 안된다.
- 예 : 학생ID, 과목ID가 조합키일 경우, 학생 이름, 과목 이름 컬럼이 있게 되면, 한 학생이 다수의 과목을 수강중일때 학생 이름이 중복된다. 또한, 다른 두 학생이 동일한 과목을 수강하면, 과목 이름이 중복 된다.

아래의 예로 수정해야 한다.

-
-
- 3NF : 만일 하나의 primary key가 있는 경우, B 컬럼이 A 컬럼에 종속 되고, C 컬럼이 B컬럼에 종속되는경우, 또한 C컬럼이 A 컬럼에도 종속되는경우는 피해야 한다.
-

아래와 같이 변경해야 한다.

- 역정규화
- 역정규화는 데이터의 읽기의 경우에 한해서 정규화를 깨는 것을 말한다. 정규화의 경우 테이블이 쪼개지는 경우가 많기 때문에 조회시 join 수행이 많아지게 된다. 이는 컴퓨팅 능력 및 처리속도에 영향을 미친다. 통상적으로 조회 작업이 쓰기 작업보다 많이 일어 나기 때문에, 데이터 정합성을 보장하지 않더라도 성능때문에 역정규화를 하는 경우가 있다. 그러나 조회가 많다고 무조건 적용하는게 아니라, 실제로 DB에 과부하가 걸리는지 확인을 한 후에 도입을 결정해야 한다. (인덱싱과 같다)
- 다수의 테이블로 쪼개진 데이터를 하나의 테이블에 모아 두는 작업을 한다. 해서 조회시 join 없이 조회 할 수 있도록 한다.
- 다만 원본 데이터가 변경시 여기에 있는 데이터 또한 수정이 되어야 하고, 이 과정이 까다롭다.
- 쓰기 DB, 읽기 DB를 각각 별도로 두는 방법의 경우,
- 쓰기 DB는 정규화 적용, 읽기 DB는 역정규화 적용을 한다.
- 읽기 DB는 쓰기 DB를 복제 해온 다음 역정규화 과정을 거쳐야 하는데, 복잡하다.
- 한 DB 에서 읽기 테이블을 별도로 두는 경우도 있다.
- 두 경우 모두 까다롭고 번거로운 과정이 있으므로, 무조건 도입하면 안되고 실제 조회작업시 과부하로 문제가 있을 경우 도입해야 한다.
'DB' 카테고리의 다른 글
| DB 의 동시성 제어 (0) | 2025.09.01 |
|---|---|
| DB 수동 Index (3) | 2025.08.27 |