안녕하세요. 이성필 입니다.

정규화에 대해서 설명을 시작하기는 했는데... 마무리가 힘드네요.
지난 번에 1차 정규형에 대해서 이것 저것 써보았습니다만... 전통적인 모델링 책에서의 내용에서 빠지는 부분도 언급하지 않는 부분도 있을 듯 합니다.

이유는... 앞서 말씀드렸듯이 개인적으로 의미를 느낀 부분에 대한 언급만 하고 싶어서 입니다. 그리고 그런 감상들을 비슷한 고민을 했던 분들과 이야기하고 싶어서 입니다. 매우 부족하지만... 시작을 했으니... 계속 써보겠습니다.

정규형 이전에 가장 중요한 것은 엔티티의 선정이라고 생각됩니다. 
앞서 기술한 바와 같이 엔티티의 정확한 선정은 이후 전체 논리 모델의 모습과 정규화 과정에 가장 크게 영향을 미치게 됩니다. 요구되는 비지니스 모델 아래에서 엔티티의 정확한 정의는 이후 정규화에 대한 기준이 됩니다.

다시 한번 정규화에 대한 정의를 언급하면 아래와 같습니다.
제1 정규형 (1NF) : 모든 속성은 반드시 하나의 값을 가져야 한다. (+ 레코드들은 서로간에 식별 가능해야 한다)
제2 정규형 (2NF) : 1정규형을 만족하며, 식별자가 아닌 모든 속성은 식별자 전체 속성에 완전 종속되어야 한다.
제3 정규형 (3NF) : 2정규형을 만족하며, 식별자를 제외한 나머지 속성들은 모두 독립적이다.

1 정규형의 기본적인 요건을 만족하지만, 2 정규형 및 3정규형을 불만족하는 상황이 종종 발생하게 됩니다.
2 정규형으로 정규화하는 모습에서 자주 소개되는 예제 중 하나로 '학과등록' 이라는 엔티티를 소개합니다.
이 엔티티에는 학번, 코스번호, 평가코드, 평가내역, 코스명, 기간 으로 이루어져 있습니다.
아래와 같이 표현하고자 합니다.
[학과등록] (학번#, 코스번호#, 평가코드, 평가내역, 코스명, 기간)
이 엔티티는 학번, 코스코드를 식별자로 가지는 엔티티 입니다.
이 엔티티에 대해서 2차 정규화를 한 결과를 아래처럼 2개의 엔티티의 분리로 설명합니다.
[학과등록](학번#, 코스코드# 평가코드, 평가내역)
[코스](코스코드#, 코스명, 기간)
그리고 위의 2차 정규화 결과로 아래의 3차 정규화를 설명하면서 다시 엔티티를 분리합니다.
[학과](학번#, 코스코드#, 평가코드)
[코스](코스코드#, 코스명, 기간)
[평가항목](평가코드#, 평가내역)

개인적으로 이 과정에서 느낀 점은 정규화가 진행되면서 엔티티의 개수 및 정의가 변한다는 것 입니다.
조금 다르게 표현하자면...
"1, 2, 3 정규화 과정을 거치면서... 
요구되는 비지니스 모델을 구성하고 있는 형태의 엔티티 정의와 구성이...
관계형 데이터베이스에 어울리게 재구성된다"
는 것입니다.

결국 최초 요구사항을 관계형 데이터베이스에 알맞은 형태로 엔티티를 정의했다면 정규화 과정을 건너뛰게 된다는 것입니다.
그래서 첫번째 글에서 언급했듯이... 논리모델의 정규화 과정을 '확인' 하는데 많이 사용한다고 했던 것이 이러한 의미였습니다.
제 경우는 엔티티 정의의 분해와 통합을 거치면서... 정의한 엔티티의 의미에 더함과 모자람이 없는지 고민하는 과정에서 시간을 많이 사용하는 편입니다.

다른 분들이 비슷한 작업을 하면서 거치는 과정은 어떨지 궁금합니다.
논리 모델 단계에서의 고민들에 대해서 함께 이야기 해보았으면 해서 이런 글을 올립니다.





profile