이상 현상(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를 설정해준다.


비정규화는 정규형에 부합하는 테이블을 정규형을 지키지 않도록 바꾸는 걸 의미한다.
정규화는 속도가 느려지고 성능을 저하시킬 수 있다.비정규화는 속도가 빨라지고 성능을 개선시킨다.