MySQL

제 3정규형(Third Normal Form, 3NF)

ryeonng 2024. 7. 10. 17:22

제 3정규형

제 3정규형(Third Normal Form, 3NF)는 데이터베이스 테이블이 제 2정규형을 만족하며, 추가적으로 모든 비기본 키 속성이 기본 키에만 종속되고 기본 키가 아닌 다른 속성에는 종속적이지 않아야 한다. 이를 '이행적 종속성이 없어야 한다.'고 한다.

 

이행적 종속이란 A → B , B C 의 종속 관계에서 A가 B에 종속되고, B가 C에 종속될 때, 간접적으로 A가 C에 종속되는 관계를 말한다.

 

 

제 3 정규형을 만족하지 못하는 예제

학생ID
학생 이름
과목코드
과목명
교수ID
교수 이름
1
홍길동
MAT101
수학
101
김교수
2
이순신
ENG101
영어
103
박교수

 

학생 성적 테이블

학생 성적 테이블이 제 3정규형(3NF)을 만족하도록 설계하기 위해 이행적 종속성을 제거해야 한다. 현재 테이블에서 교수 이름은 교수ID에 의존적이며, 이는 과목코드에도 간접적으로 의존적인 관계입니다. 따라서 이러한 이행적 종속성을 제거하여 각 속성을 기본 키에만 직접적으로 종속되도록 조정해야 합니다.

 

분해 과정

  1. 학생 정보 테이블 : 학생의 기본 정보를 저장한다.
  2. 과목 정보 테이블 : 과목에 대한 정보와 해당 과목을 담당하는 교수의 정보를 저장한다.
  3. 수강 정보 테이블 : 어떤 학생이 어떤 과목을 수강하는지에 대한 정보를 저장한다.

학생 정보 테이블

학생ID
학생 이름
1
홍길동
2
이순신

 

과목 정보 테이블

과목코드
과목명
교수ID
교수 이름
MAT101
수학
101
김교수
ENG101
영어
103
박교수

 

수강 정보 테이블

학생ID 과목코드
1
MAT101
2
ENG101

 

이행적 종속성이 제거 → 각 테이블이 제 3정규형을 만족

 

CREATE TABLE 학생정보 (
    학생ID INT PRIMARY KEY,
    학생이름 VARCHAR(50)
);

CREATE TABLE 과목정보 (
    과목코드 VARCHAR(10) PRIMARY KEY,
    과목명 VARCHAR(50),
    교수ID INT,
    교수이름 VARCHAR(50)
);

CREATE TABLE 수강정보 (
    학생ID INT,
    과목코드 VARCHAR(10),
    PRIMARY KEY (학생ID, 과목코드),
    FOREIGN KEY (학생ID) REFERENCES 학생정보(학생ID),
    FOREIGN KEY (과목코드) REFERENCES 과목정보(과목코드)
);

 

정규화의 장점

  1. 데이터베이스 변경 시 이상 현상(Anomaly)제거
  2. 데이터베이스 구조 확장 시 재 디자인 최소화(데이터 구조의 안정성 및 무결성 유지)
  3. 정규화 된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
  4. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며, 응용프로그램의 생명을 연장한다.
  5. 사용자에게 데이터 모델을 더욱 의미있게 제공
  6. 정규화된 테이블들과 정규화된 테이블들 간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.
  7. 저장 공간의 최소화 가능
  8. 효과적인 검색 알고리즘 생성 가능
  9. 데이터 삽입 시 릴레이션 재구성의 필요성 감소

정규화의 단점

  1. 조인의 증가 : 정규화를 통해 테이블을 더 작은 테이블로 분해함으로써 데이터의 중복을 줄이고 무결성을 높일 수 있으나, 이 과정에서 관계를 맺고 있는 여러 테이블 간의 조인 연산이 필요해지며, 이는 쿼리의 복잡성을 증가시키고 실행 시간을 늘릴 수 있다.
  2. 성능 저하 : 데이터가 여러 테이블에 분산되어 있을 경우, 필요한 정보를 얻기 위해 여러 테이블을 조인해야 하므로 쿼리 실행 속도가 느려질 수 있다. 특히 대규모 데이터베이스에서는 이러한 성능 저하가 두드러질 수 있다.
  3. 응답 시간의 지연 : 정규화 과정에서 데이터를 여러 테이블로 분할하면, 특정 데이터에 대한 응답을 받기 위해 여러 테이블에서 데이터를 읽어와야 한다. 이 과정에서 네트워크 지연이나 디스크 I/O 증가로 인해 응답 시간이 길어질 수 있다.

위와 같은 단점 또는 조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요할 수 있다.

 

반정규화(De-normalization, 비정규화)

정규화 된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나.

 

디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반경규화를 수행하게 된다.

 

일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

'MySQL' 카테고리의 다른 글

UNION 연산자  (0) 2024.07.10
제 2정규화(Second Normal Form, 2NF)  (0) 2024.07.08
제 1정규화(First Normal Form, 1NF)  (0) 2024.06.13
서브 쿼리(subquery)  (0) 2024.06.13
쇼핑몰 서비스의 DB 구축  (1) 2024.06.12