정규화
Last updated
Last updated
정규화란 데이터베이스 테이블 간에 중복된 테이터를 허용하지 않는 것을 말한다. 이를 통해 무결성을 유지하고 저장 용량을 줄일 수 있다.
정규화는 테이블을 어떻게 분해할지에 따라서 단계가 달라진다.
위에서 아래 형태로 분해하는 것이 제1 정규화다. 왼쪽은 여러 취미를 가지고 있는 행이 있기에 제1 정규화를 만족하지 못하고 있는 상황이다.
학생번호와 특강이름을 기본키로 가지고 있다. 이 기본키가 교수를 결정하고 있고, 교수는 특강이름을 결정하고 있다. 교수는 특강이름의 결정자이지만, 후보키는 아닌 상태다.
또한 위 경우엔 새로운 교수가 특정 과목을 담당하는 정보를 바로 추가할 수 없다. 왜냐면 적어도 한 명의 학생이 필요하기 때문이다. 정규화가 필요하다.
정규화의 추가 목적은 이상 현상을 제거하기 위해서 데이터베이스를 올바르게 설계하가는 것이다.
발생할 수 있는 이상 현상의 종류
삽입 이상 : 데이터를 삽입하기 위해 불필요한 데이터를 추가해야만 삽입이 가능한 상황
갱신 이상 : 전체 데이터 중 일부만 변경하여 데이터가 불일치하는 상황
삭제 이상 : 삭제로 인해 꼭 필요한 데이터까지 삭제되는 상황
위의 BCNF 정규화 과정에 대입해서 설명하겠다.
BCNF 정규화 전에는 위 3개의 이상현상이 모두 발상한다.
삽입 이상 : 학생이 없이는 새로운 특강을 추가할 수 없다. 적어도 한 명의 학생이 필요한 상황이다.
갱신 이상 : 김교수가 담당하는 소셜네트워크의 특강 이름이 변경되면 각 행을 모두 찾아서 변경해야 한다.
삭제 이상 : 502번 학생이 특강을 취소하면 박교수가 창업전략을 담당한다는 정보도 같이 삭제된다.
정규화 예시 참고 https://mangkyu.tistory.com/110
위 테이블은 학생번호, 강좌이름의 복합키를 기본키로 두고 있다. 강의실은 복합키 중 강좌이름에만 종속되기에 분해할 수 있다. 분해하면 아래 테이블과 같다.
학생 번호와 수강료는 이행종속 상태이지만, 둘 간의 관계는 없다. 이런 이행종속 상태는 아래의 테이블처럼 분해한다.
아래와 같이 정규화를 할 수 있다.
정규화로 데이터가 일관성을 가질 순 있지만, Join이 많아지고 요청 쿼리가 복잡해져 시간이 오래걸릴 수 있다. 상황에 따라서 역정규화를 통해서 조회 성능에 초점을 맞추는것이 좋다. 중복된 데이터를 처리하기에 쓰기 연산이 발생하겠지만, 조회가 많이 발생하는 부분에서는 역정규화가 필요하다. 예를 들자면, 집계 컬럼을 추가하여 다양한 정렬이 자주 쓰이는 페이징에서 연산 쿼리가 발생하지 않게 설계할 수 있다.