[DB] 정규화 & 비정규화

yurinnn·2024년 1월 22일

DB

목록 보기
1/9

🔵 정규화 (Normalization)

'정규화 데이터베이스(Normalized Database)'는 중복을 최소화하도록 설계된 데이터베이스를 말한다. DB의 저장 용량 역시 줄일 수 있다.

정규화는 관계형 데이터베이스의 설계에서 중복을 최소화하기 위해 '데이터를 구조화하는 작업'이다.
정규화은 특정 조건을 만족하는 릴레이션의 스키마 형태를 말하는데, 제 1 정규형, 제 2 정규형, 제 3 정규형, BCNF형, 제 4 정규형, 제 5 정규형이 존재한다.

정보처리기사 : 도부이결다조!!!

장점

1. 데이터베이스 변경 시 이상현상 제거
각종 이상 현상(Anomaly) 을 방지하기 위해서, 테이블의 구성을 논리적이고 직관적으로 한다.

1) 삭제 이상 (Delete Anomaly)
행(row) 삭제시 연쇄 삭제가 발생한다.
홍길동 학생이 ST01 과목을 수강 취소할 경우, 연락처도 함께 지워진다.

2) 삽입 이상 (Insert Anomaly)
행 삽입시 지정하지 않은 속성값이 NULL을 갖거나, 원하지 않는 자료가 삽입된다.
홍길동 학생의 연락처만 추가하고 싶을 때, 과목코드가 비어 NULL값이 생겨 문제가 발생한다.

3) 갱신 이상 (Update Anomaly)
데이터 갱신시 일관성 유지가 안된다.
홍길동 학생이 연락처를 바꿨을 경우, ST01, ST02 과목코드를 모두 갱신해야 하는데 ST01 만 갱신할 경우 문제가 발생한다.

2. 효과적인 검색 알고리즘 생성
불필요한 정보를 제외하며, JOIN을 통해서 원하는 정보를 가져올 수 있다.

3. 데이터 구조의 안정성, 무결성 유지
데이터의 정확성, 일관성, 유효성을 유지할 수 있다.
데이터의 무결성을 유지하는 것은 데이터베이스 관리시스템 (DBMS)의 중요한 기능이며, 주로 데이터에 적용되는 연산에 제한을 두어 데이터의 무결성을 유지하게 된다.

4. 불필요한 데이터 제거, 데이터의 중복을 최소화
만약 하나의 테이블에 모든 정보를 다 넣게 되면 불필요하게 중복되는 데이터가 저장될 수 있다. 그럼 불필요하게 더 많은 디스크 공간을 차지하게 될 수 있다. 따라서 테이블 간에 FK(외래키)로 PK(기본키)를 연결하여 디스크 공간을 훨씬 효율적으로 사용할 수 있다.

5. 데이터베이스 구조 확장 시 재디자인을 최소화
정규화된 데이터베이스 구조에서는 테이블에 새로운 데이터 형의 추가로 인한 확장시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 되는 경우가 있다.
이 때, 해당 데이터베이스와 연동된 응용 프로그램에 최소한의 영향을 주며 효율적으로 사용할 수 있게 된다.

단점

1. Join연산의 증가로 응답 시간이 저하됨

🔵 정규화 단계

📍 제1정규화 (1NF)

not null, 중복값 x
한 컬럼에 null 값이나 중복갔이 있으면 테이블을 분리해야 한다.

1NF를 만족하는 조건 :
1. 어떤 Relation에 속한 모든 Domain이 원자값(atomic value)만으로 되어 있다.
각 전화번호 컬럼에 데이터를 하나씩 담는다. (컬럼이 원자값만으로 구성됨)

2. 모든 attribute에 반복되는 그룹(repeating group)이 나타나지 않는다.
Telephont Number1, Telephont Number2 처럼 반복되는 전화번호 컬럼을 한 컬럼으로 만들어 2번 조건을 만족시킨다.

3. 기본 키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.
Customer ID가 더 이상 고유하게 식별할 수 있는 키가 아니기 때문에 테이블을 분리하여 3번 조건을 만족시켜 준다.

