정규화

순동·2022년 4월 27일
0

📌 데이터베이스 이상 현상

이상 현상(anomaly)란 데이터베이스에서 삽입, 업데이트, 삭제를 제대로 할 수 없게 되는 경우를 의미한다. 이는 데이터 모델링을 제대로 하지 않았기 때문에 발생한다.

  • 삽입 이상 : 새로운 데이터를 자연스럽게 저장할 수 없는 경우
  • 업데이트 이상 : 데이터를 업데이트 했을 때 정확성을 지키기 어려워지는 경우
  • 삭제 이상 : 원하는 데이터만 자연스럽게 삭제할 수 없는 경우

📌 정규화

정규화(Normalization)란 데이터베이스의 테이블이 잘 만들어졌는지 평가하고, 잘 만들지 못한 테이블을 고쳐나가는 과정을 의미한다. 정규화는 테이블을을 정규형(normal form)이라고 불리는 형태에 부합하게 만들어 나간다.

  • 1NF, 2NF, 3NF, ...
  • 순서에 따라 규칙이 누적된다.

  • 데이터베이스에서 삽입, 업데이트, 삭제 이상을 없앨 수 있다.
  • 새로운 종류의 데이터를 추가할 때 테이블 구조 수정을 많이 하지 않아도 된다.
  • 데이터베이스 구조를 단순화해서 사용자가 더 쉽게 이해할 수 있다.

따라서 정규화는 데이터 모델을 만들고, 데이터베이스에 구현하기 전에 적용하면 좋다.


📌 1NF

테이블 안 모든 row의 모든 column 값들은 나눌 수 없는 단일 값이어야 한다.

전화번호 테이블을 따로 생성하여 여러 개의 전화번호를 저장하고 Foreign Key를 사용하여 각 전화번호가 어떤 유저의 전화번호인지를 나타내면 된다.


📌 함수의 종속성

함수의 종속성(Functional Dependency)2NF3NF에서 사용되는 개념이며, 테이블 안의 Attribute들 사이에서 생기는 관계를 의미한다.

만약 x의 값에 따라서 y의 값이 결정될 때, y는 x에 함수 종속성이 있다고 한다. 수학적으로는 x -> y로 나타낸다.

또한 함수 종속성은 반드시 하나의 컬럼에만 있어야하는 건 아니다.

함수 종속성에는 이행성이라는 속성이 있다. 하나 이상의 Attribute를 건너서 함수 종속성이 있는 경우를 의미한다. 이를 이행적 함수 종속성이라고 한다.


📌 Cadidate Key

Candidate Key란 하나의 row를 특정지을 수 있는 attribute들의 최소 집합을 의미한다. 한 테이블에는 여러 개의 Candidate Key가 있을 수 있지만, 하나의 Primary Key만 있을 수 있다.

  • prime attribute : Candidate Key에 포함된 모든 attribute들을 의미
  • non-prime attribute : Candidate Key의 일부가 아닌 모든 attribute들을 의미


📌 2NF

테이블이 2NF에 부합하기 위한 조건이 있다.

  • 1NF에 부합해야 한다. 즉, 테이블 안의 모든 값이 나눌 수 없는 단일 값이어야 한다.
  • 테이블에 candidate Key의 일부분에 대해서만 함수 종속성이 있는 non-prime attribute가 없어야 한다.

  • {user_id, product_id} -> Candidate Key
  • {age, price} -> non-prime attribute
  • user_id -> age
  • product_id -> price

age와 price는 candidate Key의 전체 {user_id, product_id}가 아닌 일부에만 의존하고 있다. 2NF를 지키고 있지 못하는 모습이다. 어떻게 해결할 수 있을까 ❓

candidate Key의 일부분에만 의존하는 non-prime attribute들을 따로 분리해준다.


📌 3NF

  • 2NF에 부합해야 한다. (단일값이어야 하고, non-prime attribute가 아니어야 함)
  • 테이블 안에 있는 모든 attribute들은 오직 Primary Key에 대해서만 함수 종속성이 있어야 한다.

  • {evnt, event_num} : candidate key
  • {winner, age} : non-prime attribute
  • winner -> age

id -> winner -> age라는 이행적 함수 종속성이 있기 때문에 3NF를 어기고 있는 모습이다. 어떻게 해결해야 할까 ❓

user 테이블이 존재한다면 winner를 name으로 변경하고 name, age를 user 테이블로 옮긴다. 그리고 user 정보를 알 수 있도록 user_id라는 Foreign Key를 설정해준다.


📌 비정규화

비정규화는 정규형에 부합하는 테이블을 정규형을 지키지 않도록 바꾸는 걸 의미한다.

  • 정규화는 속도가 느려지고 성능을 저하시킬 수 있다.
  • 비정규화는 속도가 빨라지고 성능을 개선시킨다.

0개의 댓글