배움터  
  HOME > 배움터 > 무료강좌
무료강좌
 
액세스 2000, 김규경님의 데이터베이스 기초 다지기 - 11강. 제 2 정규화 #1, Access 2000


11강. 제 2 정규화 #1

자료 다운로드 : 제 2 정규화.mdb
자료 다운로드 : 제 2 정규화_97.mdb

제1정규형은 테이블의 필드에 하나의 정보단위만 들어가도록 하는 작업입니다. 이번에 말씀드릴 제2 정규형은 테이블에 레코드 사이에 반복되는 정보를 가진 레코드가 없도록 하나의 주제만 가지는 테이블을 만드는 작업입니다. 그리고 다음 강좌에 언급할 제3정규형은 불필요한 필드를 없애는 작업이라고 생각하시면 됩니다.

제2 정규형의 정의
기본키 필드를 중심으로 나머지 필드들은 기본키 필드에 매여 있어야 한다.

제2 정규형의 테이블에서 필드들은 기본키에 기능적으로 종속관계를 가져야 합니다. 다시 말해 기본키는 레코드에서 유일한 값이고 그 값이 바뀌면 관련 필드의 값들이 동시에 바뀌게 된다는 말입니다. 따라서 필드 내용이 중복되는 상황이 없어지게 됩니다. 여기서 중복이란 단순히 산술적으로 중복되는 것을 의미하지는 않고 역시 기능적으로 중복되는 것을 말합니다.

제2정규화는 기본키/고유키 필드를 중심으로 판단을 하기 때문에 일단 기본키 또는 기본키로 삼을 필드로 정렬을 해보면 알 수 있습니다. 일단 정렬을 한 후 값의 중복(반복)이 보이면 제2 정규화를 해야 할 상황이라고 생각을 하십시오.

예제 파일에서 [제1정규화테이블]을 열고 내용을 살펴보도록 하겠습니다. 이 테이블은 제품의 판매 정보를 가지고 있습니다. 따라서 [제품 이름] 필드(열)로 자료를 정렬해 봅시다. 레코드 별로 중복되는 정보가 보일 겁니다.
제품이름, 구입단가, 회사이름, 담당자, 제품분류 필드의 내용이 중복되고 있습니다. 이 필드들은 모두 제품에 대한 기초정보들이군요. 그리고 제품이름에 따라 필드의 정보가 변하는 기능적으로 종속된 정보의 집합입니다. 따라서 제2정규화의 원칙에 의해 이 정보(필드)들은 따로 테이블로 분리할 수 있습니다. 이 테이블의 주제는 [제품정보]가 되겠습니다.

또 나머지 필드(판매일, 판매수량, 판매단가 등)는 제품의 판매에 대한 정보들입니다. 이 필드들로 구성된 테이블의 주제는 어떤 제품의 [판매정보]가 되겠습니다.

키 포인트
제2 정규화는 위에서 아래로 데이터의 중복을 확인한 다음 필드의 종속성을 따진다.

이제 하나의 테이블을 제2정규화 작업을 통하여 두 개의 테이블로 분리해보도록 하겠습니다.

제 2 정규화 실습-1

[준비]
예제 파일은 제가 작업을 했던 파일로 실습을 통해서 만들어지는 결과를 비교하십시오. 따라서 실습을 하기 위해선 먼저 예제 파일을 복사하여 적당한 이름으로 실습용 파일을 만들고 그 파일을 열고 [제1정규화테이블]이란 이름의 테이블만 남기도 모든 테이블과 질의테이블을 삭제합니다.

테이블의 구조를 변경할 때는 항상 원본 테이블은 백업해 두고 복사본을 이용하여 새로운 두 테이블로 떼어내도록 합니다. 순간적으로 귀중한 자료를 잃어버릴 수 있다는 것을 명심하십시오.

하나의 테이블에서 떼어져 나온 테이블은 서로 관련이 된 내용이므로 관련을 시킬 필드가 각각의 테이블에 존재해야 된다는 것을 염두에 두십시오. 이 예제에서 두 테이블의 관계에 사용되는 필드는 [제품이름]이 됩니다. 그러나 [제품이름]을 그대로 기본키로 사용하기에는 부적절합니다. 이 부분에 대해서는 뒤에서 설명하겠습니다.

다음과 같은 순서로 제2 정규화를 시도합니다.

1. [판매정보]용 테이블 만들기
[제1정규화 테이블]을 복사하여 [판매정보_2NF]이름으로 저장한 다음 디자인 보기로 열고 [제품이름], [판매일], [판매수량], [판매단가], [비고] 필드만 남기고 다른 필드는 삭제합니다.

