코딩일기/자격증

[정보처리기사] 정규화 : 1NF, 2NF, 3NF, BCNF, 4NF, 5NF | 정보처리기사 실기 기출문제

jhy_2023 2024. 8. 13. 08:47
728x90
반응형

📌 정규화의 기본 개념

정규화(Normalization)란 데이터베이스에서 데이터를 체계적으로 정리하는 과정으로, 데이터 중복을 최소화하고 이상(Anomaly)을 방지하며, 무결성을 유지하는 것을 목표로 합니다.

  • 무결성(Integrity)은 데이터의 정확성과 일관성을 유지하는 것을 의미합니다. 즉, 데이터베이스에 저장된 값이 항상 올바르고 신뢰할 수 있도록 보장하는 규칙을 말합니다. 무결성은 기본 키, 참조 관계, 도메인 제한 등과 관련된 여러 규칙을 포함하며, 크게 개체 무결성, 참조 무결성, 도메인 무결성으로 나눌 수 있습니다.
  • 이상(Anomaly)이란 테이블에 데이터가 비효율적으로 저장되면서 발생하는 문제를 의미합니다.
    이상은 주로 데이터 중복 때문에 발생하며, 삽입 이상, 삭제 이상, 갱신 이상의 세 가지 유형이 있습니다.
    이를 방지하기 위해 정규화(Normalization) 과정을 수행합니다.
반응형

📌 정규화의 목적

정규화의 주요 목적은 다음과 같습니다.

  • 데이터 중복 최소화 → 동일한 데이터가 여러 곳에 저장되는 것을 방지. 데이터를 중복 저장하지 않도록 하여, 저장 공간을 절약하고 데이터의 일관성을 유지합니다.
  • 데이터 저장 공간 절약 → 중복 데이터를 줄여 데이터베이스의 효율성을 높임.
  • 이상(Anomaly) 방지삽입 이상, 갱신 이상, 삭제 이상 등의 문제를 해결. 정규화되지 않은 데이터베이스는 삽입, 삭제, 갱신 등의 연산에서 의도하지 않은 부작용(이상)이 발생할 수 있습니다. 정규화는 이러한 이상을 방지하는 데 도움을 줍니다.
  • 데이터 무결성(Integrity) 유지 → 잘못된 데이터 입력이나 삭제로 인한 오류 방지. 정규화를 통해 데이터 구조를 체계적으로 관리할 수 있으며, 데이터 간의 종속성을 명확히 하여 데이터의 일관성과 무결성을 유지합니다.
  • 데이터 일관성(Consistency) 유지 → 변경 시 모든 관련 데이터가 올바르게 반영됨.
728x90

📌 정규화의 단계

정규화는 여러 단계로 나누어지며, 각 단계에서 특정한 데이터 문제를 해결합니다. 정규화는 1정규형(1NF)부터 5정규형(5NF)까지 있으며, 보통 3정규형(3NF) 또는 BCNF까지 수행하는 경우가 많습니다. 정규화의 주요 단계는 다음과 같습니다.

1️⃣ 제1정규형(1NF)

  • 조건
    • 모든 속성의 값이 원자값(Atomic Value)을 가져야 합니다. 즉, 하나의 속성(컬럼)에 복수의 값이 포함되지 않아야 합니다.
    • 테이블의 모든 열이 단일 값을 갖도록 하여, 테이블 구조를 단순화합니다.
  • ✅ 원자값
    • 원자값은 더 이상 나눌 수 없는 단일한 값을 의미합니다. 즉, 한 칸(셀)에 하나의 값만 포함되어 있어야 하며, 리스트나 복합적인 데이터가 들어가면 안 됩니다.
    • 제품명" 칼럼에 여러 개의 값(펜, 공책 / 마우스, 키보드)이 포함되어 있음 → 1NF 위반



