RDBMS 정규화

Jae Min·2023년 12월 18일
0
post-custom-banner

디비 설계를 할때, 무결성을 지켜야 함

무결성

데이터의 정확성, 일관성, 유효성을 유지하는 성질

무결성 종류

  1. 개체 무결성 (PK의 성질입니다)

    • 기본키는 null을 가질 수 없다.
    • 기본키는 유일한 값이어야 한다.
  2. 참조 무결성 (FK의 성질입니다)

    • 외래키는 null 이거나 참조테이블의 기본키여야 한다.
  3. 도메인 무결성 (도메인: 칼럼 값이 가질 수 있는 데이터의 성질)

    • 데이터는 속해있는 필드의 속성에 부합해야 한다.

    → s3_file_name 은 uuid 성질이어야 한다.

  4. null 무결성

    • 특정 속성(필드)값이 null 이 될 수 없다
  5. key 무결성

    • 한 테이블에는 적어도 하나 이상의 key 가 있어야 한다.
  6. 고유 무결성

    • 특정 필드가 identity 하면 같은 값이 있을 수 없다

무결성을 지키지 않으면 이상현상이 발생할 수 있음

이상현상 종류

  1. 삽입 이상

    학번학생 이름학과 명학과 코드
    1에디수학과001
    2제이크경영학과002
    물리학과003

    물리학과를 추가하고자 하는데 물리학과에는 학생이 한명도 없다 → 물리학과 추가 불가능

    → 학번, 학생이름 / 학과 명, 학과 코드 분리 필요

  2. 삭제 이상

    학번학생 이름학과 명학과 코드
    1에디수학과001
    2제이크경영학과002
    3올리물리학과003

    올리가 자퇴를 해서 3번 row 를 지워야 한다 → 학과명과 학과 코드까지 한번에 지워지기 때문에 학과명, 학과 코드 정보가 사라진다

    → 학번, 학생이름 / 학과 명, 학과 코드 분리 필요

  1. 수정 이상

    학번학생 이름학과 명학과 코드
    1에디수학과001
    2제이크경영학과002
    3올리물리학과003
    4파이물리학과003
    5물리학과003
    6물리학과003

    물리학과의 학과 코드가 004 로 바뀐다면 4개의 행을 수정해야 한다 → 여기서 실수로 3개만 수정한다면 데이터가 상이한 문제가 발생

    → 학번, 학생이름 / 학과 명, 학과 코드 분리 필요

다음과 같은 이상현상을 해결하려면 정규화가 필요하다 (정규화를 해야하는 이유 → 이상현상을 제거 하기 위해)

함수 종속성

하나의 값 A에 의해 다른 값 B가 하나의 값으로 결정되는 속성 (A가 B를 결정한다)

학번학생 이름학과 명학과 코드
1에디수학과001
2제이크경영학과002
3올리물리학과003
4파이물리학과003
5물리학과003
6물리학과003

학번은 학생이름을 결정한다 학번 → 학생이름 (종속성), 학번종속 결정자이다

정규화

  1. 제 1 정규화

    • 각 칼럼이 하나의 속성만을 가져야 한다 → 학과명에서 불만족
    • 하나의 칼럼은 같은 타입의 값을 가져야 한다 → 학과명에서 불만족
    • 각 칼럼이 유일한 이름을 가져야 한다 → 만족
    • 칼럼의 순서가 상관없어야 한다 → 만족

    수정전

    학번학생 이름학과 명학과 코드
    1에디수학과, 정치학과001
    2제이크경영학과002
    3올리물리학과003

    수정후

    학번학생 이름학과 명학과 코드
    1에디수학과001
    2제이크경영학과002
    3올리물리학과003
    1에디정치학과004
  2. 제 2 정규화

    • 1 정규화를 만족해야 한다 → 만족
    • 모든 칼럼이 부분 종속성(PK가 아닌 다른 키에 종속됨)이 없어야 한다,
      완전 함수 종속(PK에만 종속될 수 있다)을 만족해야 한다.
      해당 테이블의 PK는 (학번+학과명) 이라고 했을 떄,
      점수는 PK에 종속되지만, 학과 코드는 학과명에 종속된다.

    수정전

    학번학과 명학과 코드점수
    1수학과001100
    2경영학과00290
    3물리학과00380

    수정후

    학번학과 코드점수
    1001100
    200290
    300380

    학과 코드학과 명
    001수학과
    002경영학과
    003물리학과
  3. 제 3 정규화

    • 2 정규화를 만족해야 한다
    • 기본키를 제외하고 모든 칼럼은 이행 종속성(X→Y, Y→Z ⇒ X→Z)이 없어야 한다.

    수정전

    학번학생 이름전화번호
    1에디01055558888
    2제이크01044447777

    학번을 알면 학생이름을 알 수 있고, 학생이름을 알면 전화번호를 알 수 있다.

    학번을 알면 전화번호를 알 수 있게 됨

    수정후

    학번학생 이름
    1에디
    2제이크
    학생 이름전화번호
    에디01055558888
    제이크01044447777
  4. BCNF 정규화

    • 3 정규화를 만족해야 한다.
    • 후보키(PK가 될 수 있는 칼럼들)에 속하지 않은 칼럼이 종속 결정자가 될 수 없다.

    수정전

    payment_idrfq_idproject_name
    14test-1
    24test-1
    36test-3

    PK는 payment_id 이다

    rfq_id 는 payment_id 에 의해 결정 되지만, project_name 은 rfq_id 에 의해 결정된다.

    rfq_id 는 후보키가 아니기 때문에 만족하지 않는다.

    수정후

    payment_idrfq_id
    14
    24
    36

    rfq_idproject_name
    4test-1
    6test-3
profile
자유로워지고 싶다면 기록하라.
post-custom-banner

0개의 댓글