✅정규화(Normalization)란?
관계형 데이터베이스의 설계에서 중복을 최소화하여 데이터를 구조화 하는 프로세스
정규화의 목표 : 테이블 간에 중복된 데이터를 허용하지 않는 것, 즉 무결성을 유지하며 DB의 저장 용량을줄인다
✅정규화(Normalization)의 절차!
정규화의 절차는 아래와 같이 순차적으로 진행되는데, 밑에 쉽게 설명을 해놓았으니 참고바람!
✅제 1 정규화(First Normal Form, 1NF)
정의: 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것
위의 테이블에서 추신수와 박세리는 여러개의 취미를 가지고 있기 때문에 제 1 정규형을 만족하지 못한다.
그렇기 때문에 이를 아래와 같이 제 1 정규화 하여 분해할 수 있다.
✅제 2 정규화(Second Normal Form, 2NF)
정의: 테이블의 속성들을 기본 키(PK)에 완전히 종속되도록 만드는 규칙
이를 위해서 테이블을 1NF를 만족하도록 분해하고, 부분 함수적 종속성을 제거하는 작업을 수행
완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미
기본키 : (학생이름, 강좌이름)
기본키는 성적을 결정 : (학생이름, 강좌이름) --> (성적)
그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌 이름에 의해 결정 : (강좌이름) --> (강의실)
즉 컬럼이 기본키의 일부 속성에만 종속되는 상태(부분 함수적 종속)상태이기 때문에 이 것을 제거해야한다.
✅제 3 정규화(Third Normal Form, 3NF)
정의: 테이블 속성들 간에 이행적 함수 종속성을 제거하여 데이터의 중복성과 이상현상을 방지하는 규칙
#이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.
먼저 제 1 정규화, 제 2 정규화를 만족해야함. (모든 속성들이 원자적이고 기본키에 완전히 종속되도록 설계)
위의 테이블은 제 3 정규화를 만족하지 않는다.
이유는 "수강료" 컬럼이 "강좌이름"을 통해 결정되는 이행적 함수 종속 상태이기 때문이다.
이행적 함수 종속성을 제거하는 이유는 간단하다.
김연아 학생이 수강하는 강좌가 CS로 바뀌었다고 가정해보자.
이행적 종속성이 존재한다면 김연아 학생은 CS라는 수업을 20,000이라는 수강료로 듣게 된다.
👇
즉 학생이름-> 강좌이름, 강좌이름->수강료를 참조하도록 테이블을 분해해야한다.
✅BCNF(Boyce-Codd Normal Form)정규화
정의: 테이블의 모든 결정자가 후보키에 속하는 정규화 형태( 이행적 함수 종속성 제거 + 모든 결정자가 후보키에 속하는 경우)
#후보키(Candidate Key)란 테이블의 각 레코드를 유일하게 식별할 수 있는 키 (ex. 학생이름)
이러한 형태를 만족하면 DB에서 삽입, 갱신, 삭제시 발생할 수 있는 이상현상을 제거하고 DATA의 무결성 보장
기본키: (학생이름, 강좌이름)
위의 테이블에서 "교수" 속성은 "강좌이름"속성에 함수적으로 종속된다. 즉, "강좌이름"을 알면 "교수" 를 결정할 수 있다.
즉 "학생이름"이 "강좌이름", "교수"의 결정자가 되야하는데 "교수" 속성이 "강좌이름"에 종속되면
"학생이름"이 모든 결정자에 속하지 않는 오류를 야기한다.
👇
BCNF를 만족시키기 위해 이 테이블을 분리하여 학생이름, 강좌별 교수 테이블로 분해해야한다.
✅무조건 정규화를 하는 것이 좋은건가? 정규화의 단점은?
정규화는 데이터 베이스의 구조를 최적화하고 데이터의 무결성을 보장하기 위한 중요한 설계 원칙이다.
하지만 무조건적으로 정규화를 하는 것이 항상 좋은 것은 아니다. 과도한 정규화는 데이터베이스의 성능을 저하시킬 수 있으며, 복잡한 조인(Join) 연산을 필요로 하여 쿼리의 실행 속도를 느리게 할 수도 있다. 따라서 적절한 정규화 수준을 선택하는 것이 중요하고, 정규화의 수준은 다음과 같은 점들을 고려하여 결정한다.
때로는 일부 데이터를 중복하여 저장함으로써 쿼리의 간결성과 성능을 향상시킬 수도 있다.
- 데이터 중복과 이상 현상
- 쿼리의 복잡성과 성능 : 쿼리 실행 시 복잡한 조인을 필요로 할 수 있으므로 성능을 고려해서 결정해야함
- 개발 및 유지보수의 편의성 : 정규화 수준이 높을 수록 데이터의 논리적 구조가 세분화 되며, 개발 및 유지보수가 복잡해질 수 있다
- 데이터의 자주 갱신 여부 : 데이터가 자주 갱신되는 경우 정규화 수준에 따라 갱신작업의 복잡성과 성능에 영향을 미침
✅참고문헌
https://mangkyu.tistory.com/110
'필수 개발지식 > CS' 카테고리의 다른 글
[CS] 데이터베이스와 ORM이란? (0) | 2023.07.24 |
---|---|
[CS]백엔드에서 자주 쓰이는 자료구조와 알고리즘 (0) | 2023.07.24 |
[CS] 쓰레드와 쓰레드 풀 (0) | 2023.07.05 |
[CS] DB INDEXING (0) | 2023.06.21 |
[CS] 프로세스 생명주기와 프로세스 메모리 (0) | 2023.06.17 |