2️⃣ 제2정규형(2NF) 

    • 조건
      • 1NF을 만족해야 합니다. 즉, 제1정규형의 조건을 충족한 테이블이어야 합니다.
      • 부분 함수 종속 제거
        • 기본 키가 복합 키일 경우, 기본 키의 일부만으로 값을 결정할 수 있는 속성이 있으면 안 됩니다.
          즉, 기본 키의 일부만으로 결정되는 속성이 있다면, 이를 분리하여 테이블을 재구성해 부분 함수 종속성을 제거합니다.
        • 기본키 전체에 대해 종속되어야 하며(완전 함수 종속), 기본키의 일부에만 종속되는 속성은 제거합니다.
    • ✅ 기본키
      • 기본키는 테이블에서 각 튜플(행)을 고유하게 식별하는 하나의 속성 또는 속성들의 집합입니다. 기본키는 후보키 중에서 하나를 선택하여 지정됩니다.
      • 기본키는 중복되지 않으며, NULL 값을 허용하지 않습니다.
      • 테이블에서 하나만 존재합니다. 즉, 하나의 테이블에 기본키는 하나만 지정될 수 있습니다.
    • ✅ 후보키
      • 후보키는 여러 개가 있을 수 있습니다. 즉, 테이블에는 여러 후보키가 존재할 수 있으며, 그 중 하나가 기본키로 지정됩니다.
      • 후보키는 중복되지 않으며, NULL 값을 허용하지 않습니다.
      • 후보키는 최소성을 만족해야 하며, 이를 통해 하나라도 속성을 제거하면 더 이상 고유성이 유지되지 않습니다. 최소성이란, 후보키가 불필요한 속성을 포함하지 않아야 한다는 뜻입니다. 후보키의 구성 요소가 최소화되어야 하며, 이 최소성을 만족하려면 하나라도 속성을 제거하면 유일성을 유지할 수 없다는 특징이 있습니다.
        • 예를 들어, 학생번호와 이름이 후보키라고 가정해 봅시다. 즉, 학생번호, 이름은 각 학생을 고유하게 식별할 수 있는 키입니다. 이때, 학생번호만으로도 학생을 고유하게 식별할 수 있다면, 학생번호, 이름에서 이름 속성은 필요하지 않게 됩니다. 즉, 학생번호가 최소한의 속성이 되어, 후보키로 남게 됩니다. 
    • 부분 함수 종속
      • 부분 함수 종속 (Partial Dependency) 은 기본키가 복합 키일 때 발생할 수 있는 문제입니다
      • 부분 함수 종속은 기본키의 일부 속성에만 의존하는 속성이 있을 때 발생합니다. 즉, 기본키가 복합 키(여러 속성으로 구성된 키)일 경우, 기본키의 일부 속성만으로 값이 결정될 수 있는 속성이 있다면, 그 속성은 부분 함수 종속을 갖고 있다고 합니다.
      • 예를 들어, 학생번호과목코드가 복합 키일 때, 학생이름학생번호만으로 결정되므로 부분 함수 종속이 발생합니다. 이를 해결하려면 학생이름을 별도의 테이블로 분리하여 학생번호와 관계를 맺으면 됩니다.
  • 완전 함수 종속
    • 완전 함수 종속기본키 전체에 의존하는 속성들이 있을 때 발생합니다. 즉, 복합 키의 모든 속성에 대해 의존해야 하며, 기본키의 일부에만 의존하면 안 됩니다.
    • 부분 함수 종속은 기본키의 일부 속성에만 의존하는 상황을 의미합니다. 이는 2NF 위반 요소로, 기본키 전체에 의존해야 합니다. 반면, 완전 함수 종속은 기본키 전체에 의존하는 속성을 의미하며, 2NF를 만족하는 상태입니다.
    • 학생번호수업코드가 복합키일 때, 학생이름학생번호만으로 결정될 수 있습니다. 이 경우 학생이름부분 함수 종속을 갖고 있습니다. 그러나 교수명수업시간수업코드에 의존하므로, **기본키 전체(학생번호 + 수업코드)**에 의존하는 속성입니다. 이 경우 교수명수업시간완전 함수 종속을 만족합니다.

🔎 2021년 2회 정보처리기사 실기 기출

부분 함수적 종속성을 제거하여 완전 함수 종속을 만족하는 정규형이 무엇인지 쓰시오.

정답 : 제2정규형 (2NF)

부분 함수적 종속 제거 → 완전 함수 종속을 만족하게 만드는 것이 제2정규형(2NF)입니다. 이를 위해 테이블을 분리하여 기본키 전체에만 의존하는 구조로 만들어야 합니다. 아래 예시를 통해 설명하겠습니다.

🔶 부분 함수적 종속

문제 테이블 (1NF 상태)

위 문제 테이블의 기본키는 학생ID와 과목ID 두 필드로 이루어져 있습니다. 
과목명과 교수명은 과목ID에만 의존합니다. 기본키 전체(학생ID + 과목ID)에 의존하지 않고, 과목ID만으로 결정됩니다.
예) CS101 → 컴퓨터과학, 김교수 따라서 부분 함수적 종속이 존재하며, 이는 제2정규형을 만족하지 못하는 상태입니다.

🔶 제2정규형으로 변환 (완전 함수 종속)

완전 함수 종속 : 속성이 기본키 전체에만 의존하고, 기본키의 일부에는 종속되지 않는 상태를 말합니다. 즉, 속성은 기본키 전체를 사용해야만 결정됩니다.

학생-성적 테이블
과목 테이블

