배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Access 버전:   공통
검색어:   정규화, 테이블, 비정규
제목:   정규화된 테이블을 비정규로 표현하는 방법
     
 

STEP
  STEP> 따라하기

※ 오늘 Daily Tip은 최천군(Crocii)님이 제공해주신 내용입니다.


오늘은 사용자 정의 도메인 함수에 대해 설명하기로 하였으나 그전에 다른 부분을 먼저 살짝 짚고 넘어가도록 하겠습니다. 정규화 된 테이블을 비정규로 표현하는 방법에 대해 알아보도록 하겠습니다

테이블은 정규화 테이블인데 폼은 사용자의 편의상 비 정규화 되야 할 경우가 있습니다. 예를 들어, 전화번호 관리 프로그램을 만든다고 할 때, 일반적으로 엑셀의 경우 다음과 같이 작성하게 됩니다.

성명 집전화 집팩스 회사전화 회사팩스

휴대전화

배병렬 251-5458  151-1512  125-4857    
최천군 123-4567 123-4569  456-7890 456-7899 010-123-4567

하지만 위와 같이 기록하면 문제점이 있습니다. 예를 들어, 회사전화 번호가 여러 개가 있다면 하나의 번호밖에 기록하지 못하거나 필드를 아래와 같이 더 생성해 줘야 합니다.

성명 집전화 집팩스 회사전화 회사번호1 회사팩스

휴대전화

배병렬 251-5458  151-1512  125-4857      
최천군 123-4567 123-4569  456-7890   456-7899  

액세스에서는 이렇게 비 정규화 된 테이블을 아래처럼 정규화 해주어 필드를 추가하거나 삭제하지 않아도 되도록 만들어 줍니다.

성명 구분 전화번호
배병렬 집전화 251-5458
배병렬 집팩스 151-1512
배병렬 회사전화 125-4857
최천군 집전화 123-4567
최천군 집팩스 123-4569
최천군 회사전화 456-7890
최천군 회사팩스 456-7899
최천군 휴대전화 010-123-4567

덧붙이자면 성명이 들어갈 테이블 하나와 전화번호가 들어갈 테이블 하나를 따로 위와 같이 만들어 성명테이블의 기본키를 전화번호 테이블의 외래키로(예를 들면 성명) 연결하면 정규화가 완성 됩니다

그런데 위와 같은 테이블을 폼으로 만들면 아래와 같이 만들 수 밖에 없습니다.

사용자는 일일이 구분란에 어떤 전화인지 기록하고 그에 해당하는 전화번호를 입력하는 일이란 불편하기 짝이 없습니다. 그렇다면 다시 테이블을 비정규화 시키는 수밖에 없을까요? 아닙니다. 폼을 비정규화 시켜 줄 수 있습니다.(급조한 폼이라 조악합니다. ^^;)

<1> 위의 폼의 왼쪽 박스에 있는 공란에 전화번호를 기록하면 자동으로 구분 필드와 전화번호 필드를 채워줍니다. 집전화 입력란에 번호를 입력하면 구분 필드에 "집전화"라는 문자와, 전화번호 필드에 기록한 번호가 들어갑니다.

각 입력란의 After Update 이벤트를 이용하였고 내용은 다음과 같습니다.

Sub addPNum(PDiv As String, PNum As String)
    DoCmd.GoToRecord , , acNewRec
    Me!
구분 = PDiv
    Me!
전화번호 = PNum
    Me.Refresh
End Sub 

Private Sub Text10_AfterUpdate()
    addPNum ActiveControl.Tag, ActiveControl.Text
End Sub

아주 간단합니다. 이에 대한 설명이 필요하시면 다음 기회에 자세히 설명해 드리겠습니다

<2> 아래쪽의 박스 안에는 위에 없는 구분내용 즉 입력빈도가 낮거나 새로운 내용이 들어갈 때 사용됩니다. 예를 들면 구분필드에 '회사휴대폰' 이라는 새로운 항목을 넣고 그에 따른 번호를 기록할 때 사용합니다.

<3> 오른쪽 박스의 입력란들은 가장 마지막에 기록된 번호를 보여 주며 컨트롤 원본은 다음과 같습니다.

=DLast("전화번호","Phon","pplcode = " & [pplcode] & " And 구분 = '집전화'")

지난번의 팁처럼 중간에 쿼리를 넣어 조건을 미리 걸러 주고 적은 레코드를 함수로 계산시키면 효율적입니다. 쿼리는 크로스탭 쿼리를 사용하여도 좋을 것 입니다.

<1> 쿼리의 디자인 보기에서 마우스 오른쪽 버튼을 클릭하여 크로스탭 쿼리를 선택한 다음 아래와 같이 작성합니다.

<2> 마우스 오른쪽 버튼을 클릭하여 맨 아래에 있는 '속성' 항목을 클릭합니다.

<3> '열 머리글' 항목에 필드로 표시되기 원하는 항목들을 적어 줍니다.

<4> 데이터시트 보기를 하시면 아래와 같이 비정규화 필드가 생성되면서 한 눈에 내용을 파악할 수 있습니다.

<5> 쿼리를 저장하고 텍스트박스에서 함수를 사용하여 쿼리를 부르면 됩니다.

=DFirst("집전화","쿼리이름") 

물론 오른쪽 빨간 박스 안의 입력란들은 목록상자나 콤보상자를 이용하는 것이 더 좋습니다. 텍스트 박스의 가능성을 알려드리는 팁이라서 텍스트박스로 만들었습니다

오늘의 팁의 핵심은 정규화 된 테이블을 비정규화로 표현하거나 입력되게 할 수 있다는 것입니다. 방법은 이번 팁에 소개시켜 드린 방법 말고도 여러 가지 세련된 방법이 있을 것 입니다. 그러니 폼을 위해 테이블을 비정규화 하시지 말라는 것입니다. 

[참고] 위의 텍스트 박스 문제점

<1> 아무래도 느립니다.
<2> 마지막 번호만 보여주니 그 이전에 몇 개의 번호가 입력되어 있으며 그 내용이 뭔지 알 수 없습니다. 첫번째 값이나 마지막 값은 함수를 사용하여 구할 수 있으나 중간의 번호들은 찾을 수 없습니다. 

※ 다음 번 팁에 위의 문제점을 DAO를 이용하여 해결 해보도록 하겠습니다.