데이터베이스 내의 데이터 구조를 조직화하고 최적화하는 과정으로 정규화를 하는 목적은
데이터 중복을 제거하고, 효율성을 향상시키며, 데이터 무결성을 보장하기 위함이다.
즉, 테이블 간에 중복된 데이터를 허용하지 않게 함으로써 무결성(Integrity)을 유지할 수 있으며, 데이터베이스의 저장 용량 역시 줄일 수 있다.
정규화 목적
- 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
- 무결성을 지키고, 이상 현상을 방지한다.
- 테이블 구성을 논리적이고 직관적으로 할 수 있다.
- 데이터베이스 구조 확장에 용이해진다.
정규화 장점
- 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있다.
- 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도되거나 일부만 변경해도 된다.
- 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용 프로그램의 생명을 연장시킨다.
정규화 단점
- 릴레이션의 분해로 인해 릴레이션 간의
JOIN
연산이 많아진다. - 질의에 대한 응답 시간이 느려질 수도 있다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.
- 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다.
- 만약
JOIN
이 많이 발생하여 성능 저하가 나타나면 반정규화를 적용할 수도 있다.
이상현상 (Anomaly)
정규화를 거치지 않은 데이터에서 발생할 수 있는 현상
정규화를 해야하는 이유는 잘못된 테이블 설계로 인해 이상현상이 나타나기 때문이다.
- 삽입 이상 (Insertion Anomaly) : 데이터 입력 시 의도하지 않은 데이터까지 입력해야만 테이블에 추가가 가능한 현상
- 삭제 이상 (Delete Anomaly) : 데이터 삭제 시 의도하지 않은 다른 데이터까지 삭제되는 현상
- 갱신 이상 (Update Anomaly) : 데이터 수정 시 중복된 데이터의 일부만 수정되어 발생하는 데이터 불일치 현상
함수 종속성 (Functional Dependency)
어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 종속성이라 한다.
이때, A → B 로 표기하며 A를 B의 결정자라고 한다.
즉, 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존관계를
= 속성 B는 속성 A에 종속한다.
= 속성 A는 속성 B를 결정한다.
= 속성 A는 속성 B의 결정자이다.
제1 정규화 (1NF)
데이터베이스의 각 컬럼이 원자값(Atomic Value, 하나의 값)을 가지도록 테이블을 분해하는 과정으로 각 컬럼은 하나의 데이터만 저장하며, 다중 값을 갖지 않는다.

⇒ 위의 테이블 같은 경우 응모자
와 당첨 여부
속성의 값이 2명 이상인 경우가 있어 제1 정규형을 만족하지 못한다. 따라서 속성 값을 분리하여 각 컬럼이 원자값을 가지도록 분리해줘야 한다.
제1 정규화 적용 전 문제점
- 데이터의 중복 발생이 가능하다.
- 데이터 무결성이 유지되지 않는다.
- 데이터의 수정, 삭제, 삽입 연산에 이상 문제가 있을 수 있다.
- 데이터의 구조가 불분명하다.
💡 데이터 무결성정보의 결점이 없도록 유지하는 설정으로 데이터베이스 내에 저장되는 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미한다.
정확성 : 중복이나 누락이 없는 상태
일관성 : 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태
유효성 : 사용자로부터 값을 입력받을 때 정확한 값만 입력되도록 하는 기능
발생할 수 있는 이상 현상
1. 수정 이상
만약, 특정 당첨자에게 제공한 쿠폰에 문제가 생겨 스타벅스
쿠폰 대신 커피빈
쿠폰을 제공하려는 경우 다른 당첨자들도 스타벅스
쿠폰 대신 커피빈
쿠폰으로 변경된다.
UPDATE 이벤트 SET 쿠폰 = '커피빈' WHERE 응모자 = '백효석' AND 쿠폰 = '스타벅스';
2. 삭제 이상
당첨자 진명인
에게 주어진 도미노
쿠폰을 회수하기 위해 삭제를 하는 경우 아무런 연관이 없는 응모자 강희준
의 응모 기록도 같이 사라지게 된다.
DELETE FROM 이벤트 WHERE 쿠폰 = '도미노' AND 응모자 = '진명인';
제1 정규화 적용 후

- 데이터 무결성 유지에 도움
- 데이터의 수정, 삭제, 삽입 연산에 이상 문제 방지
- 데이터 구조가 단순해지고 명확
제2 정규화 (2NF)
제1 정규형 테이블에서 부분 함수 종속성을 제거하여 완전 함수 종속을 만들도록 하는 과정으로 모든 기본 키의 부분집합에 의존하는 컬럼들을 분리해 새로운 테이블을 만들고 그 사이의 관계를 설정한다.
완전 함수 종속이란, 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.
즉, 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업이다.

제2 정규화 적용 전 문제점
기본키(Primary Key)가 아닌 속성들이 기본키에 완전 함수 종속되지 못하고 부분 함수 종속되어 있기 때문에 이상 현상이 발생한다.
즉, 기본키의 일부 속성에만 의존하고 있기 때문이다.

발생할 수 있는 이상 현상
1. 삽입 이상
피자스쿨 이라는 새로운 이벤트를 등록하는 경우 현재 이벤트 테이블에 연관된 컬럼인 응모자의 정보(불필요한 정보)도 채워줘야 하는 문제가 발생한다.
즉, 우리가 원하는 새로운 이벤트 정보만 등록하고 싶은데 현재 관련이 없는 응모자의 정보까지 넣어줘야 한다.
INSERT INTO 이벤트(이벤트ID, 이벤트 일정, 쿠폰, 가격, 응모자, 성별, 당첨 여부) VALUES (5, '2025-01-04 17:00', '피자스쿨', 14000, NULL, NULL, NULL);
2. 수정 이상
응모자인 백효석
이 갑자기 효석
으로 이름을 변경하는 경우 백효석
과 관련된 모든 행들을 변경해줘야 한다.
만약, 백효석 과 관련된 행을 모두 수정하지 못하는 경우 데이터 불일치가 발생한다.
UPDATE 이벤트 SET 응모자 = '효석' WHERE 응모자 = '백효석';
3. 삭제 이상
만약, 우리 서비스에서 더이상 BBQ 쿠폰을 제공하지 않아 해당 쿠폰 정보를 삭제하는 경우 이와 연관된 이벤트 정보도 사라지게 된다.
DELETE FROM 이벤트 WHERE 쿠폰 = 'BBQ';
제2 정규화 적용 후

좌측부터 이벤트, 응모, 회원 테이블로 분리

- 각 테이블이 이벤트 정보, 응모 정보, 회원 정보 등 각각의 역할에 집중하여 관리되고, 중복이 크게 줄어들며 데이터 무결성이 유지된다.
- 전체적인 데이터 관리 및 유지 보수가 향상된다.
제3 정규화 (3NF)
제2 정규형 테이블에서 이행적 함수 종속성을 제거하는 과정이다.
이행적 함수 종속이란, A → B 종속이고 B → C 종속이면 A → C 가 종속인 관계를 말한다.
제3 정규화 적용 전 문제점

제3 정규화 적용 후

- 각 테이블은 원자적인 값을 가지게 되고 데이터 중복이 줄어든다.
- 이상 현상을 피할 수 있으며 유지 보수가 훨씬 용이해진다.