기본에 충실하자.

SQL Server 2009. 6. 14. 01:12
  무슨 얘기냐 하면... DB 정규화 얘깁니다.
정규화란 무엇인가 와 같은 얘기가 아니라.. 그냥 정규화와 관련된 일화를 얘기하고자 합니다.

  처음에 누가 설계했는지 모르지만 정말이지 X판 5분전이라고 해도 틀리지 않을 정도로 DB가 엉망인 제품이 있습니다. 
테이블마다 정규화가 한개도 안되어 있어 인사정보, 위치정보 등 테이블이 따로 있는데도 이 테이블들을 참조하는 모든 테이블에 인사정보,부서정보,위치정보 등의 값이 다시 들어있습니다. 성능 때문이라고 하는데 성능을 그렇게 중시하는 DB에서 조인하는 필드에 인덱스가 한개도 없습니다. ㅜ.ㅜ  뭐 제품이 처음에 어설프게 시작한 다음에 자꾸 기능을 확장하다 보면 이런 일이 생기긴 하지만.... 이해가 안되는 건, 기존 버젼의 제품을 버리고 신제품을 다시 만들었는데... 기존 DB 구조가 그대로 남아있다는 거죠. (그냥 varchar를 nvarchar로 바꾼것 밖에 없더군요 아놔)

  이런 식으로 테이블이 300개가 넘을 때까지 시스템을 확장하다 보니 무슨 일이 생기느냐...
하루에 한번씩 부서전배나 위치정보 변경사항을 이 데이터들을 참조하는 테이블에 Update 시켜주어야 합니다.
그런데 테이블이 너무 많아지다보니 자꾸 배치작업때 누락되는 테이블들이 생깁니다. 어느 순간부턴가 변경된 정보가 반영되지 않는다는 고객 문의가 들어오기 시작하고 데이터 무결성때문에 생기는 문제들이 여기저기서 터지기 시작할 땐... 때는 이미 늦은 거죠.

  경우에 따라서는 비정규화되어야 하는 테이블도 있습니다. 대표적인 예가 로그테이블입니다. 예를 들자면, 로그테이블에는 "사번"만 들어가는 게 아니라 로그가 발생한 시점에서의 "이름" "부서명" 등이 함께 들어가야 합니다. 왜냐하면 로그는 발생 시점의 "스냅샷"이기 때문이죠. (로그에 기록된 사용자가 퇴사한다고 해서 이 로그가 사라지면 안되잖아요??) 그런데 이 시스템의 로그테이블은 또 기가막히게 정규화가 되어 있습니다. 디비쪼우기의 진수를 보여주고 있죠. 이러다 보니 홍길동이 PC를 사용하면서 발생한 로그를 홍길동이 퇴사하고 나면 조회할 수 없거나, 조직 개편 후 로그가 통째로 증발하는 경우(!), PC를 성춘향에게 양도하게 되면 로그도 성춘향의 로그로 바뀌어 버리는 경우 등 어처구니 없는 일이 생깁니다. 

  이러한 DB 설계 상의 문제들이 가지고 있는 공통점은 바로 "고치는데 시간이 무지 오래 걸린다"는 겁니다. 시스템이 좀 커진 다음에 문제가 발생된다면... 고치긴 거의 불가능이죠. ㅡ.ㅡ
그래서... DB 설계에 관해서는 "처음에 제대로 하는 것"이 진리입니다. 이 테이블이 정규화되어야 할지 비정규화되어야 할지 깊이 생각해야 하고, 만약 비정규화된다면 그 사유가 테이블 정의서에 기록되어 관리되어야 합니다. 특히 로그테이블과 같은 경우에는 데이터가 많이 때문에 나중에 스키마를 수정하기가 매우 어렵습니다. 설계할 때 두번 세번 고민하고 여러 사람의 검토를 거치는 것이 좋습니다. 혹시 빼먹은 컬럼이 없는지, 지금은 필요없지만 나중에 추가될 가능성이 있는 컬럼은 없는지 검토해야 합니다. 만약 확실한 자신이 없다면 nvarchar 타입으로 Reserved 컬럼을 두어 개 쯤 만들어 놓는 것도 좋은 방법입니다. (천억건의 로그가 들어있는 테이블에 컬럼 하나 추가한다고 생각해보십시오... 끔찍합니다. ㅡ.ㅜ)

  정규화해야 할지 비정규화해야 할지 판단이 잘 서지 않는다면, 원 데이터가 수정되거나 삭제되는 경우를 가정해보면 됩니다. 원 데이터가 수정/삭제되었을 때 이를 참조하는 레코드가 함께 수정되거나 삭제되어야 한다면 이것은 정규화해야 하는 경우입니다. (대부분 이 케이스입니다.) 
  물론 성능을 고려해 비정규화 해야 하는 경우도 있습니다만, 정규화해야 할 테이블에 성능 문제로 비정규화를 하더라도 "우리는 사용자 정보에 한해서만 비정규화를 한다"와 같은 명확한 기준을 가지고 진행하는 것이 중요합니다. 그렇지 않는다면 시스템이 커지면서 여기저기 비정규화된 부분들이 무분별하게 생기게 되고 나중에는 소위 말하는 "누더기"로 전락하게 됩니다.

  누구나 얘기하듯이 기본을 지키는 것은 중요합니다. 그것이 중요한 것은 기본을 지키면 이득이 있기 때문이 아니라 지키지 않았다가 문제가 생기면 수습하기 위해 몇배의 노력이 필요하기 때문입니다. 


Posted by kuaaan
,


사랑합니다. 편안히 잠드소서