SQL/SQLD

#6 정규화(Normalization)

sundori 2024. 12. 6. 18:38

목차

    정규화 Normalization

    데이터의 정합성(정확성과 일관성을 유지하며 보장)을 위해 엔터티를 작은 단위로 분리하는 과정이다.

     

    정규화 시... : 입력, 수정, 삭제 성능은 향상된다고 보지만 데이터 조회 성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있다. 하지만  모든 엔터티를 무작정 분리하면 안 된다.

     

    (제 1 정규형)

    모든 속성(컬럼)은 반드시 원자 값(atomic value)을 가져야 한다. 즉, 하나의 속성은 하나의 값만 포함해야 하며, 반복 그룹이나 배열 형태로 데이터를 저장하면 안 된다.

    예제
    아래와 같이 "이름"과 "국가"라는 속성을 가진 테이블이 있다고 하자. 이때 "국가" 열에 여러 개의 값이 하나의 셀에 들어가 있는 상태는 1NF를 위반한 사례다.

    이름 국가
    권00 대한민국, 일본
    이름 참조1 참조2 참조3
    권00 네이버 다음 구글

    1NF로 변환한 테이블

    이름 국가
    권00 대한민국
    권00 일본
    이름 참조
    권00 네이버
    권00 다음
    권00 구글

    설명

    • "국가" 속성을 분리하여 각 값이 독립된 행으로 나누어지도록 재구성했다.
    • 이를 통해 데이터베이스에서 각 속성이 원자 값만 가지도록 보장하며, 검색 및 처리 작업이 더 간단해진다.

    1NF 적용의 장점

    1. 데이터 무결성 강화: 각 값이 분리되어 있어 데이터의 정합성을 유지하기 쉬워진다.
    2. 검색 효율성 증가: 특정 국가에 대한 검색이나 필터링이 간단해진다.
    3. 유지보수 용이성: 데이터 수정 및 추가 작업이 명확해진다.

     

    문제 상황: 제1 정규형 위반된 테이블

    1NF를 위반한 테이블 구조는 데이터베이스에서 특정 값을 조회하거나 수정할 때 문제가 발생한다. 아래는 이를 설명하는 문제와 관련된 SQL 쿼리 및 해결 방법이다.

     

    문제 1: "국가" 속성에서 특정 값을 검색하기 어려움

    테이블에서 특정 국가(예: "대한민국")를 검색하고자 할 때, "대한민국"과 "일본"이 한 셀에 포함되어 있어 문자열 검색이 복잡해진다.

     

    SELECT * 
    FROM table_name
    WHERE 국가 = '대한민국';

     

    따라서 하나의 속성이 다중값을 가지는 경우 데이터를 꺼내 쓸 때 불필요한 Split를 사용해야한다.

     

     

    (제 2 정규형)

    제2정규형(2NF)은 **제1정규형(1NF)**을 만족하면서, 부분적 종속성(Partial Dependency)을 제거한 상태를 말한다.
    즉, 기본 키(Primary Key)의 일부에만 종속되는 속성을 제거하여, 모든 비기본 속성(Non-Prime Attribute)이 기본 키 전체에 종속되도록 설계한다.


    추가 설명: 복합 기본 키란?

    • 기본 키(Primary Key):
      테이블에서 각 행을 고유하게 식별하는 데 사용되는 하나 이상의 속성.
    • 복합 기본 키(Composite Primary Key):
      기본 키가 두 개 이상의 속성으로 구성된 경우를 말한다. 예를 들어, 아래와 같은 데이터가 있을 때:
      • 기본 키: (학생 ID, 과목)
      • "학생 ID"와 "과목"의 조합이 각 행을 고유하게 식별한다.

    2NF를 위반한 테이블

    학생 ID 과목 학생 이름 점수
    S001 수학 홍길동 90
    S001 과학 홍길동 80
    1. 문제의 요약
    위에 제시된 테이블은 제2정규형(2NF)을 위반하고 있다. 문제의 핵심은 "학생 이름"이 복합키(학생 ID, 과목)의 일부에만 종속되어 있다는 점이다.
    제2정규형 위반 이유
    • 테이블의 주식별자(Primary Key)는 "학생 ID"와 "과목"의 조합이다.
    • 하지만 "학생 이름"은 "학생 ID"에만 종속된다. 즉, "과목"에 종속되지 않는다.
    • 이는 부분 함수 종속에 해당하며, 2NF를 위반한다.

    1. 데이터 중복

    • "학생 ID"와 "학생 이름"은 같은 학생에 대해 반복적으로 저장되고 있다.
    • "홍길동"이라는 이름이 여러 번 등장하므로 저장 공간을 낭비하게 된다.

    2. 수정 이상

    • 만약 "홍길동"의 이름을 "홍동길"로 변경해야 할 경우, 테이블의 모든 레코드를 수정해야 한다.
    • 일부 레코드만 변경하면 데이터 불일치가 발생할 위험이 있다.

    3. 삽입 이상

    • 새로운 학생 정보를 추가하려고 하지만 아직 과목 정보가 없는 경우(예: 점수 없음), 과목 필드에 값을 넣지 못하면 학생 정보를 삽입할 수 없다.

    4. 삭제 이상

    • 특정 과목 점수 정보를 삭제하면, 해당 학생의 전체 정보도 함께 삭제될 위험이 있다.
    • 예를 들어, "홍길동"의 모든 과목 점수를 삭제하면 학생 자체의 정보도 사라진다.

    문제의 근본 원인

    • 테이블이 부분 함수 종속을 포함하고 있다.
    • 기본 키는 "학생 ID"와 "과목"의 조합이지만, "학생 이름"은 "학생 ID"에만 의존한다. 이는 제2정규형을 위반한다.

     

    2NF로 변환한 테이블들

    학생 정보 테이블

    학생 ID 학생 이름 학년
    S001 홍길동 2
    S002 이몽룡 1

     

    성적 테이블

    학생 ID 과목 점수
    S001 수학 90
    S001 과학 80
    S002 수학 70
    S002 과학 85

     

     

    (제 3  정규형)

    제3정규형(3NF, Third Normal Form)은 데이터베이스 정규화 과정에서 데이터의 중복을 줄이고 무결성을 높이기 위해 사용하는 단계 중 하나다. 이를 만족하기 위해서는 다음 두 가지 조건을 충족해야 한다.

    1. **제2정규형(2NF)**을 만족해야 한다.
      즉, 모든 비주식별자 속성은 기본키 전체에 종속되어야 하며, 기본키의 부분집합에 종속되면 안 된다.
    2. 주식별자가 아닌 속성들은 서로 독립적이어야 한다.
      이를 다른 말로 **이행적 종속(Transitive Dependency)**이 없어야 한다고 표현한다.
      이행적 종속이란, 어떤 속성 A가 속성 B에 종속하고, 속성 B가 속성 C에 종속할 때, 결과적으로 속성 A가 속성 C에 종속되는 관계를 의미한다. 제3정규형은 이러한 이행적 종속을 제거해야 한다.

    예를 들어 설명:

    비정규형 테이블

    학생 정보를 저장하는 테이블이 있다고 가정한다.

    학생ID 학생이름 전공코드 전공이름
    101 김철수 CS 컴퓨터공학
    102 이영희 EE 전자공학
    • 학생ID는 기본키다.
    • 전공이름은 전공코드에 의해 결정된다. 즉, 학생ID -> 전공코드 -> 전공이름으로 이행적 종속이 존재한다.

    제3정규형으로 변환

    이를 제3정규형으로 변환하려면, 이행적 종속을 제거해야 한다. 이를 위해 전공코드와 전공이름을 별도의 테이블로 분리한다.

    1. 학생 테이블
      학생ID 학생이름 전공코드
      101 김철수 CS
      102 이영희 EE
    2. 전공 테이블
      전공코드 전공이름
      CS 컴퓨터공학
      EE 전자공학

    이제 학생 테이블과 전공 테이블은 독립적이므로 제3정규형을 만족하게 된다.

    제3정규형의 장점

    1. 데이터 중복을 줄이고 저장 공간을 효율적으로 사용한다.
    2. 데이터 삽입, 삭제, 갱신 시 무결성을 유지하기 쉽다.
    3. 데이터베이스의 일관성을 높인다.

    하지만 정규화로 인해 테이블이 늘어나고, 조인이 많아져 성능 저하가 발생할 수 있으므로, 실제 설계에서는 정규화와 비정규화를 균형 있게 적용하는 것이 중요하다.

     

     

     

     

    728x90

    'SQL > SQLD' 카테고리의 다른 글

    #5 데이터 모델링(식별자)  (0) 2024.07.15
    #4 데이터 모델링(관계)  (0) 2024.07.09
    #3 데이터 모델링(속성)  (0) 2024.07.08
    #2 데이터 모델링(엔티티)  (0) 2024.07.04
    #1 데이터 모델링  (0) 2024.07.04