📍 제2정규화 (2NF)

부분적 함수 종속 제거를 통해 개체의 속성이 한 식별자에 종속되어야한다.
복합키를 써야하는 경우에는 테이블을 분리해서 하나의 pk만 사용할 수 있도록 해야 한다.

  • 함수적 종속 : X의 값에 따라 Y값이 결정될 때 X → Y로 표현하는데, 이를 Y는 X에 대해 함수적 종속 이라고 한다.
    (ex) 학번(X)을 알면 이름(Y)을 알 수 있다. X를 결정자라고 하고, Y는 종속자라고 한다. 다른 말로 X가 바뀌었을 경우 Y가 바뀌어야만 한다는 것을 의미한다.
  • 완전 함수적 종속 : {X1, X2} → Y일 경우, X1와 X2가 Y의 값을 결정할 때
  • 부분 함수적 종속 : {X1, X2} → Y일 경우, X1, X2 중 하나만 Y의 값을 결정할 때
  1. {Model, Manufacturer} → Model Full Name
    Model과 Manufacturer이 Model Full Name을 결정하기 때문에 완전 함수적 종속
  2. {Model, Manufacturer} → Manufacturer Country
    Manufacturer Country는 Manufacturer 만이 종속 관계에 있기 때문에 부분 함수 종속

즉 아래와 같은 구조를 같게 된다.

따라서, 부분 함수 종속을 제거하면 아래와 같다.

📍 제3정규화 (3NF)

한 테이블 정보가 바뀌면 연결된 테이블 정보도 함께 바뀌도록 테이블을 분리해야 한다.
이행적 함수 종속을 제거하여

3NF 를 만족하는 조건 :
1. Relation이 제 2정규화 되었다.
2. 기본 키(primary key)가 아닌 속성(Attribute)들은 기본 키에만 의존해야 한다.

위에서 Winner Date of Birth 은 기본키인 {Tournament, Year}가 아닌, Winner 속성을 거쳐 {Tournament, Year}를 의존하고 있다. (==이행적 함수 종속 관계)

따라서, 아래와 같이 테이블을 분리한다.

Date of Birth → Winner가 되고, Winner → {Tournament, Year}가 되면서 완전 함수적 종속 관계가 된다.

📍 BCNF(Boyce-Codd Normal Form)형

BCNF는 3NF를 만족하면서 모든 결정자가 후보키 집합에 속한 정규형이다.

📍 제4정규화 (4NF)

다중치 종속 제거

📍 제5정규화 (5NF)

조인 종속 제거

🔵 비정규화

비정규화 데이터베이스(Denormalized Database)는 읽는 시간을 최적화하도록 설계된 데이터베이스를 말한다.

비정규화는 하나 이상의 테이블에 데이터를 중복해 배치하는 '최적화 기법'이다. 시스템의 성능향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 '의도적으로' 정규화 원칙을 위배하는 행위이다.

장점

  1. 빠른 데이터 조회(Join 비용이 줄어들기 때문)
    Join을 빈번하게 해서 조회되는 쿼리가 많다고 하면 서비스의 버그 발생을 줄이고 성능 개선을 위해 비정규화를 고민해야하는 게 맞는 듯 하다.
  2. 데이터 조회 쿼리의 간단화

단점

  1. 데이터 갱신이나 삽입 비용이 높음
  2. 데이터의 무결성 해침
  3. 데이터 중복저장으로 인한 추가 저장공간 확보 필요함
    데이터 중복저장으로 인해 이상 현상이 발생할 가능성이 높아지는데 결국 이건 다시 데이터의 정규화로 해결하는 수 밖에 없다. 그래서 자신이 운영하는 비즈니스의 특성을 잘 고려해서 정규화해야 할 데이터와 비정규화해야 할 데이터를 잘 구분하는 능력이 중요하다.

참조 사이트 : [Database] DB 정규화 & 비정규화란?

profile
슬기로운 개발 생활

0개의 댓글