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


9강. 비정규테이블의 정규화 - 1 

이미 정규화 되어 있지 않은 테이블에 자료가 들어 있는 경우 제1 정규형 테이블로 만드는 작업을 해야 할 경우가 종종 있습니다. 대표적인 예로 설문조사를 들 수 있습니다. 대개 엑셀을 이용하여 수많은 설문조사 항목을 각각의 열로 나열하고 설문조사 내용을 좌우로 옮겨다니면서 입력하더군요. 엑셀의 간단한 데이터베이스 기능을 이용하기도 하지만 그러나 액세스를 이용하여 관리한다면 훨씬 손쉽게 할 수 있습니다. 

이전 강좌에서 올린 예제 파일에서 고객정보에 대한 테이블을 가지고 갱신(업데이트)질의와 테이블작성 질의를 이용하여 정규형 테이블로 만드는 방법을 설명하도록 하겠습니다.

이 내용은 초보자들에게는 조금 어려울 것으로 생각됩니다. 물론 건너 뛰어도 됩니다.

최소 정보 단위로 쪼개기

1. '고객정보-비정규화' 테이블을 복사하여 '고객정보' 테이블로 저장합니다.
2. 저장된 고객정보 테이블을 디자인 보기로 열어 다음과 같이 테이블 구조를 수정합니다.
그리고 수정된 테이블을 복사해서 '고객정보-수정본' 이라는 이름으로 백업해 둡니다.

필드명

 형식

 크기 

CustomerID

  Text 

  5 

CompanyName

  Text 

  40 

ContactName

 Text

  20

ContactTitle 

 Text

  30 

Address

 Text

  100

City 

 Text

  15 

Region

 Text

  15 

PostalCode

 Text

  10 

Country

 Text

  15 

Phone

 Text

  100

Fax

 Text

  24 

3. 빈 질의테이블을 하나 만듭니다. 
질의테이블 마법사에 대해서는 도움말이나 무료강좌를 찾아보시면 있을 겁니다.
1) <질의 새로 만들기>를 하고 디자인 보기를 선택한 다음 테이블을 추가하지 않은 빈 질의테이블을 하나 만듭니다. 

2) 도구모음 메뉴에서 SQL보기를 클릭하여 SQL창을 엽니다.

09-02.gif(20562바이트)

업데이트 질의 이용

주의 > 아래의 갱신 질의는 한번만 실행해야 합니다. 두 번 실행하면 필드 내용이 지워집니다. 물론 그렇게 되지 않도록 할 수 있지만 이러한 실행질의는 항상 조심해야 함을 명심시키기 위한 것입니다. 그런 경우 위에서 만들어 둔 '고객정보-수정본' 파일을 복사하여 '고객정보' 테이블로 저장하면 됩니다.

1. 담당자 필드를 담당자 이름과 직위로 나누기
위와 같은 방법으로 빈 질의테이블을 만들고 SQL창을 연 다음 다음에 적힌 질의문을 복사해 넣은 다음 '제1정규화-담당자 Query' 이름으로 저장합니다.

UPDATE 고객정보 
SET 고객정보.ContactName = Left([ContactName],InStr([ContactName],"(")-1), 
고객정보.ContactTitle = Mid([ContactName], InStr([ContactName],"(")+1, Len([ContactName])-InStr([ContactName],"(")-1);

2. 디자인 보기로 전환하면 다음과 같이 보입니다. 아래 나머지 질의테이블로 SQL창에 질의문을 입력하고 디자인 보기로 전환하여 한번씩 보십시오.

09-03.gif(30208바이트)

3. 주소 필드를 나누기
같은 방법으로 질의테이블을 하나 만들고 다음 SQL창을 열고 다음의 질의문을 복사해 넣은 다음 '제1정규화-주소 Query' 이름으로 저장합니다. 여기서는 질의에 사용자 정의함수를 사용합니다. VBA모듈에서 SplitAddress() 사용자 정의 함수를 확인하십시오.

UPDATE 고객정보 
SET 고객정보.Region = SplitAddress([Address],"도"), 
고객정보.City = SplitAddress([Address],"시"), 
고객정보.Address = SplitAddress([Address],"동리"), 
고객정보.PostalCode = SplitAddress([Address],"우편번호");

4. 전화번호 필드를 나누기
질의테이블을 하나 만들고 다음 질의문을 복사해 넣은 다음 '제1정규화-전화 Query' 이름으로 저장합니다.

UPDATE 고객정보 
SET 고객정보.Phone = Left([Phone],InStr([Phone],",")-1), 
고객정보.Fax = Trim(Mid([Phone],InStr([Phone],",")+1));

5. 이제 질의를 실행시키면 됩니다. 질의를 실행 시킬 때는 질의 디자인 모드에서 메뉴에서 질의실행 버튼 을 클릭하거나 [F11] 키를 눌러 데이터베이스 창을 불러낸 다음 방금 저장한 질의테이블 개체를 더블 클릭하면 원하는 갱신작업이 이루어 집니다.

09-05.gif(17729바이트)

주의 > 한번만 실행해야 합니다. 두 번 실행하면 필드 내용이 지워집니다. 만약 오류가 발생하면 이전에 만들어 둔 '고객정보-수정본' 파일을 복사하여 '고객정보' 테이블로 저장하면 됩니다.

6. 결과는 다음과 같습니다.

09-06.gif(26722바이트)

7. 비어 있는 국가명 필드에는 '대한민국'으로 채워 넣도록 합니다. 역시 앞서 했던 대로 '질의 새로 만들기'를 클릭한 다음 SQL창에 다음 질의를 넣고 실행하면 되겠습니다.

UPDATE 고객정보 SET 고객정보.Country = "대한민국";

테이블 생성 질의 이용

1. 질의 새로 만들기에서 디자인 보기로 빈 질의를 만듭니다.
2. 질의디자인 도구모음 메뉴에서 SQL보기 메뉴를 클릭하여 SQL창이 뜨면 다음 내용을 복사해 넣고 디자인 보기/데이터시트 보기로 전환하여 확인하고 나서 역시 실행버튼을 눌러 실행시키면 새로운 테이블이 만들어 집니다.

SELECT 고객정보_비정규화.CustomerID, 
고객정보_비정규화.CompanyName, 
Left([ContactName],InStr([ContactName],"(")-1) AS ContactName2, 
Mid([ContactName],InStr([ContactName],"(")+1,Len([ContactName])-InStr([ContactName],"(")-1) AS ContactTitle, 
Left([Phone],InStr([Phone],",")-1) AS Phone2, 
Trim(Mid([Phone],InStr([Phone],",")+1)) AS Fax
SplitAddress([Address],"도") AS Region, 
SplitAddress([Address],"시") AS City, 
SplitAddress([Address],"동") AS Address2,
SplitAddress([Address],"우편번호") AS PostalCode, 
"대한민국" AS Country 
INTO 고객정보_2 
FROM 고객정보_비정규화;

다음 강좌에는 설문지 테이블을 예제로 정규화하는 것을 알아 보도록 하겠습니다.

 

  목차 | 이전 | 다음