SQLD · SQL 개발자

정규화와 반정규화

정규형의 정의를 묻기도 하지만, 주어진 테이블이 몇 정규형인지 판정하거나 어떤 이상현상이 생기는지 고르는 문제가 더 많습니다. 부분 함수 종속과 이행 함수 종속을 테이블에서 직접 찾아낼 수 있어야 합니다.

이 주제에서 다루는 내용

  • 제1·제2·제3정규형과 BCNF 의 판정 기준
  • 부분 함수 종속과 이행 함수 종속
  • 삽입·갱신·삭제 이상현상
  • 반정규화의 대상과 기법 — 테이블·컬럼·관계 반정규화
  • 정규화가 조회 성능에 미치는 영향

자주 틀리는 지점

  • 정규화를 하면 성능이 항상 좋아진다고 보는 보기. 조인이 늘어 조회가 느려질 수 있습니다.
  • 부분 함수 종속을 복합키가 아닌 테이블에서 찾으려는 경우. 복합키에서만 생깁니다.
  • 반정규화를 데이터 중복 허용과 같은 말로만 이해하는 경우.

연습문제 3문항

아래 문항은 오리지널 문제입니다. 기출문제가 아닙니다.

  1. 물류 회사에서 다음과 같은 배송 테이블을 정규화하려고 한다. 현재 테이블에서 발생할 수 있는 이상현상과 정규화 방향에 대한 설명으로 가장 적절한 것은? [DELIVERY 테이블] DELIVERY_ID | CUSTOMER_NAME | CUSTOMER_PHONE | PRODUCT_LIST | DRIVER_NAME | DRIVER_LICENSE ----------- | ------------- | -------------- | ------------ | ----------- | -------------- D001 | 김철수 | 010-1234-5678 | 노트북,마우스 | 이기사 | 12-34-567890 D002 | 박영희 | 010-9876-5432 | 키보드 | 최운전 | 98-76-543210 D003 | 김철수 | 010-1234-5678 | 모니터 | 이기사 | 12-34-567890

    • A. 현재 테이블은 1정규형을 위반하고 있으며, PRODUCT_LIST 컬럼의 다중값을 별도 테이블로 분리하고, 고객과 기사 정보를 각각 독립된 테이블로 정규화해야 한다.
    • B. 테이블은 3정규형까지 만족하므로 정규화가 필요없으며, 단지 PRODUCT_LIST를 JSON 형태로 변경하면 된다.
    • C. 2정규형 위반이 주요 문제이며, CUSTOMER_NAME과 DRIVER_NAME만 별도 테이블로 분리하면 모든 이상현상이 해결된다.
    • D. 현재 상태에서는 삭제이상만 발생하고 삽입이상과 갱신이상은 발생하지 않으므로, DELIVERY_ID에 인덱스만 추가하면 된다.

    정답: A

    해설. 현재 DELIVERY 테이블은 1정규형(원자값 조건)을 위반하고 있다. PRODUCT_LIST 컬럼에 '노트북,마우스'와 같은 다중값이 저장되어 있기 때문이다. 또한 CUSTOMER_NAME-CUSTOMER_PHONE, DRIVER_NAME-DRIVER_LICENSE 간의 함수적 종속성으로 인해 갱신이상(김철수 전화번호 변경 시 여러 행 수정 필요)과 삽입이상(배송 없이 고객 정보만 저장 불가)이 발생한다. 정답 A가 올바른 정규화 방향을 제시한다. B는 3정규형 만족 판단이 틀렸고, C는 1정규형 위반을 간과했으며, D는 삽입이상과 갱신이상 발생 가능성을 무시했다.

  2. 다음 정규화 과정에서 발생할 수 있는 문제점으로 가장 적절한 것은? [학생 테이블] 학번, 이름, 전공코드, 전공명, 지도교수, 교수연락처가 하나의 테이블에 저장되어 있을 때, 제3정규형 적용을 위해 분해한 결과 [학생] 테이블(학번, 이름, 전공코드, 지도교수), [전공] 테이블(전공코드, 전공명), [교수] 테이블(지도교수, 교수연락처)로 분리되었다.

    • A. 학생 테이블의 지도교수 컬럼이 교수 테이블의 지도교수와 참조무결성을 보장하지 못하여 데이터 일관성 문제가 발생할 수 있다.
    • B. 전공 테이블의 전공코드가 중복 값을 허용하게 되어 데이터 중복이 증가하고 저장 공간 낭비가 발생한다.
    • C. 분해된 테이블들을 조인할 때 원본 테이블의 정보를 완전히 복원할 수 없는 무손실 분해 조건을 위반한다.
    • D. 제3정규형 조건을 만족하지 못한 분해로서, 학번이 전공코드와 지도교수를 동시에 결정하는 이행적 종속성이 여전히 존재한다.

    정답: A

    해설. 정답은 A입니다. 정규화 분해 시 교수 테이블의 지도교수 컬럼은 기본키 역할을 하는데, 학생 테이블의 지도교수는 외래키가 되어야 합니다. 하지만 동일한 컬럼명이라도 참조무결성 제약이 명시적으로 설정되지 않으면 데이터 일관성 문제가 발생할 수 있습니다. B는 전공코드가 전공 테이블의 기본키이므로 중복될 수 없습니다. C는 학번을 통해 모든 정보를 조인으로 복원 가능하므로 무손실 분해입니다. D는 학번→전공코드, 학번→지도교수의 직접 종속이므로 이행적 종속성이 제거된 올바른 제3정규형입니다.

  3. 의료진 정보를 관리하는 DOCTOR 테이블과 진료 기록을 관리하는 TREATMENT 테이블 간의 관계 모델링을 검토하고 있다. 다음 ERD 설명 중 정규화와 관계 설정 관점에서 가장 적절한 것은? **DOCTOR 테이블** | DOC_ID | DOC_NAME | DEPT_CODE | DEPT_NAME | |--------|----------|-----------|------------| | D001 | 김내과 | INTERNAL | 내과 | | D002 | 이외과 | SURGERY | 외과 | **TREATMENT 테이블** | TREAT_ID | DOC_ID | PATIENT_ID | TREAT_DATE | |----------|--------|------------|------------| | T001 | D001 | P001 | 2024-01-15 | | T002 | D002 | P002 | 2024-01-16 |

    • A. DOCTOR 테이블은 제2정규화를 위반하고 있으며, DEPT_CODE와 DEPT_NAME을 별도 DEPARTMENT 테이블로 분리해야 한다.
    • B. TREATMENT 테이블의 DOC_ID는 DOCTOR 테이블과 1:N 관계를 형성하며, 외래키 제약조건으로 참조 무결성을 보장할 수 있다.
    • C. DOC_ID는 인조식별자이므로 본질식별자인 DOC_NAME을 기본키로 사용하는 것이 더 적절하다.
    • D. TREATMENT 테이블에서 DOC_ID가 NULL이면 무명 의사의 진료를 의미하므로 외래키 제약을 설정하면 안 된다.

    정답: B

    해설. 정답 B: TREATMENT 테이블의 DOC_ID는 DOCTOR 테이블의 기본키를 참조하는 외래키로, 한 명의 의사가 여러 건의 진료를 담당할 수 있는 1:N 관계를 올바르게 표현한다. A는 틀렸는데, DEPT_CODE와 DEPT_NAME이 DOC_ID에 완전 함수 종속되므로 제2정규화를 위반하지 않는다. C는 DOC_NAME은 중복 가능성이 있어 기본키로 부적절하며, D는 진료에는 반드시 담당 의사가 있어야 하므로 DOC_ID에 NULL을 허용할 이유가 없다.

SQLD 연습문제 전체 풀기

같은 시험의 다른 주제