2. [제품정보]용 테이블 만들기
[제품정보] 테이블로 떼어내려는 자료는 중복이 되는 부분이므로 각 제품별로 하나의 레코드만 남기고 나머지는 삭제를 해야 하는데 이것을 수작업으로 하는 것은 좋은 생각이 아닙니다. 질의를 이용하여 테이블을 새로 만드는 것이 좋습니다.
질의개체 탭에서 ‘새로 만들기’를 클릭하여 하고 [제1정규화테이블] 테이블을 선택하고 디자인 보기로 질의 테이블을 연 다음 [제품이름], [단가], [회사이름], [담당자], [제품분류] 필드를 포함시킨 후 쿼리 속성 창을 열고 [고유 값] 속성을 ‘예’로 설정합니다.

3. 질의 디자인 모드에서 메뉴 중 [질의] – [테이블 생성 쿼리]를 클릭하고 ‘제품정보_2NF’라고 입력하고 대화 창을 닫은 다음 질의 실행 버튼을 눌러 질의를 실행하면 [제품정보_2NF] 테이블이 만들어 집니다.
(예제 파일에서는 이 질의의 내용이 [제폼정보_2NF 테이블 생성 Query]라는 이름으로 저장되어 있습니다.)

4. 이제 만들어진 두 테이블을 다시 한번 살펴보고 기본키와 외래키를 확정하도록 합니다.

[제품정보_2NF] 테이블 확인하기
테이블이 만들어지면 항상 기본키, 고유키, 인덱스 키를 만들어 주어야 합니다.
[제품정보_2NF] 테이블은 [제품이름]은 고유 인덱스를 만들어 고유키로 사용합니다. 그러나 기본키로 하기에는 필드의 크기가 너무 큽니다. 대개 이름에 해당되는 필드는 기본키로 사용하지 않습니다. 결국 기본키로 사용할 제품 코드를 만들어서 사용해야 하는데 의미 있는 코드를 만들기는 어려울 것 같습니다. 따라서 일련번호 기본키를 사용하도록 합시다.

필드 이름을 [제품ID]로 주고 형식을 일련번호로 주시고 열쇠 아이콘의 버튼을 눌러 기본키로 설정해 줍니다. [제품이름]은 고유해야 하므로 고유인덱스를 만들어 줍니다. 다른 필드도 적절하게 인덱스를 만들어 주십시오.

[판매정보_2NF] 테이블 확인하기
판매 정보테이블의 경우 기본키는 어떻게 정하는 것이 좋을까요?
역시 일련번호 기본키가 좋겠습니다. 테이블을 디자인 보기로 열고 [판매ID] 필드를 만들고 필드 형식을 일련번호로 정하고 기본키로 만들어 줍니다. 그러나 아직 끝나지 않았습니다. 중요한 작업이 남아 있습니다.

기본키-외래키 연결시키기
[판매정보_2NF] 테이블과 [제품정보_2NF] 테이블은 [제품이름]으로 관계가 이루어 지는데 [제품정보_2NF] 테이블에서 제품이름을 기본키로 사용하기는 부적절하여 제품이름에 합당하는 고유한 코드 즉, 일련번호 형식의 ID 필드를 추가하여 기본키로 잡았기 때문에 [판매정보_2NF] 테이블에도 이와 상응하게 [제품이름] 대신 제품ID(일련번호) 값을 넣을 필드가 있어야 합니다. 따라서 [제품ID]라는 이름으로 숫자 필드를 하나 추가합니다.

문제는 제품이름에 해당되는 제품번호를 입력해야 하는데 하나 하나 입력한다는 것은 무리입니다. 그리고 입력할 때 잘못 입력할 수도 있을 겁니다. 업데이트 질의를 이용하여 일괄 수정을 하도록 합니다.

‘디자인 보기로 새 쿼리 만들기’를 클릭하여 테이블을 포함시키지 말고 빈 질의 테이블을 하나 만들고 역시 SQL창을 열고 다음과 같이 입력하고 붉은 느낌표 아이콘의 실행 메뉴버튼을 눌러 자료를 갱신합니다.

UPDATE 판매정보_2NF
INNER JOIN 제품정보_2NF
ON 판매정보_2NF.제품이름 = 제품정보_2NF.제품이름
SET 판매정보_2NF.제품ID = [제품정보_2NF].[제품ID];

관계설정 창을 열고 다음과 같이 무결성 강화를 하여 두 테이블의 관계를 설정해 줍니다. 제품정보의 레코드를 삭제하더라도 [판매정보] 자료가 같이 삭제되지 않도록 [관련 레코드 모두 삭제] 옵션은 체크하지 않습니다.

테이블 분리 확인하기
지금까지 작업이 순조롭게 이루어 졌다면 [제품정보]와 [판매정보] 테이블과 같이 될 겁니다. 이제 이 두 테이블을 조인하여 [제2정규화 확인 Query] 과 같은 질의를 만든 다음 나누기 전 원본 테이블인 [제1정규화테이블]과 비교하여 같은 결과가 나오는지 확인합니다.
확인이 되었으면 [판매정보_2NF] 테이블에 있는 제품이름 필드는 필요 없으므로 제거합니다.

5. 그리고 추가적으로 분리해야 할 부분은 없는가? 또는 조회필드로 사용할 부분은 없는가? 확인합니다.

 

 

  목차 | 이전 | 다음