2023-05-17[TIL]

jenna·2023년 5월 18일
1

TIL/WIL

목록 보기
24/60

정규화

:테이블 간에 중복된 데이터를 허용하지 않음으로써 무결성(integrity)을 유지할 수 있게 하는 것

장점

  • 데이터 변경 시 이상 현상을 없앨 수 있다
  • 안정성 및 무결성을 유지 할 수 있다
  • 효과적인 검색 알고리즘을 생성할 수 있다

단점

  • 관계간의 JOIN연산이 증가함으로써 응답 시간이 저하될 수 있다

함수 종속성이란?

  • 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계
  • A는 B를 결정한다, B는 A에 종속한다
  • A -> B로 표기하며 A를 B의 결정자라고 한다

이상현상이란?

  • 삽입 이상(insertion Anomaly): 데이터 삽입 시 원하지 않는 값들도 함께 삽입되는 현상
  • 삭제 이상: 데이터 삭제 시 다른 정보까지 연쇄적으로 삭제되는 현상
  • 수정 이상: 데이터 수정 시 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상
ex)

학생테이블              학과테이블
--------              --------
학번           +       학과코드
이름                   학과명
학과코드
전화번호
주소

학과 테이블과 학생 테이블을 하나로 합친 테이블에서 새로운 학생이 한명 추가될 때 필요한 학과코드가 없다면 임의의 값을 넣어줘야 한다 즉 불필요한 정보가 함께 추가되는 것이다
반대로 컴퓨터공학과 라는 학과를 추가할 떄는 학생이 없기 때문에 임의의 값으로 학생의 정보들을 입력해야한다 이러한 문제를 이상현상이라고 한다

즉 어떠한 데이터를 삽입 할 때 임의로 값을 넣어야하는 정보가 있다면 테이블을 나누어 관리하고 필요한 경우 join하여 사용할 수 있다

[제1 정규화]

  • 각 컬럼이 하나의 속성만을 가져야 한다(값이 2이상이면 안됨)
  • 하나의 컬럼은 같은 종류나 타입의 값을 가져야한다
  • 각 컬럼이 unique한 이름을 가져야 한다
  • 컬럼의 순서가 상관없어야 한다

[제2 정규화]

  • 제1 정규형을 만족해야 한다

  • 모든 컬럼이 부분적 종속이 없어야한다(모든 컬럼이 완전 함수 종속을 만족해야 함)
    *부분적 종속이란 기본키 중에 특정 컬럼에만 종속되는 것
    *완전 함수 종속이란 키본키의 부분집합이 결정자가 되어선 안된다는 것

    *기본키는 학생번호와 과목으로 복합키

성적의 특정 값을 알기 위해서는 학생번호와 과목이 있어야한다
지도교수는 과목명만 알면 누군지 알 수 있다
지도교수 컬럼은 학생 번호, 과목에 종속되지 않고 과목에만 종속되는 부분적 종속이다

[제3 정규화]

  • 제2 정규형을 만족해야한다

  • 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다

    ID를 알면 등급을 알 수 있다
    등급을 알면 할인율을 알 수 있다
    ID를 알면 할인율을 알수 있는 경우 이행 종속성 존재
    • (A->B, B->C 일 때 A->C 가 성립되면 이행 종속)
    • 이행 종속을 없애려면 아래와 같이 분해해야 한다


[BCNF(Boyce-Codd Normal Form)]

  • 제3 정규형을 만족해야 한다
  • 모든 결정자가 후보키가 되어야한다
    *후보키 집합에 없는 칼럼이 결정자가 되면 안된다는 뜻
    *결정자란 (학번은 결정자고 이름이 종속자)의 예를 들면 학번은 딱 한 사람만 지칭 할 수 있지만 이름은 (동명이인) 여러 학번을 가질 수 있다
    학생번호, 과목이 키본키로 지도교수를 알 수 있다
    같은 과목을 다른 교수가 가르칠 수도 있어서 과목->지도교수 종속이 성립되지 않는다
    지도교수가 어떤 과목을 가르치는지 알 수 있으므로 지도교수->과목 종속이 성립한다
    BCNF를 만족하지 위해 아래처럼 분해



KEY 종류

참고
https://coding-factory.tistory.com/872
https://code-lab1.tistory.com/47
https://code-lab1.tistory.com/48
https://inpa.tistory.com/entry/DB-%F0%9F%93%9A-%ED%82%A4KEY-%EC%A2%85%EB%A5%98-%F0%9F%95%B5%EF%B8%8F-%EC%A0%95%EB%A6%AC

profile
https://github.com/jennaaaaaaaaa

0개의 댓글