데이터 베이스 기본 (6)

오래간만의 강의 포스팅 입니다. 최근 맥에 관한 글을 몇 개 포스팅 하면서 심하게 딜레마에 빠졌습니다. 내가 과연 이 인기 없는 엑세스 강의를 계속 해야 하나. 이래서 나한테 도움이 되는 것은 무엇 인가. 이미 모든 자료는 내가 알아보기 쉽게 원노트에 다 정리해 두었는데. 차라리 시험 형식으로 컴활1급 문제 풀이나 해볼까? 오만 가지 생각이 다 들었지만 뿌리치고 돌아 왔습니다.

어디까지 했는지 까먹어서 잠시 내 포스팅을 보고 왔어요. ㅋㅋ 이번에 다룰 내용은 엑세스로 데이터 베이스를 만들 때 처음 하는 것이 테이블을 만드는 것이죠. 테이블 만들기는 엑세스를 처음 배울 때 하는 것이기 때문에 당연히 쉽죠. 그렇지만 쉽지 않습니다. 제가 응용 프로그램을 만들 때 가장 시간을 많이 보내는 것 중의 하나가 테이블 디자인, 필드 디자인과 관계 설정 입니다. 테이블을 만들 때 반드시 고려 해야 할 것이 오늘 소개해 드릴 데이터의 정규화 입니다.

 

  1. 1차 정규화 (First Normal Form 1NF)

    데이터를 저장하는 기본 저장 공간인 테이블의 기본키와 필드를 대충 설정하셨다면 바로 고민하셔야 할 것이 1차 정규화 과정 입니다. 1차 정규화는 쉽게 말해서 내가 만드는 테이블과 또 연관된 테이블의 셀에 반드시 무슨 일이 있어도 반드시 1개의 데이터만 가지게 테이블을 디자인 하는 것 입니다. 제가 드리는 예제에서 단 4개의 테이블 밖에 만들지 않았지만 모두 이 1차 정교화 과정을 고려해서 디자인한 테이블 입니다.

    제품 관리 테이블에서 가장 기본이 되는 것이 제품 정보입니다. 이렇게 6개의 필드로 구성되는 테이블을 만들었다고 해 봅시다.

     

    처음 데이터베이스를 접하고 1개의 테이블을 만들어 저장을 하기 시작 합니다. 필드를 더해 나갑니다. 제품이 고장이 나게 되고 고장 나고 수리 받은 정보를 제품 정보 테이블의 옆에다가 필드를 하나 더 생성해서 저장하려고 합니다.

     

    제품 정보 테이블에 제품이 고장 났던 정보를 저장 했습니다.

     

    여기 까진 괜찮습니다. 아직 1차 정규화를 위반하지 않았습니다. 그런데 갤럭시 S6가 또 고장 났다고 해봅시다. 이번엔 와이파이가 잡히질 않습니다. 어떻게 테이블에 추가 하실 것 입니까. 지난 시간에 배운 기본 키의 개념을 들면 갤럭시 S6 Edge 는 1개의 고유한 키를 가지고 있고 절대 반복 될 수 없습니다. 그렇다면 다음으로 생각하실 것이 행은 그대로 두면서 셀에 값을 추가 하는 것 입니다.

     

    이렇게 하나의 셀에 두 개의 정보를 입력 하였습니다.

     

    이것이 바로 1차 정규화 과정을 어긴 것이고 나중에 심각한 문제점을 야기 하게 됩니다. 데이터베이스가 얼마나 커질지는 아무도 모르고 테이블의 몇 개가 될지는 아무도 모릅니다. 그러나 반드시 지켜야 할 원칙은 하나의 필드와 하나의 레코드에는 반드시, 무슨 일이 있어도 반드시 1개의 값만 가져야 합니다.

     

  2. 1차 정규화의 해결

    1차 정규화를 어기지 않기 위해 갈 수 있는 쉬운 방법은 필드를 하나 더 추가 하는 것이죠.

     

    문제점2의 필드를 추가하여 1차 정규화를 시켰습니다.

     

    그러나 당장 볼 수 있는 문제가 또 생겼습니다. 바로 두 번 고장 나지 않았던 다른 제품들은 수많은 빈 셀을 생성하게 되었습니다. 문제점은 그 뿐만이 아니지요. 당장은 볼 수 없지만 생길 수 없는 문제로는 문제점 1에 대한 추가 정보를 넣고 싶습니다. 액정파손 수리비용, 문제점이 생긴 날 등, 이런 모든 정보를 추가해 주면 문제점 2도 똑 같은 개수의 필드가 필요하게 될 것입니다. 수많은 빈 셀과 테이블의 크기 등은 감당하기 힘들만큼 커질 수 있습니다.

     

    이 1차 정규화의 해결을 위해 사용하는 가장 현명한 방법이 바로 1개의 테이블을 추가하고 관계 설정을 맺어 주는 것 입니다.

     

    이렇게 제품의 고장 정보만을 담은 테이블을 하나 더 만듭니다.

     

    해당 수리 정보에 관한 정보는 모두 이 테이블에 기록 합니다. 하나의 수리 정보 데이터는 ServiceID라는 1개의 고유키를 가질수 있고 절대 반복되지 않습니다. 수리 제품 정보인 외래 키 AssetIDFK는 무한 반복이 가능하며 여기서 11은 갤럭시 핸드폰을 뜻합니다.

    이렇게 수리 정보에 대한 테이블을 따로 만들게 되면 각 수리에 해당하는 수리 점 이름과 전화번호, 비용 추가도 쉬워 집니다.

     

    그리고 이렇게 두 테이블을 관계 설정 해 주시면 됩니다.

     

    여기서 그렇다면 수리 정보를 입력할 때 내가 제품에 대한 번호를 외워야 하나면 그렇지 않습니다. 입력을 도와 주는 것이 바로 엑세스의 폼 기능이고 나중에 제이킴이 다 알려 줍니다. 또 두 개의 정보를 한번에 보고 싶다면 관계 설정이 되어 있기 때문에 매우 간단합니다.

     

    이렇게 말이지요. ServiceID, 와 AssetIDFK 는 거추장스럽죠 ?

     

     

    그렇다면 이렇게 가리면 됩니다. 매우 쉽게 할 수 있습니다.

     

    위의 갤럭시 S6는 반복 행이 아닙니다. 갤럭시 S6 의 제품 정보는 1개의 고유 키만을 가지고 있고 제품 수리 정보에 두번의 수리 정보가 들어가서 행에 두 번 나타난 것이지 갤럭시 S6의 해당 제품 정보는 반드시 1개 밖에 존재 할 수 없습니다.

     

    1차 정규화만을 일단 소개 해 드렸지만 2차 정규화와 3차 정규화도 지켜야 합니다. 단 두 개의 테이블만을 가지고 소개해 드렸지만 만약 테이블이 수십 개로 늘어난다면요? 제가 왜 데이터베이스의 제작 보다 설계에 많은 시간과 공을 드린다고 말씀 드렸는지 감이 오실 거라 믿습니다. 한번 잘못 설계된 데이터베이스는 나중에 수정이 매우 어렵습니다. 위에 처음 예제대로 하나의 테이블에 수리 정보를 기록했고 수 십만 건의 데이터 베이스가 쌓였을 때 수리 정보를 다시 하나의 테이블로 정리하는 과정을 거쳐야 한다면요? 나머지 테이블과의 관계 설정과 그 안에 저장된 수많은 계산식들을 모두 수정해 줘야 하고 얼마만큼의 오류가 생길지는 아무도 예측하지 못합니다. 다음 포스팅에는 2차 정규화 과정을 소개해 드리겠습니다.

+ Recent posts