빠에야는 개발중

정규화 본문

공부/DB

정규화

빠에야좋아 2018. 3. 4. 23:53

정규화란?

정규화는 데이터베이스에서 일어날 수 있는 삽입, 삭제, 갱신 이상(anomaly)를 해결하기 위해 릴레이션을 적절하게 분리하는 작업을 말한다. 그리고 그 기준은 주로 “종속성”의 여부를 판단하는 것이 많다.

정규화의 단계

정규화는 총 1NF, 2NF, 3NF, BCNF, 4NF, 5NF까지 있고 각 단계는 직전 단계까지의 정규화를 만족해야하는 조건이 있다. 일반적으로 3NF까지 수행되었으면 정규화가 되었다고 말할 수 있게 된다고 한다. 그리고 현실적인 이유(join 등의 이슈) 때문에 일부분을 정규화하지 않는 경우도 있다.

1정규화

1정규화는 “각 릴레이션이 원자값을 가지는 조건”을 만족해야한다. 쉽게 보면 “중복값을 가지지 않는 것”이라고 말할 수 있지만 뉘앙스가 조금 다르고, “고유의 값을 가진다”라는 표현이 맞을 듯 하다.


예를 들어 다음과 같은 테이블에서 전화번호는 2가지 이상의 값을 가질 수 있고, 그렇게 되면 한 사람이 전화번호를 여러개 가지고 있다는 것을 표현하기 위해서 다른 컬럼의 정보들까지 요구된다. 만약 기본키가 여러 컬럼이라면 null값이 들어가게 되어 삽입 이상이 발생 하는 등 문제가 있다.


만약 이렇게 여러 컬럼으로 나누어 저장하는 방법을 생각했다고 하자. 이 때는 전화번호의 개수 제한, 중복 문제 등이 발생하여 좋은 방법이라고 할 수 없다.


1정규화를 수행하고 나면 다음과 같이 분리된다. 이렇게 하면 고객-전화번호 테이블에 레코드만 추가해주면 된다.

2정규화

2정규화는 “부분 함수 종속 관계를 가지지 않는 조건”을 만족해야한다. 부분 함수 종속이란 {A,B}라는 기본키를 가진 테이블에서 C라는 컬럼의 값이 A나 B 중 한가지로만 결정될 수 있는 경우이다.


다음 테이블에서 {종업원, 기술}이 후보키가 될 수 있는데, 근무지는 오직 종업원에만 종속한다. 따라서 이를 분리해주어야한다.


2정규화를 거치면 다음과 같다.


3정규화

3정규화는 “이행 함수 종속 관계를 가지지 않는 조건”을 만족해야한다. 이행 함수 종속 관계란 X->Y 일때 Y->Z인 경우이다.


다음과 같은 테이블에서 우승자를 변경하면 어쩔 수 없이 우승자의 정보들도 함께 갱신해주어야한다. 이런 이상을 방지하기 위해서 우승자의 이름을 기준으로 분리해줄 필요가 있다.


3정규화를 거친 테이블은 아래와 같다.


정규화의 단점

정규화를 거치면 테이블이 작아지고 개수가 많아진다. 따라서 조회를 할 때 join을 많이 쓰게 되는 등 데이터를 처리함에 있어서 성능 이슈에 부딪히게 된다. 따라서 자주 접근하는 테이블의 경우에는 정규화를 하지 않거나 일부만 정규화 하는(비정규화, 반정규화) 경우도 있다. 이럴 때는 정규화를 하기 전에 인덱스나 클러스터링을 사용하는 것을 고려해봐야한다.


참고 출처 : http://gomcine.tistory.com/entry/Database-9-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%95%EA%B7%9C%ED%99%94-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%B0%A9%EB%B2%95

'공부 > DB' 카테고리의 다른 글

Redis란?  (0) 2018.04.23
Comments