RSS듀오랩스
데이터베이스 설계

공통 코드와 기준정보(마스터 데이터) 구분하기

작성자
듀오랩스 대표·5분 읽기

공통 코드 표에 「설비 제조사」 그룹을 만들었다고 해 보겠습니다. 처음 몇 달은 잘 돌아갑니다. 설비를 등록할 때 제조사를 목록에서 고르고, 오타도 생기지 않습니다.

그러다 이런 요청이 옵니다. 제조사별 A/S 담당자 연락처를 적어 두고 싶다, 소모품을 그 제조사에서 사니 발주할 때 불러오고 싶다. 공통 코드 표에는 코드와 이름, 순서, 사용 여부 칸밖에 없습니다. 연락처를 넣을 자리가 없습니다.

선택지라면 전부 공통 코드 표라는 생각

자유 입력으로 두면 같은 말이 여러 모양으로 들어가고, enum 으로 두면 항목을 더할 때마다 배포해야 합니다. 그 사이의 답이 공통 코드 표라는 이야기는 ERP 공통 코드와 enum에서 다뤘습니다.

그 결론을 넓히면 「드롭다운으로 고르는 값은 enum 이 아니면 공통 코드」가 됩니다. 이 규칙은 설비 제조사 같은 값에서 어긋납니다. 거래처, 품목, 창고도 모두 드롭다운에서 고르지만, 이것들은 공통 코드 표에 두지 않는 것이 보통입니다. 선택지로 보인다는 것과 공통 코드 표에 들어가야 한다는 것은 다른 이야기입니다.

이름만 있는 목록과 속성을 가진 대상

공통 코드와 기준정보(마스터 데이터)를 가르는 질문은 이것이라고 봅니다. 그 항목에 이름 말고 다른 속성이 붙는가.

불량 사유 「미성형」에는 이름 말고 붙는 것이 없습니다. 코드, 이름, 순서, 사용 여부면 충분합니다. 단위 「BOX」, 부서 「생산팀」, 직함 「과장」도 대개 그렇습니다. 이런 값은 분류표에 가깝고, 공통 코드 표가 맞는 자리입니다.

거래처에는 사업자등록번호, 주소, 담당자, 결제 조건이 붙습니다. 품목에는 규격, 단위, 단가, 안전 재고가 붙습니다. 이것들은 분류가 아니라 업무의 대상이고, 자기 칸을 가진 테이블이 필요합니다. 이것을 기준정보라고 부릅니다.

공통 코드 기준정보
한 줄에 담기는 것 코드, 이름, 순서, 사용 여부 그 대상만의 속성 여러 개
다른 기록과의 관계 기록이 코드를 가리킬 뿐 다른 테이블이 외래 키로 참조하고, 자기도 다른 것을 참조
관리 화면 그룹별 목록 하나로 공통 대상마다 전용 화면
불량 사유, 단위, 부서, 직함 거래처, 품목, 창고, 설비

공통 코드 표에 속성을 끼워 넣는 우회

설비 제조사에 연락처가 필요해지면 흔히 떠오르는 방법이 있습니다. 공통 코드 표에 attr1, attr2, attr3 같은 여분 칸을 두고, 그룹마다 그 칸의 뜻을 다르게 쓰는 것입니다.

저는 이 방법을 첫 속성 하나까지만 허용하는 편입니다. 단위 코드에 「소수 허용 여부」 하나를 붙이는 정도라면 여분 칸으로 버틸 만합니다. 두 번째 속성부터는 문제가 커집니다. attr2 가 불량 사유 그룹에서는 무엇이고 제조사 그룹에서는 무엇인지 코드 밖에 적힌 문서를 봐야 알 수 있습니다. 칸마다 형식 검사를 걸 수 없고, 외래 키도 걸 수 없습니다.

여분 칸이 필요해지는 순간이 그 목록이 공통 코드를 졸업할 때라는 신호입니다.

졸업한 목록이 가는 곳

속성이 붙은 목록은 두 방향 중 하나로 갑니다.

하나는 전용 테이블입니다. 설비 제조사가 설비와만 관계가 있다면 EquipmentMaker 같은 테이블을 만들고 필요한 칸을 둡니다.

다른 하나는 이미 있는 기준정보에 합치는 것입니다. 설비 제조사의 경우 이쪽이 맞는 일이 많습니다. 소모품을 그 제조사에서 사고 A/S 비용을 그 제조사에 지급한다면, 제조사는 곧 매입 거래처입니다. 거래처 테이블에 이미 사업자등록번호, 주소, 담당자, 결제 조건이 있습니다. 설비는 제조사 이름 대신 거래처를 가리키면 되고, 발주와 지급 전표도 같은 거래처를 씁니다.

전용 테이블을 먼저 만들었다가 나중에 거래처와 합치면 같은 회사가 두 테이블에 따로 존재하는 기간이 생깁니다. 그래서 저라면 제조사에 속성이 붙기 시작할 때 「이 회사와 돈이 오가는가」를 먼저 묻겠습니다. 오간다면 처음부터 거래처로 보냅니다.

코드에서 기준정보로 옮길 때 남는 일

옮기는 작업 자체는 단순합니다. 공통 코드의 각 항목으로 새 테이블의 행을 만들고, 기존 기록이 가리키던 코드를 새 행의 id 로 바꿉니다.

주의할 곳은 사용 중지된 코드입니다. 공통 코드에서 사용 중지는 새 입력의 선택지에서만 빠지는 상태라, 지난 기록은 여전히 그 코드를 가리킵니다. 옮길 때 사용 중인 항목만 옮기면 지난 기록이 가리킬 곳이 사라집니다. 사용 중지된 항목도 같이 옮기고, 새 테이블에도 사용 여부 칸을 둬야 합니다.

경계가 애매할 때의 기본값

속성이 붙을지 아직 모르는 목록도 있습니다. 저는 이럴 때 공통 코드로 시작하는 쪽을 택합니다. 공통 코드를 기준정보로 옮기는 일은 위처럼 한 번의 이관으로 끝나지만, 속성이 영영 붙지 않을 목록에 전용 테이블과 전용 화면을 먼저 만들면 그 비용은 돌아오지 않습니다.

다만 처음부터 기준정보가 분명한 것은 예외입니다. 거래처, 품목, 창고처럼 업무 흐름의 주어가 되는 대상은 공통 코드로 시작할 이유가 없습니다. 수주, 출하, 전표가 그것을 가리키기 시작하는 순간 속성이 필요해지기 때문입니다.

마지막 수정:

공유하실 때는 출처(Duolabs)와 원문 주소를 표시해 주세요.