[데이터베이스] 정규화와 반정규화

YJ·2023년 8월 9일
1

데이터베이스

목록 보기
1/1
post-thumbnail

데이터베이스 향상을 위한 정규화 비정규화에 대해 알아보자

데이터베이스 정규화

🌪️데이터베이스 정규화

관계형 데이터베이스의 설계에서 중복을 최소화하고, 데이터를 구조화를 위해 데이터베이스를 재구성하는 과정

🎯목적

  • 불필요한 데이터 제거
  • 중복 데이터 최소화
  • 데이터의 정확성, 일관성, 유효성 등에 대한 무결성 제약조건 보장

➕장점

  • 데이터의 이상 현상 제거
  • 데이터 구조의 안정성과 무결성 유지

데이터의 이상 현상 (Anomaly)

  • 삭제 이상 (Delete Anomaly)
    : 새 데이터 삽입하기 위해 불필요한 데이터도 함께 삽입해야하는 문제
  • 삽입 이상 (Insert Anomaly)
    : 중복 튜플 중 일부만 변경해 데이터가 불일치하게 되어 모순이 발생하는 문제
  • 갱신 이상 (Update Anomaly)
    : 튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실 문제

➖단점

  • JOIN 연산이 증가되어서, 응답 시간이 저하된다

🪜정규화 과정

비정규형

하나의 튜플에서 속성으로 입력되는 도메인의 값으로 여러개의 값이 들어와서 원자성을 갖지 못하는 경우

제1정규형 (1NF) 원자성

모든 속성은 반드시 하나의 값만 가져야 한다

※ 비정규형 예시

idusernamecontacts
1yjohbjects010-1234-5678, @yjohbjects
2eugenieseo16010-2345-6789, @eugenieseo16

※ 제1정규형 예시

idusernamemobilevelog
1yjohbjects010-1234-5678yjohbjects
2eugenieseo16010-2345-6789eugenieseo16

제2정규형 (2NF) 부분적 함수 종속 제거

모든 속성은 반드시 모든 기본키에 종속되어야 한다
부분 종속성이 없어야한다

※ 비정규형 예시

titlechannelcategory_idcategorylikes
백준 39128 알고리즘 문제풀이tistory5알고리즘63
데이터베이스 정규화에 대해 알아보자!velog6데이터베이스26
프로그래머스 12352 알고리즘 문제풀이velog5알고리즘55
프로그래머스 12352 알고리즘 문제풀이tistory5알고리즘25

=> 프로그래머스 12352 알고리즘 문제풀이
category, category_id는 title에 부분적으로 종속
channel과 likes로 인해 중복되는 데이터 발생 (테이블의 주 목적)

부분적으로 종속되는 컬럼들만 모으고
전체적으로 종속되고있는 컬럼들을 따로 쪼개는 과정을 통해 정규화

※ 제2정규형 예시

Post 테이블

titlecategory_idcategory
백준 39128 알고리즘 문제풀이5알고리즘
데이터베이스 정규화에 대해 알아보자!6데이터베이스
프로그래머스 12352 알고리즘 문제풀이5알고리즘

Post_channel 테이블

titlechannellikes
백준 39128 알고리즘 문제풀이tistory63
데이터베이스 정규화에 대해 알아보자!velog26
프로그래머스 12352 알고리즘 문제풀이velog55
프로그래머스 12352 알고리즘 문제풀이tistory25

제3정규형 (3NF) 이행적 함수 종속 제거

기본키가 아닌 속성들은 기본키에만 의존해야한다

※ 비정규형 예시

post_idtitlecategory_idcategoryposts
1백준 39128 알고리즘 문제풀이5알고리즘7
2데이터베이스 정규화에 대해 알아보자!6CS 스터디2
3프로그래머스 12352 알고리즘 문제풀이5알고리즘7

=> post_id 1과 3의 category, posts에서 중복 발생

※ 제3정규형 예시

Post 테이블

post_id와 category_id를 알면 category 필드를 아예 유지하지 않거나, 참조하지 않아도 된다.

post_idtitlecategory_id
1백준 39128 알고리즘 문제풀이5
2데이터베이스 정규화에 대해 알아보자!6
3프로그래머스 12352 알고리즘 문제풀이5

Category 테이블

  • 기본키: category_id
category_idcategoryposts
1회고23
2네트워크12
3데이터베이스2
4JavaScript4
5알고리즘7
6CS 스터디5

데이터베이스 비정규화

🫗데이터베이스 비정규화

반정규화라고도 한다

정규화된 속성과 관계, 엔티티등의 시스템의 성능 향상 또는 개발 단순화를 위해 통합이나 분리 등의 과정
(개발 및 운영의 편의성을 위해 의도적으로 정규화 원칙을 위배)

🎯목적

디스크의 I/O 메모리 용량이 높아서 성능 저하가 우려되거나
테이블 간의 JOIN의 비효율성
조건문의 성능 저하 등을 개선하고자 할 때

➕장점

  • 빠른 데이터 조회 (JOIN연산의 비용 절감)

➖단점

  • 반정규화를 과도하게 적용하다보면 데이터의 무결성이 깨짐

** 비정규화 과정에서 과도한 범위의 데이터를 제어하다 보면 데이터 무결성이나 동기화 같은 측면이 흔들릴 수 있기 때문에 주의해야한다

💉비정규화 대상

  • 자주 사용하는 테이블의 엑세스 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
  • 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상의 이슈가 있을 경우
  • 테이블에 지나치게 JOIN을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

🪜비정규화 과정

테이블 분할

  • 수직 분할 (column 단위로 테이블 분리)
  • 수평 분할 (row 단위로 테이블 분리)

테이블 추가

  • 중복 테이블 추가 (타 업무/ 타서버의 테이블과 동일한 구조의 테이블 추가 - 원격 JOIN 방지)
  • 통계 테이블 추가 (통계값을 미리 계산해서 저장한 테이블 추가)
  • 이력 테이블 추가 (마스터 테이블에 존재하는 row를 트랜잭션 발생 시점에 따라 복사해두는 테이블 추가)
  • 부분 테이블 추가 (자주 조회되는 컬럼들만 별도로 모아놓은 테이블 추가)

중복컬럼 추가

  • JOIN 프로세스를 줄이기 위함 (SELECT 비용 감소, UPDATE 비용 증가)
  • 파생 컬럼 추가 (계산을 통해 얻어지는 결과 값을 테이블 컬럼으로 저장)
  • 이력 테이블에 기능성 컬럼 추가 (최신 여부, 시작일/종료일 등)
  • 중복관계 추가 (데이터 처리를 위해 여러 경로를 거쳐야할 경우 관계를 중복시켜 성능 개선)

1개의 댓글

comment-user-thumbnail
2023년 8월 9일

글 잘 봤습니다.

답글 달기