Week4 Anomaly, Functional Dependency, Normalization

이상현상, 함수적 종속성, 정규화

이상 현상이 뭘까요?

  • 데이터베이스에서 테이블 설계가 비효율적이거나 잘못되었을 때 발생하는 데이터 무결성 문제. 보통 중복된 데이터 때문에 발생

  • 삽입 이상: 데이터를 삽입할때 불필요하거나 잘못된 데이터를 추가해야 하는 상황. 예를 들어, 테이블이 너무 많은 정보를 가지고 있어서 필요한 정보를 추가하려면 다른 불필요한 정보도 함께 추가해야 하는 경우

  • 갱신 이상: 데이터를 수정할 때 중복된 여러 항목에서 모두 수정해야 하며, 일부만 수정될 경우 데이터 불일치가 발생하는 문제 예를 들어, 한 테이블에 동일한 정보가 여러 군데 저장되어 있고, 한 곳만 수정하면 일관성이 깨집니다.

  • 삭제 이상: 데이터를 삭제할 때 의도치 않게 다른 중요한 데이터까지 함께 삭제되는 문제 특정 데이터를 삭제하면 그와 관련된 다른 중요한 데이터도 함께 삭제 또는 삭제되야하는 데이터가 남아있는 상황

정규화 과정을 통해 최소화하거나 해결할 수 있습니다.

삽입 이상에 대해서 설명해주세요.

  • 제대로 정규화가 이루어지지않은 테이블에 데이터를 삽입하게 될때, 불완전한 정보를 삽입하거나 NULL 값을 넣어야하는 상황.

  • 부서를 만들면 강제로 부서에 있는 직원 데이터도 같이 넣어야하는 문제

갱신 이상에 대해서 설명해주세요.

  • 여러 곳에 중복된 데이터가 저장되어 있을때, 그 데이터를 수정하면 모든 위치의 데이터도 갱신해야합니다.

  • 일부 데이터만 수정하게되면 데이터 일관성이 깨져 서로 다른 정보가 공존하는 문제 발생. (데이터 불일치)

삭제 이상에 대해서 설명해주세요.

  • 정규화가 제대로 이루어지지 않아서, 데이터를 삭제할때 삭제되지 말아야하는 데이터도 같이 삭제되는 문제.

  • 또는 중복된 데이터가 존재하여 삭제 되어야하는 데이터가 같이 삭제가 되지 않는 문제

함수 종속성(Functional Dependency)가 뭔가요?

  • 데이터베이스에서 어떤 속성의 값이 다른 속성의 값을 고유하게 결정하는 관계를 의미. 즉, 하나의 속성 값이 주어지면, 다른 속성 값이 반드시 하나로 결정되는 경우

  • 학번 → 이름: 학번이 주어지면, 그 학번에 해당하는 학생의 이름이 결정됩니다. 이때 학번결정자(Determinant)이고, 이름종속자(Dependent)

  • 완전 함수적 종속, 부분 함수적 종속, 이행적 함수적 종속

완전 함수적 종속(Full Functional Dependency)가 뭔가요?

  • 완전 함수적 종속이란, 어떤 속성(B)기본키(A) 전체에 대해 완전히 종속되어 있는 경우를 의미. 즉, 기본키의 일부가 아닌 전체에 의해 다른 속성이 결정될 때

예시: 학생 수강 테이블

학생 ID

수업 ID

교수명

점수

1001

C101

김교수

90

1001

C102

이교수

85

1002

C101

김교수

95

테이블의 기본키:

학생 ID수업 ID복합 기본키로 사용합니다. 이 두 속성이 함께 있어야 학생이 어떤 수업을 듣고 있는지 고유하게 식별할 수 있습니다.

1. 완전 함수적 종속:

점수학생 ID수업 ID가 둘 다 주어져야만 결정됩니다.

  • 예를 들어, 학생 ID 1001과 수업 ID C101을 함께 사용해야 그 학생이 김교수의 수업을 듣고, 점수가 90점이라는 것을 알 수 있습니다.

  • 학생 ID수업 ID 중 하나만으로는 점수가 무엇인지 알 수 없습니다. 두 개의 속성이 모두 있어야 점수가 결정되기 때문에, 점수는 완전 함수적 종속입니다.

2. 부분 함수적 종속과의 차이:

만약 교수명수업 ID에만 종속되어 있다면, 이것은 부분 함수적 종속에 해당합니다. 왜냐하면, 수업 ID만 주어져도 교수명을 알 수 있기 때문입니다.

  • 예를 들어, 수업 ID C101은 언제나 김교수가 담당합니다. 즉, 수업 ID 하나만으로도 교수명을 결정할 수 있으므로 교수명은 수업 ID에 대해 부분 함수적 종속입니다.