부분 함수적 종속을 제거하기 위해 테이블을 두 개로 분리합니다.
학생-성적 테이블은 점수가 학생ID와 과목ID 전체에 종속됩니다. 따라서, 완전 함수 종속 상태가 됩니다.
과목 테이블은 과목명과 교수명이 기본키 과목ID에 종속됩니다. 과목ID는 더 이상 복합키가 아니므로, 부분 함수적 종속이 문제가 되지 않습니다.

🔎 2021년 2회 정보처리기사 실기 기출

다음의 <주문목록> 테이블과 <주문> 테이블은 <제품주문> 테이블을 기반으로 분해된 테이블이다.
이러한 분해는 부분 함수적 종속을 제거하여 완전 함수적 종속을 만족하기 위한 과정이다.
결과적으로, 이 분해가 만족하는 정규형은 무엇인지 쓰시오.

정답 :
제2정규형 (2NF)

부분 함수적 종속 제거  완전 함수적 종속을 만족하게 만드는 것이 제2정규형(2NF)입니다.
이를 위해 테이블을 분리하여 기본키 전체에만 의존하는 구조로 만들어야 합니다.
부분 함수적 종속: 기본키가 여러 속성으로 이루어져 있을 때, 기본키의 일부만으로 다른 속성을 결정할 수 있는 관계를 말합니다.

🔶 제1정규형(1NF) 상태

분해 전 테이블

  • 분해 전 테이블은 모든 속성의 값이 원자값(Atomic Value)이기 때문에  제1정규형(1NF)을 만족하는 상태의 테이블입니다. 
  • 기본키는 주문번호와 제품번호의 조합으로 이루어져 있습니다.
  • 그러나 고객번호와 주소는 주문번호에만 의존하며, 기본키 전체(주문번호 + 제품번호)에 의존하지 않습니다.
  • 이는 부분 함수적 종속에 해당하며, 테이블이 제2정규형을 만족하지 못하는 상태입니다.

🔶제2정규형으로 변환 (완전 함수 종속)

  • 부분 함수적 종속을 제거하기 위해 테이블을 두 개로 분리합니다. 
  • 주문목록 테이블:
    • 주문수량은 주문번호와 제품번호 전체에 종속됩니다.
    • 따라서, 완전 함수 종속 상태가 됩니다.
  • 주문 테이블:
    • 고객번호와 주소는 주문번호에 종속됩니다.
    • 이 테이블은 기본키가 단일 속성(주문번호)이므로, 부분 함수적 종속 문제가 발생하지 않습니다.



3️⃣ 제3정규형(3NF)

  • 조건
    • 2NF를 만족해야 합니다. 즉, 테이블이 제2정규형(2NF)의 조건을 충족해야 합니다.
    • 이행적 함수 종속을 제거
      • 기본키가 아닌 속성이 다른 비키 속성을 통해 기본키에 종속되면 안 됩니다 
      • A → B, B → C가 있을 때, A → C로 이어지는 종속 관계를 제거합니다.
  • ✅ 이행적 함수 종속
    • 이행적 함수 종속은 기본키가 아닌 속성이 다른 비키 속성을 통해 기본키에 종속되는 현상을 의미합니다.
    • 이행적 함수 종속은 A → B이고, B → C가 성립할 때, A → C가 성립하는 관계입니다.
    • 학생번호(PK), 학생이름, 학과코드, 학과이름 속성을 가진 테이블이 있다고 가정해봅시다.
      - 기본키: 학생번호
      - 학생번호 → 학과코드
      - 학과코드 → 학과이름
      여기서 학과이름은 학생번호와 직접적인 관계가 아니라 학과코드를 통해 간접적으로 결정됩니다.
      즉, 학과이름은 기본키(학생번호)에 직접 종속되지 않고, 학과코드에 의해 종속됩니다. 이 경우, 이행적 함수 종속이 발생한다고 할 수 있습니다. 따라서 기본키인 학생번호는 학과코드를 결정하고, 학과코드학과이름을 결정하게 되어, 학생번호 → 학과이름 관계가 성립하는 이행적 함수 종속이 발생합니다.

🔎 2024년 1회 정보처리기사 실기 기출

해당 표에서 나타나고 있는 정규형은 무엇인가?

정답 :
제3정규형(3NF)

🔶 제1정규형(1NF) 만족

  • 모든 속성이 원자값(Atomic Value)을 가지므로 1NF를 만족합니다.
    • 각 속성(열)에 하나의 값만 존재 : 예를 들어, "강좌명" 속성에는 "데이터베이스", "C언어" 와 같이 하나의 강좌만 들어가 있습니다.

