학습일지/데이터베이스

[SQLD] 데이터 모델링의 이해 - 정규화

mandus 2025. 5. 23. 10:28

목차

     

    1. 정규화

    • 정규화(Normalization): 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 입력/수정/삭제 이상 현상을 제거하는 것
    • 정규화의 필요성:
      • 데이터베이스에서 데이터의 중복을 줄이고, 데이터를 구조화함으로써 데이터의 일관성과 무결성을 보장한다.
      • 테이블을 더 작고 관리하기 쉬운 여러 테이블로 분리한다. 이를 통해 이상 현상(Anomalies)을 방지한다.
    • 정규화 형태(Normal Forms):
      • 제1정규형(1NF): 모든 속성은 하나의 값만을 가져야 하며, 테이블에 중복된 데이터가 없어야 한다.
      • 제2정규형(2NF): 제1정규형을 만족하며, 기본 키의 부분적 종속성이 제거되어 기본 키 전체에 종속되어야 한다.
      • 제3정규형(3NF): 제2정규형을 만족하며, 모든 비주요 속성이 모든 주식별자에만 종속되고 비주요 속성 간의 종속성이 없어야 한다.
      • 보이스/코드 정규형(BCNF): 제3정규형을 만족하며, 모든 결정자가 후보키 집합에 속해야 한다.
      • 제4정규형(4NF): 제3정규형을 만족하며, 모든 다치 종속성이 후보 키를 통해서만 존재하는 상태로, 데이터 중복과 이상 현상을 제거해야 한다. (BCNF에서 해결할 수 없는 다치 종속으로 인한 문제를 해결한다.)
      • 제5정규형(5NF): 제4정규형을 만족하며, 모든 조인 종속이 후보 키를 통해서만 존재하는 상태로, 데이터 중복과 이상 현상을 제거해야 한다.
      • ※ 암기를 할 때, 두부이걸다줘(도부이결다조: 메인이 원자값, 분적 함수 종속 제거, 행적 함수 종속 제거, 정자이면서 후보키가 아닌 것 제, 치 종속 제거, 인 종속성 이용)으로 외운다. BCNF, 제4정규형, 제5정규형은 가볍게 살펴본다.

    ▲ 제1정규형 예시
    ▲ 제2정규형 예시
    ▲ 제3정규형 예시

    2. 반정규화

    • 반정규화(Denomalization): 데이터베이스 설계 과정에서 정규화의 원칙을 일부 또는 전부 역행하여, 데이터의 중복을 의도적으로 허용하거나 테이블 구조를 단순화하는 과정
    • 반정규화의 필요성:
      • 정규화된 테이블을 조인하는 것보다 하나의 테이블에서 데이터를 읽는 것이 더 빠를 수 있다.
      • 여러 테이블에 걸친 데이터를 조인 없이 접근할 수 있어 쿼리를 단순화할 수 있다.
      • 데이터를 한 곳에 집중시키면 트랜잭션 처리 시간이 줄어든다.
    • 반정규화 방법:
      • 서로 관련된 여러 테이블을 하나로 합쳐서 관리함으로써 쿼리의 조인 연산을 줄인다.
      • 자주 접근하는 데이터를 여러 테이블에 중복 저장함으로써 데이터 접근 시간을 단축한다.
      • 집계 함수를 사용해 조회하는 데이터를 사전에 계산하여 별도의 테이블에 저장하여 집계 쿼리의 실행 시간을 줄여준다.
    SQL 쿼리의 실행 순서
    - 5단계: SELECT 요리이름, COUNT(*) as 주문수 → 최종 결과 테이블의 칼럼을 만들거나 선택
    - 1단계: FROM 주문내역 → 테이블에서 데이터 가져오기
    - 2단계: WHERE 날짜 = '2024-07-22' → 조건에 맞는 행 선택
    - 3단계: GROUP BY 요리이름 → 같은 종류끼리 그룹화
    - 4단계: HAVING COUNT(*) > 5 → 그룹 중 조건에 맞는 것 선택
    - 6단계: ORDER BY 주문수 DESC; → 최종 결과 테이블의 칼럼을 오름차순, 내림차순으로 정렬

    ※ SQL 쿼리는 셀프웨구해오로 주로 외운다.