부분 함수적 종속이 뭔가요?

  • 어떤 속성(B)이 기본키 전체가 아닌 일부에만 종속되는 경우 이때, 속성 B는 기본키 일부에만 종속되므로, 기본키의 나머지 부분이 없어도 B의 값이 결정될 수 있습니다.

예시:

학생 ID (A1)
수업 ID (A2)
교수명 (B)

1001

C101

김교수

1002

C101

김교수

1001

C102

이교수

  • 여기서 학생 ID수업 ID복합 기본키입니다.

  • 그러나 교수명(B)은 수업 ID(A2) 하나만으로 결정됩니다. 즉, 학생 ID는 필요 없이 수업 ID만 있으면 교수명이 결정됩니다. 이는 부분 함수적 종속의 예입니다.

    • 교수명은 기본키 전체(학생 ID + 수업 ID)에 종속되지 않고, 수업 ID에만 종속됩니다.

이행적 함수적 종속(Transitive Functional Dependency)가 뭔가요?

  • 이행적 함수적 종속이란, A → BB → C라는 두 개의 함수적 종속이 있을 때, A → C의 종속 관계가 성립하는 것 즉, 속성 A속성 B를 결정하고, 속성 B속성 C를 결정할 때, 결과적으로 속성 A속성 C를 결정하는 관계

  • 제3정규형(3NF)에서는 이행적 종속을 제거하는 것이 목표

예시:

직원 정보 테이블

직원 ID (A)
부서 ID (B)
부서장 이름 (C)

1001

D01

김부장

1002

D02

이부장

1003

D01

김부장

  • 직원 ID부서 ID를 결정할 수 있습니다. 즉, A → B.

  • 부서 ID부서장 이름을 결정할 수 있습니다. 즉, B → C.

  • 결과적으로 직원 ID부서장 이름을 간접적으로 결정할 수 있습니다. 즉, A → C.

    • 이는 이행적 함수적 종속의 예입니다. 직원 ID는 부서 ID를 통해 부서장 이름을 간접적으로 결정하고 있습니다.

요약:

  • 이행적 함수적 종속은 간접적인 종속 관계를 의미합니다.

  • A → B, B → C일 때, A → C도 성립합니다.

정규화가 뭔가요?

  • 설계 과정에서 데이터 중복을 줄이고, 이상 현상(삽입, 갱신, 삭제 이상)을 방지하기 위해 테이블을 최적화하는 과정

1. 제1정규형(1NF):

  • 테이블의 모든 속성이 원자값(더 이상 나눌 수 없는 값)으로 이루어져 있어야 합니다. 즉, 중첩된 데이터나 중복된 값이 없도록 데이터를 정리하는 단계입니다.

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

  • 제1정규형을 만족하고, 기본키에 대해 완전 함수적 종속을 만족해야 합니다. 즉, 기본키의 일부에만 종속되는 속성(부분 함수적 종속)을 제거합니다.

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

  • 제2정규형을 만족하고, 이행적 함수적 종속을 제거합니다. 즉, 기본키가 아닌 속성들 간의 간접적인 종속 관계를 없애는 단계입니다.

4. BCNF(Boyce-Codd Normal Form):

  • 제3정규형을 강화한 형태로, 테이블의 모든 결정자가 반드시 후보키여야 한다는 규칙을 따릅니다. 복잡한 종속성을 제거하여 더 높은 무결성을 확보합니다.

원부이결다조

제 1 정규화(1NF) : 모든 컬럼 값이 원자값(Atomic value)을 가지도록 테이블을 구조화합니다. 제 2 정규화(2NF) : 테이블에 존재하는 모든 컬럼이 기본 키에 대해 완전 함수적 종속 관계를 가지도록 테이블을 분리합니다.(부분 함수 종속 제거) 제 3 정규화(3NF) : 모든 비기본키 컬럼이 기본 키에 대해 이행적 함수 종속 관계를 가지지 않도록 테이블을 분리합니다. 보이스-코드 정규화(BCNF) : 모든 결정자가 후보키가 되도록 테이블을 분리합니다. 제 4 정규화(4NF) : 다중값 종속 관계가 있는 컬럼을 분리합니다. 제 5 정규화(5NF) : 조인을 통해 유도 가능한 데이터를 분리합니다.

반정규화가 뭔가요?

  • 정규화된 데이터베이스에서 성능 향상을 위해 일부 정규화를 되돌리는 과정

  • 정규화로 인해 쪼개진 테이블들을 다시 결합하거나, 중복 데이터를 일부 허용하여 쿼리 성능을 최적화하는 방법

  • JOIN 연산이 많아져 성능이 저하

Last updated