정규화, 역정규화란 무엇일까?

정규화는 데이터를 중복되게 관리하지 않기 위한 방법이다. 그렇게 함으로써 데이터의 일관성(Consistency)을 높일 수 있고, 모델의 응집도(Cohesion)을 높여 객체지향 설계에 더 가까워진다.

역정규화는 성능향상을 위해 일부로 데이터를 중복된 상태로 만드는 방법이다.

학생의 담당지도교수를 관리하는 테이블을 예로 하나씩 살펴보자.

http://www.gitta.info/LogicModelin/en/html/DataConsiten_Norm2NF.html

1. 정규화는 일관성(Consistency)을 높인다.

데이터가 한 곳에서만 관리된다는 건 변경할 때도 한 곳만 수정해줘도 된다는 장점이 있다.

반대로 데이터가 중복되어 여러 곳에 흩어져있으면 변경할 때 그 모든 테이블에 변경사항을 똑같이 적용해줘야 한다.

그렇지 않으면 변경사항이 일부 테이블에만 반영되서 데이터 일관성이 흐트러질 수 있다.

예를 들어 교수가 개명을 했다고 하면 그 교수의 ROW를 모두 찾아 100개면 100개 전부를 수정해줘야 한다. 하나라도 수정되지 않으면 데이터의 일관성이 깨질 수 있다(어떤 ROW는 개명전 이름이, 어떤 ROW는 개명 후 이름이 남아있을 수 있다). 정규화된 모델에서는 Professor에서 딱 한 ROW만 수정하면 된다. 일관성을 보장하기가 더 쉬워지는 것이다.

2. 정규화된 테이블이 객체지향적인 설계에 더 가깝다.

객체지향에서 관심사를 분리하는 것은 매우 기본적이다. 관심사를 분리함으로써 서로간의 결합(Coupling)을 낮출 수 있다(한 객체의 변경이 다른 객체에 영향을 미치지 않게 한다).

정규화 전 모델에서 교수에 관한 컬럼이 하나 추가된다고 하면 Students도 영향을 받게된다. 정규화 된 모델에서는 개별로 관리되므로 Professors의 변경이 Students에 영향을 주지 않는다. 변경에 더 자유롭고, 유지보수하기 쉬워진다.

3. 정규화를 통해 일관성을 얻는 대신 JOIN 비용이 증가한다.

해당 테이블에 정보가 없으므로 다른 테이블과 JOIN을 통해 정보를 가져와야 한다. 대용량 데이터를 처리하는 경우 JOIN으로 인한 성능저하는 큰 문제가 될 수 있다. 이런 경우 데이터가 INSERT후에 변경되지 않을 데이터(예를 들면 로그성 데이터)라면 일관성이 문제가 되지 않으므로 차라리 역정규화를 해서 JOIN을 없애 성능향상을 가져갈 수 있다.

+ Recent posts