ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정규화 역정규화
    DB 2024. 6. 7. 16:13

    [Database Normalization]

     

    한 테이블에서 중복성을 막기 위한 것으로

    한 테이블을 여러 테이블로 올바르게 쪼개는 과정임

     

    normalization을 하면 테이블의 개수가 늘어나지만
    각 테이블의 column수가 줄어든다
    나중에 서로 연결된 데이터를 알고 싶으면 각 나눈 테이블들을 JOIN하여 찾아내야한다

    즉 테이블 개수 많아지는데 테이블 크기는 작아지고 JOIN 횟수는 많아진다


    [Functional Dependency]

     

    column X에 따라 column Y가 유일하게(uniquely) 결정될때

    "X가 Y를 함수적으로 결정한다"
    "Y가 X에 함수적으로 의존한다"
    라고 말할 수 있고, 두 집합 사이의 이러한 제약 관계를
    functional dependency 라고 부름

    X -> Y
    ex) 학생 고유ID는 학생 이름, 학생 나이, 학생 학과를 결정짓는다

     


    [1NF]

     

    한 column이 2개 이상의 value를 가질 수 없음

     

    1NF는 단순히 column만 늘리는 작업임

     


    [2NF]

     

    부분적 함수 종속성이 존재하면 안됨

    2NF부터는 테이블 분리 작업이 들어감!

     

    부분적 함수 종속성

    candidate key 전체가 아닌 일부에 종속되는 attribute가 존재하는 것을 말함

    즉 candidate key가 (id, lab_id)이고 이 두 개로 (name, lab_name)을 찾도록 되어있는데

    사실상 id만으로도 name을 찾을 수 있고 lab_id만으로도 lab_name을 찾아올 수 있으므로

    이거슨 부분적 함수 종속이다

    즉 잘못만들어진 테이블이라는 거임

     

    다른 말로 하면

    모든 non-prime attribute는 모든 key에 fully dependent 해야함

    모든 non-prime attribute는 어떤 key에도 partially dependent하면 안된다

     

    여기서 non-prime attribute는 column(attribute) that is not part of any candidate key of the relation 을 말한다

    cf)
    원래 테이블에서 일부를 분리할때 원래 테이블의 키 값도 가져가야함
    그래야지 나중에 JOIN까지 할 수 있기 때문임.
    원래 테이블과의 연결고리 역할을 하는 키를 넣어놔야함


    [3NF]

     

    이행적 함수 관계가 없어야함!

    모든 non-prime attribute는 어떤 key에도 transitively dependent 하면 안된다
    즉 trasitive relation이 존재하면 안된다!

     

    위와 같이 transitive relation이 존재하면

    즉 X->Y, Y->Z 가 모두 한 테이블 내에 존재하여 X->Z 도 만족할때

    이걸 transitive relation이라고 부른다. transitively dependent 하다고 함

     

    이런 transitive relation을 분리하는 작업이 3NF 과정임!

     

    위는 해당 테이블이 왜 transitive dependent 인지에 대한 설명임

     

    추가적으로 transitive dependent 관계일때 Y나 Z는 key의 부분집합 즉 key의 attribute이면 안됨!

     

     

    그래서 3NF 과정을 통해 테이블을 분리하면 위와 같이 됨

     

    transitive relation을 유발하는 empl_id와 empl_name을 다른 테이블로 분리하므로써

    기존 테이블에서의 empl_name이 중복되는 상황이 없어짐

     

    여기서 empl_id는 남겨둬야하는데

    그 이유는 나중에 JOIN을 통해 empl_name을 알려면 연결고리가 있어야하기 때문

    empl_id가 연결고리 역할을 해주므로 기존 테이블에서 empl_id는 남겨둬야하고

    새롭게 생긴 EMPLOYEE 테이블의 기본키는 empl_id로 설정해줘야함!

    'DB' 카테고리의 다른 글

    [DB] Transaction Conflict Serializability  (0) 2024.11.17
    ACID  (0) 2024.11.17
    스케일인 스케일아웃  (0) 2024.03.29
    옵티마이저  (0) 2024.03.27
    데이터베이스 엔진  (0) 2024.03.03