DB 정규화, 비정규화

Kyoungchan Cho·2022년 11월 26일
0
post-thumbnail

정규화(Normalized)

정규화란 데이터가 꼬이는 것(데이터 이상 현상)을 막기 위해 테이블을 잘게 나누는 것(
데이터 무결성을 위해 데이터의 중복을 최소화하여 설계 및 구조화하는 작업

데이타 이상 현상 :

  • 삽입 이상, 삭제 이상, 수정 이상

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

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

다중값을 가진다 ? -> 제 1정규형 위배
반복 그룹을 가진다 ? -> 제1 정규형 위배

제2정규형(2NF) 부분종속

  • 모든 속성은 반드시 모든 기본키에 종속되어야 한다.
  • 기본키 일부에만 종속되어서는 안된다.

제3정규형 (3NF) 이행종속

  • 기본키가 아닌 모든 속성간에는 서로 종속될 수 없다.

장점

  • 데이터의 안정성과 무결성을 유지하여 데이터 이상 현상을 방지할 수 있다.
  • 정규화가 잘 되어 있는 DB 확장시 구조의 최소한의 수정으로 확장할 수 있다.
  • 저장 공간을 최소화할 수 있다.

단점

  • JOIN을 많이 하게 될 경우 연산 처리가 느릴 수 있다.

비정규화(Denormalization, 반정규화)

반정규화는 성능 향상을 위해 정규화를 포기하고 연산 처리에 대해 최적화하여 설계하는 것.
다수 JOIN 조회시, 테이블끼리의 경로가 멀때, 칼럼을 계산할 경우 성능 저하가 예상되면 사용한다.
데이터 무결성이 보장되지 않으므로 제한적으로 사용해야 한다.

장점

  • JOIN의 연산 비용을 줄여 빠른 데이터 조회가 가능하다.
  • 조회 쿼리가 비교적 간단해진다.

단점

  • 데이터 이상 현상이 발생할 수 있다.
  • 데이터 무결성, 일관성이 깨질 수 있다.
  • 데이터를 중복하여 저장하므로 더 많은 저장 공간이 필요하다.

테이블 반정규화

테이블 병합

비즈니스 로직 상 JOIN되는 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려

  • 1:1 관계 테이블 병합
  • 1:M 관계 테이블 병합
  • 슈퍼 서브 타입 테이블 병합

테이블 분할

  • 수직분할 : column단위로 테이블을 1:1 분리
  • 수평분할 : row단위로 테이블 1:1 분할

테이블 추가

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

컬럼 반정규화

중복 컬럼 추가

  • join 프로세스를 줄이기 위해 중복 컬럼 추가
    -> select 비용은 감소하나, update 비용은 증가

파생 컬럼 추가

  • 계산을 통해 얻어지는 결과값을 테이블에 컬럼으로 저장

이력테이블 컬럼 추가

  • 이력 테이블에 기능성 컬럼 추가 (최신 여부, 시작일/종료일 등)

관계 반 정규화

중복 관계 추가

  • 데이터 처리를 위해 여러 경로를 거쳐야 할 경우 관계를 중복시킴으로써 성능 개선

summary

데이터의 무결성을 위해 정규화를 원칙으로 스키마를 구성한다. 정규화는 테이블을 잘게 구성하여 중복을 최소화하여 DB를 설계하는 것이다. 이로 인해 데이터 공간을 최소화 할 수 있고, 일관성과 무결성을 유지하기에 데이터 이상현상을 방지할 수 있다. 또한 최소한의 작업으로 데이터 구조 확장을 용이하게 해준다.
비정규화는 성능 향상을 위해 정규화를 포기하고 연산 처리에 대해 최적화하여 설계하는 것이다. JOIN의 연산 비용을 줄여 데이터 조회속도를 향상 시켜주지만 데이터의 일관성, 무관성을 헤칠 수 있고 데이터 이상현상이 발생할 수 있으므로 제한적으로 사용해야 한다.



참고) https://owlyr.tistory.com/20#6c77230b-2875-4352-9803-9e0fd1d7130e https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#%EC%A0%95%EA%B7%9C%ED%99%94%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C https://www.youtube.com/watch?v=pMcv0Zhh3J0
profile
https://lying-lettuce-69f.notion.site/KyoungchanCho-Blog-f9f150b9e3be4467a67cf2a21932650d (게시글 자동 비공개 현상으로 일단 노션으로 이동합니다. 소개에서 URL 링크 클릭으로 연결됩니다.)

0개의 댓글