이상 현상(anomaly)
란 데이터베이스에서 삽입, 업데이트, 삭제를 제대로 할 수 없게 되는 경우를 의미한다. 이는 데이터 모델링을 제대로 하지 않았기 때문에 발생한다.
삽입 이상
: 새로운 데이터를 자연스럽게 저장할 수 없는 경우업데이트 이상
: 데이터를 업데이트 했을 때 정확성을 지키기 어려워지는 경우삭제 이상
: 원하는 데이터만 자연스럽게 삭제할 수 없는 경우
정규화(Normalization)
란 데이터베이스의 테이블이 잘 만들어졌는지 평가하고, 잘 만들지 못한 테이블을 고쳐나가는 과정을 의미한다. 정규화
는 테이블을을 정규형(normal form)
이라고 불리는 형태에 부합하게 만들어 나간다.
1NF
,2NF
,3NF
, ...- 순서에 따라 규칙이 누적된다.
따라서 정규화
는 데이터 모델을 만들고, 데이터베이스에 구현하기 전에 적용하면 좋다.
테이블 안 모든 row의 모든 column 값들은 나눌 수 없는 단일 값이어야 한다.
전화번호 테이블을 따로 생성하여 여러 개의 전화번호를 저장하고 Foreign Key
를 사용하여 각 전화번호가 어떤 유저의 전화번호인지를 나타내면 된다.
함수의 종속성(Functional Dependency)
은 2NF
와 3NF
에서 사용되는 개념이며, 테이블 안의 Attribute
들 사이에서 생기는 관계를 의미한다.
만약 x의 값에 따라서 y의 값이 결정될 때, y는 x에 함수 종속성이 있다고 한다. 수학적으로는 x -> y
로 나타낸다.
또한 함수 종속성
은 반드시 하나의 컬럼에만 있어야하는 건 아니다.
함수 종속성에는 이행성
이라는 속성이 있다. 하나 이상의 Attribute
를 건너서 함수 종속성이 있는 경우를 의미한다. 이를 이행적 함수 종속성
이라고 한다.
Candidate Key
란 하나의 row를 특정지을 수 있는 attribute들의 최소 집합을 의미한다. 한 테이블에는 여러 개의 Candidate Key
가 있을 수 있지만, 하나의 Primary Key
만 있을 수 있다.
prime attribute
: Candidate Key에 포함된 모든 attribute들을 의미non-prime attribute
: Candidate Key의 일부가 아닌 모든 attribute들을 의미
테이블이 2NF
에 부합하기 위한 조건이 있다.
1NF
에 부합해야 한다. 즉, 테이블 안의 모든 값이 나눌 수 없는 단일 값이어야 한다.- 테이블에 candidate Key의 일부분에 대해서만 함수 종속성이 있는
non-prime attribute
가 없어야 한다.
- {user_id, product_id} -> Candidate Key
- {age, price} -> non-prime attribute
age와 price는 candidate Key의 전체 {user_id, product_id}가 아닌 일부에만 의존하고 있다. 2NF를 지키고 있지 못하는 모습이다. 어떻게 해결할 수 있을까 ❓
candidate Key의 일부분에만 의존하는 non-prime attribute
들을 따로 분리해준다.
2NF
에 부합해야 한다. (단일값
이어야 하고,non-prime attribute
가 아니어야 함)- 테이블 안에 있는 모든 attribute들은 오직
Primary Key
에 대해서만 함수 종속성이 있어야 한다.
id -> winner -> age라는 이행적 함수 종속성이 있기 때문에 3NF를 어기고 있는 모습이다. 어떻게 해결해야 할까 ❓
user 테이블이 존재한다면 winner를 name으로 변경하고 name, age를 user 테이블로 옮긴다. 그리고 user 정보를 알 수 있도록 user_id라는 Foreign Key
를 설정해준다.
비정규화
는 정규형에 부합하는 테이블을 정규형을 지키지 않도록 바꾸는 걸 의미한다.
정규화
는 속도가 느려지고 성능을 저하시킬 수 있다.비정규화
는 속도가 빨라지고 성능을 개선시킨다.