🔶 제2정규형(2NF) 만족

  • 기본 키(Primary Key) 존재 : (고객아이디, 강좌명), 기본 키가 존재하여 각 행을 고유하게 식별할 수 있습니다.
  • 기본키(고객아이디, 강좌명)에 부분 함수 종속이 없으므로 2NF를 만족함.
    • 기본 키의 일부(고객아이디 또는 강좌명)에만 종속된 속성이 없음. 예를 들어, 강사번호는 (고객아이디, 강좌명) 전체에 의해 결정되며, 부분적으로 종속되지 않음.

🔶 제3정규형(3NF) 만족

  • 이행적 종속 없음
    • 강사번호는 고객아이디와 강좌명에 의해 결정되며, 이는 기본 키에 종속된 속성입니다.
    • 강사번호고객아이디와 강좌명에만 종속되고, 다른 비기본키 속성에 의존하지 않는다는 것입니다. 따라서, 이행적 종속이 존재하지 않으며, 제3정규형을 만족합니다.

🔶 BCNF(보이스-코드 정규형)  만족하지 않음

  • BCNF(보이스-코드 정규형, Boyce-Codd Normal Form)는 모든 결정자가 후보키여야 하는 정규형입니다. 즉, 후보키가 아닌 속성이 결정자가 되면 BCNF를 만족하지 않습니다.
  • 기본 키(Primary Key) 확인
    • 각 행을 유일하게 식별할 수 있는 속성을 찾습니다. (고객아이디, 강좌명) 조합이 각 행을 고유하게 구별할 수 있으므로 후보키가 됩니다.
  • 결정자(Determinant) 확인
    • 결정자는 특정 속성을 고유하게 결정하는 속성을 의미합니다.
    • (고객아이디, 강좌명) → 강사번호 즉, "고객아이디 + 강좌명"이 강사번호를 결정합니다.
    • 강사번호 → 강좌명 즉, 강사번호에 따라 강좌명이 결정됩니다. 따라서 강사번호 → 강좌명이라는 함수적 종속성이 존재하며, 강사번호도 결정자가 될 수 있습니다.
  • BCNF 위반 여부 확인
  • BCNF는 모든 결정자가 후보키여야 하지만, 강사번호는 후보키가 아닙니다. 즉, 강사번호 → 강좌명이라는 함수적 종속성이 존재하는데, 강사번호가 후보키가 아니므로 BCNF를 위반합니다.



4️⃣ BCNF(보이스-코드 정규형)

  • 조건: 3NF를 만족하고, 테이블의 모든 결정자가 후보키여야 합니다.
    • 결정자
      • 다른 속성을 결정하는 속성입니다. 쉽게 말하면, 하나의 값이 다른 값을 "알려주는" 역할을 하는 속성입니다.
      • 예를 들어, 학생ID가 결정자라면, 학생ID만으로 그 학생의 이름이나 나이 등을 유추할 수 있다는 의미입니다. 즉, 학생ID는 이름, 나이 등의 다른 속성을 결정하는 속성입니다.
    • 후보키
      • 후보키는 테이블에서 모든 속성(컬럼)을 유일하게 식별할 수 있는 최소한의 속성 집합입니다. 즉, 후보키는 하나의 값만으로 다른 모든 값을 유일하게 식별할 수 있어야 합니다. 중요한 점은 후보키가 최소성을 가져야 한다는 것입니다.
      • 예를 들어, 학생ID와 과목명 두 컬럼이 있으면 학생ID만으로 유일하게 특정 학생을 식별할 수 있다면, 학생ID는 후보키가 됩니다
      • 후보키는 여러 개일 수 있습니다. 예를 들어, 학생ID와 이메일 주소가 모두 후보키가 될 수 있습니다.
  • 목표: 모든 결정자가 후보키가 되도록 하여, 모든 관계를 정확히 표현합니다.



5️⃣ 제4정규형(4NF)

  • 조건: BCNF를 만족하고, 다치 종속(Multivalued Dependency)을 제거해야 합니다.
    • 다치 종속: 한 속성의 값이 여러 값과 연관되는 경우입니다.
  • 목표: 하나의 속성이 여러 값과 연관될 수 있는 다치 종속을 제거합니다.



6️⃣ 제5정규형(5NF)

  • 조건: 4NF를 만족하고, 조인 종속성(Join Dependency)을 제거해야 합니다.
    • 조인 종속성: 테이블을 분리했을 때 다시 조인할 수 없는 경우를 방지합니다.
  • 목표: 테이블의 분해로 인해 데이터의 의미가 훼손되지 않도록 합니다.




📌 정규화 단계 요약

  • 도메인이 원자값 (1NF)
  • 부분적 함수 종속 제거 (2NF)
  • 이행적 함수 종속 제거 (3NF)
  • 결정자이면서 후보키가 아닌 것 제거 (BCNF)
  • 다치 종속 제거 (4NF)
  • 조인 종속성 제거 (5NF)

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형