DB 정규화, 비정규화

귀찮Lee·2022년 6월 13일
0

DataBase / MySQL

목록 보기
14/16

◎ 데이터베이스 정규화 (Database Normalization)

  • 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스
  • 목표 : 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것
  • 목적 : 하나의 테이블에서의 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것

◎ DB 정규화의 중요 부분

  • 데이터 중복 (Data Redundancy)

    • 데이터 중복 : 실제 데이터의 동일한 복사본이나 부분적인 복사본을 뜻함
    • 문제점 : 일관된 자료 처리의 어려움, 저장 공간 낭비, 데이터 효율성 감소
    • 데이터 중복을 최소한으로 해야 함
  • 데이터 무결성(Data Integrity)

    • 데이터 무결성 : 데이터의 수명 주기 동안 정확성과 일관성을 유지
    • 입력된 데이터가 오염되지 않고, 그대로 사용할 수 있음
  • 데이터 이상 현상 (anomaly)

    • 데이터에서 기대한 것과 다른 이상 현상
    • 해당 현상을 방지하기 위해 사전에 방지할 수 있는 대책 마련되야 함
  • 데이터 이상 현상 종류

    • 갱신 이상 (update anomaly)

      • 동일한 데이터가 여러 행에 걸쳐 있을 때, 어느 행을 변경해야 하는지 일관성이 없음
    • 삽입 이상 (insertion anomaly)

      • 데이터 삽입을 못하는 경우
      • Foreign key가 NOT NULL로 설정되어 있는데, foreign key에 해당하는 데이터가 안만들어져 있는 경우, 삽입을 못함
    • 삭제 이상 (deletion anomaly)

      • 데이터의 특정 부분을 지울 때에 의도치 않게 다른 부분들도 함께 지워지는 이상 현상
      • 수업이 폐지되었을 뿐인데, 고용 정보까지 전부 삭제됨
  • 적당한 Table 분할을 통해, 위의 문제들을 해결할 수 있다.

◎ 데이터 정규화 단계

  • 제 1 정규화

    • 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것

    • 제 1 정규화 이전 / 이후

      NameHobbyNameHobby
      철수영화,음악,쇼핑철수영화
      영희음악,게임철수음악
      철수쇼핑
      영희음악
      영희게임
  • 제 2 정규화

    • 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해
    • 중복 제거 용이, 갱신 이상 방지
    • 이전
    • 이후
  • 제 3 정규화

    • 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
    • 중복 제거 용이, 갱신 이상 방지
    • 이전
    • 이후
  • BCNF (Boyce and Codd Normal Form)

    • 제 3 정규화를 진행시킨 테이블에 결정자(Determinant)가 후보키(Alternative Key)로 취급하게 함
    • 제 3 정규화 테이블의 문제점
      • 삽입 이상 : 새로운 교수가 특정 과목을 담당한다는 새로운 정보를 추가할 수 없다.
      • 삭제 이상 : 과목을 취소시, 과목 담당 정보 삭제
      • 갱신 이상 : 과목 변경시, 모든 교수에 해당하는 과목 변경
    • 결정자가 후보키가 될 수 있도록 분해 필요
    • 이전 (1교수 1과목인 특강에 듣는 학생의 학번)
    • 이후
  • 출처

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

  • 비정규화 (Denormalization)

    • 하나 이상 테이블에 데이터를 중복해 배치하는 최적화 기법 (의도적으로 정규화 원칙을 위배)
    • 데이터 중복이나 그로 인해 발생하는 데이터 갱신 비용은 감수하는 대신 조인 횟수를 줄여 한층 효율적인 쿼리를 날릴 수 있다.
  • 비정규화 대상

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

    • 빠른 데이터 조회 -> 따로 join을 하지 않아도 됨
    • 조회 쿼리가 간단해짐 -> 버그 발생 가능성도 낮음
  • 비정규화 단점

    • 데이터 갱신이나 삽입이 비용이 높고, 코드가 작성하기 어려움
    • 데이터간의 일관성 유지가 어려움
    • 중복하여 저장하므로 더 많은 저장공간을 차지
  • 출처 : https://velog.io/@bsjp400/Database-DB-%EC%A0%95%EA%B7%9C%ED%99%94-%EB%B9%84%EC%A0%95%EA%B7%9C%ED%99%94%EB%9E%80

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글