코드란?

  • 속성에 사용되는 값을 간단하고 알기 쉽게 나타낼 수 있도록 약속한 또 다른 값
  • 짧은 설명이나 텍스트를 더 짧은 상직으로 표현한 것


코드를 사용하는 이유

  • 데이터가 일관적으로 유지됨
  • 데이터를 구분하기위해서 사용
  • 저장 공간을 줄여주는 부수적인 효과를 얻을 수 있음


코드를 정의할 때 유의점

  • 하나의 코드에 여러의미가 포함되지 않도록 해야 함
  • 성질이 다르면 다른 코드로 부여

여부 vs 유무

여부 : 이다, 아니다 예: 결혼여부
유무 : 있다, 없다 예: 자동차유무


속성 코드와 식별자 코드

  • 코드 속성은 코드값이(예를 들면 '01'라는 값)이 사용된 속성을 의미
  • 식별자 코드는 엔터티의 주 식별자로 속성 이름이 '~코드'로 끝난 속성, 코드 속성과 식별자 코드는 성격이 다름
    • 식별자 코드의 속성명에만 '코드'가 붙은 것일 뿐임, '번호' 등으로 변경해도 문제가 없음


코드 엔터티의 주의점

  • 실체 엔터티는 처음에는 속성이 적어 코드 엔터티처럼 보이지만 코드 엔터티가 아니며, 추후 속성이 추가될 가능성이 크므로 공통 코드 엔터티에 포함시키지 말고 별도의 엔터티로 도출하는 것이 좋음
  • 인스턴스가 매우 많은 코드성 데이터도 공통 코드 엔터티에 포함시키지 않는 것이 좋음(메모리 효율 등을 위해서)
  • 일반 코드(속성 코드)가 식별자 코드가 될 경우, 공통 코드 엔터티에서 관리하던 인스턴스는 삭제해야함
  • 경합을 줄이기 위해 공통 코드 엔터티에서 별도의 엔터티로 도출하는 경우가 있음(다만, 별다른 이유없이 공통 코드 엔터티에서 관리해도 될 인스턴스를 별도의 엔터티에서 관리할 경우 저장공간 낭비가 발생)
  • 식별자의 경우 부서번호, 지점번호, 대리점번호 등과 같이 번호를 사용하고, 일반 코드(속성 코드)의 경우 ~구분코드, ~유형코드, ~종류코드와 같이 사용하는 것을 권장

참고

구분코드 성질이나 특징이 다른 코드명이 고정적일 때 사용 -- 예) 남녀구분코드 매수매도구분코드
유형코드 코드명을 성질이나특징이 공통적인 것끼리 묶을 때 사용. -- 예) 거래유형코드
종류코드 고정적이지 않고 지속적으로늘어닐수 있는코드명을 나열할 때 사용 -- 예) 서비스종류코드


공통 코드로 관리하는 경우

  • 100 : 한국을 의미


개별 엔터티로 관리하는 경우

  • 100 : 한국을 의미
  • KOR : 영문약어 한국을 의미
  • 82 : 한국의 국가전화번호를 의미


  • 앞서 공통 코드로 관리하다가 별도의 국가 엔터티로 도출 시에는 공통 코드 엔터티에서 한국 인스턴스를 삭제해야 함.


코드 모델


SELECT A.계좌번호, B.코드명
FROM [거래내역] A, [코드] B
WHERE A.매수매도구분코드 = B .코드값
AND B.코드유형번호 = '001'  -- 코드값을 미리 알고 있어야 함
AND A.계좌번호 = '123456789';


-- 뷰를 활용하여 코드유형번호 코드값을 잘못입력하는 것을 방지할 수 있음
CREATE OR REPLACE VIEW VW_매수매도구분
AS
SELECT 코드값, ZHEMAUD
FROM [코드]
WHERE 코드유형번호 = '001';

SELECT A. 계좌번호 ,B 코드명
FROM[거래내역] A, VW_매수매도구분 B
WHERE A.매수매도구분코드 = B.코드값
ANDA.계좌번호 = '123456789';


-- 속성의 물리명을 코드유형코드 값으로 사용하는 방식
SELECT A.계좌번호, B.코드명
FROM [거래내역] A, [코드] B
WHERE A.매수매도구분코드 = B.코드
AND B.코드유형코드 = 'BS_CD' -- 코드값을 미리 알고 있어야 함(앞서의 모델보다는 코드값과 컬럼명이 같으므로 사용하기 쉬움)
AND A.계좌번호 = '123456789';


-- 속성명(한글)을 사용하는 방식으로 변수를 한글로 지정해야 함
SELECT A.계좌번호, B.코드명
FROM [거래내역] A, [코드] B
WHERE A.매수매도구분코드 = B.코드
AND B.코드유형코드 = '매수매도구분코드' -- 속성의 물리명(컬럼명)은 영문약어 변경 등으로 변경 될 수 있으나 속성명은 변경되지 않으므로 오히려 더욱 안정적인 방식
AND A.계좌번호 = '123456789';


-- 필자가 추천하는 코드 모델
SELECT A.계좌번호, B.코드번호
FROM [거래내역] A, [코드] B
WHERE A.매수구분코드 = B.코드값   -- 코드유형을 의미하는 구문이 조건절에 없음(속성 값에 코드 유형이 포함되어 있으므로)
  AND A.계좌번호 = '123456789';



순환과계를 사용하는 방식, 그림 9.10과 같은 효과가 있으나 공간을 더 많이 차지


그림 9.8 방법에 코드 부분 집합 개념을 도입한 모델
위 그림 9.12 모델을 대체할 수 있는 방법
가. 필요한 부분집합 코드를 어플리케이션에 하드코딩하는 방법 : 유지보수의 어려움 존재
나. 코드에 롤(Role) 이름을 붙여 관리하는 방법 : 필요한 부분집합을 각각 생성하는 방법(예 : 통합고객구분코드, WM고객구분코드 등처럼 통합, WM의 롤이름을 붙여줌)


코드값 간에 계층관계가 존재하는 경우


코드유형과 코드 엔터티를 이력관리하는 모델


* 코드 엔터티를 이력관리하는 예제
* 코드 유형에 대한 과거의 코드값과 코드명 전체가 시점 데이터로 관리
* (b)의 경우와 값이 법인의 코드값이 02 -> 03으로 변경되면 해당 코드값을 사용한 전체속성 값을 모두 수정해야 함
* 코드값의 변경 이력을 관리해주는 것이 좋음