Code 코드
데이터를 구분하기 위해 사용하며 데이터의 일관성을 유지한다.
코드로 관리할 수 있는 데이터는 가능한 코드로 관리하는 것이 바람직하다.
고객의 유형을 관리하는 속성에 ‘개인’, ‘개인 고객’, ‘개인고객’ 등으로 관리되면 일관성이 없다. ‘01’이라는 코드를 ‘개인 고객’ 으로 정하면 일관성을 유지할 수 있다. 하나의 코드에 여러 의미가 포함되지 않도록 한다. 성질이 다르면 다른 코드를 부여한다. 여부, 유무 성격의 속성( Attributes 속성 4. 여부, 유무 속성 참조)은 코드로 관리하지 않는다.
1. 속성 코드와 식별자 코드
코드 속성은 속성 중에서 사전에 약속한 코드값이 사용된 속성을 의미한다. ('01'은 개인, '02'는 법인) 일반적으로 코드는 공통 코드 엔터티에서 통합 관리된다.
식별자 코드는 일반적인 속성 코드와 다르다. 식별자 코드는 한 엔터티의 주 식별자가 인조 식별자인데 이름이 단순하게 '~코드'로 끝난 속성이다. 이는 단순히 주 식별자일 뿐이다. 그리하여 이름이 '~코드'에서 '~번호'로 바꾸어도 전혀 문제가 되지 않는다. 속성 코드와 식별자 코드는 가능하면 구분해서 사용한다.
1-1. 속성 코드
코드값과 코드명은 공통 코드 엔터티에서 통합 관리된다.
보통 코드값이 다양하지 않고 서비스의 핵심 데이터가 아니면 공통 코드로 관리한다.
속성 코드는 하나의 인스턴스를 의미하는 것이 아니라 범주를 의미하므로 구분/유형/종류/상태/등급/방법/단위 등과 같이 구분자 역할을 하는 용어와 함께 사용하는 것이 적절하다.
e.g. '~구분코드', '~유형코드', '~종류코드'
1-1-1 추천하는 구분법
코드 | 설명 | 예문 |
구분코드 | 성질이나 특징이 다른 코드명이 고정적일 때 | 남녀구분코드, 매수매도구분코드 |
유형코드 | 코드명을 성질이나 특징이 공통적인 것끼리 묶을 때 | 거래유형코드 |
종류코드 | 고정적이지 않고 지속적으로 늘어날 수 있을 때 | 서비스종류코드 |
1-1-2 일반 코드지만 개별 코드 엔터티로 관리하는 경우
(1) 특정 코드를 집중적으로 조회될 수 있어 경합을 줄여 성능을 높이기 위해 별도의 엔터티에서 관리
(2) 코드 종류가 외부에서 받는 데이터인 경우. 통합 코드 엔터티에서 관리하기 불편할 수 있기에 별도의 엔터티에서 관리
1-2 식별자 코드
코드값이 다양하고 서비스의 핵심 데이터이거나 코드명 이외의 데이터도 관리해야 한다면 공통 코드 엔터티가 아닌 별도의 엔터티를 만들어서 관리한다 이를 실체 엔터티라고 부른다.
식별자 코드의 속성명은 '~번호' 사용을 원칙으로 하되 꼭 필요한 경우만 '~코드'를 사용한다. (일반 코드와 구분하기 위함)
2. 공통 코드 모델
코드 엔터티는 데이터의 성격을 파악해 엔티티를 도출하는 것이 아니라 미리 약속된 코드를 관리하기 편하게 사용하기 위함이다. 코드유형 엔터티에는 코드로 관리할 종류를 관리한다. 코드유형은 100개 이상이 존재한다고 가정하여 3자리를 사용하고 코드는 100개 미만을 관리한다고 가정하고 코드값은 2자리를 사용한다.
2-1 일반 코드 모델
부모-자식 엔터티로 관리한다. 부모는 코드의 구분을 담당하고 자식은 해당 구분의 코드값을 관리한다. 이 방법의 특징은 쿼리를 사용할 때 필요한 코드유형번호('001'은 '매수매도구분코드' 이다)를 사전에 알고 있어야 한다는 점이다.
CREATE TABLE code_master(
code_type VARCHAR(3) NOT NULL
, code_type_name VARCHAR(10) NOT NULL
, PRIMARY KEY (code_type)
);
CREATE TABLE code_detail (
code_type VARCHAR(3)
, code_value VARCHAR(2)
, code_name VARCHAR(10) NOT null
, PRIMARY KEY(code_type, code_value)
, FOREIGN KEY(code_type) REFERENCES code_master(code_type)
);
INSERT INTO code_master
(code_type, code_type_name)
VALUES
('001', '매수매도구분코드')
, ('002', '직급코드');
INSERT INTO code_detail
(code_type, code_value, code_name)
VALUES
('001', '01', '매수')
, ('001', '02', '매도')
, ('002', '01', '사원')
, ('002', '02', '대리')
, ('002', '03', '과장');
-- 매수매도구분코드
SELECT code_value, code_name
FROM code_detail
WHERE code_type = '001';
-- 공통코드를 JOIN으로 사용
SELECT A.계좌번호, B.code_name AS '매수매도구분코드'
FROM 거래내역 A
INNER JOIN code_detail B
ON A.cd_bs = B.code_value
AND B.code_type = '001'
WHERE A.계좌번호 = '123456789';
2-2 물리 속성명을 사용한 코드 모델
일반 코드 모델과 거의 유사하지만 코드유형코드에 해당 코드값이 사용될 속성의 속성명이 코드가 되는 형식이다. 다만, 공통코드를 JOIN으로 사용을 할 때 연결하는 컬럼명이 code_type이기 때문에 B.code_type = '컬럼명'을 입력하면 된다.
CREATE TABLE code_master(
code_type VARCHAR(10) NOT NULL
, code_type_name VARCHAR(10) NOT NULL
, PRIMARY KEY (code_type)
);
CREATE TABLE code_detail (
code_type VARCHAR(10)
, code_value VARCHAR(2)
, code_name VARCHAR(10) NOT null
, PRIMARY KEY(code_type, code_value)
);
INSERT INTO code_master
(code_type, code_type_name)
VALUES
('cd_bs', '매수매도구분코드')
, ('cd_grd', '직급코드');
INSERT INTO code_detail
(code_type, code_value, code_name)
VALUES
('cd_bs', '01', '매수')
, ('cd_bs', '02', '매도')
, ('cd_grd', '01', '사원')
, ('cd_grd', '02', '대리')
, ('cd_grd', '03', '과장');
-- 매수매도구분코드
SELECT code_value, code_name
FROM code_detail
WHERE code_type = 'cd_bs';
-- 공통코드를 JOIN으로 사용
SELECT A.계좌번호, B.code_name AS '매수매도구분코드'
FROM 거래내역 A
INNER JOIN code_detail B
ON A.cd_bs = B.code_value
AND B.code_type = 'cd_bs'
WHERE A.계좌번호 = '123456789';
2-3 재귀 관계를 사용한 모델 (추천)
상위, 하위 관계를 한 엔터티에서 관리를 한다. 코드유형번호 속성이 null이면 코드유형을 나타내고 null이 아니면 해당 코드유형의 코드값을 표현한다. 코드값이 유일하기 때문에 코드유형번호를 기억할 필요가 없어서 JOIN시 편하다. 응용하면 깊은 depth도 표현가능하다.
CREATE TABLE common_code(
code_value VARCHAR(5) NOT NULL
, code_type VARCHAR(3) NULL
, code_name VARCHAR(10) NOT NULL
, PRIMARY KEY (code_value)
);
INSERT INTO common_code
(code_value, code_type, code_name)
VALUES
('001', NULL, '매수매도구분코드')
, ('002', NULL, '직급코드')
, ('00101', '001', '매수')
, ('00102', '001', '매도')
, ('00201', '002', '사원')
, ('00202', '002', '대리')
, ('00203', '002', '과장');
-- 매수매도구분코드
SELECT code_value, code_name
FROM common_code
WHERE code_type = '001';
-- 공통코드를 JOIN으로 사용
SELECT A.계좌번호, B.code_name AS '매수매도구분코드'
FROM 거래내역 A
INNER JOIN common_code B
ON A.cd_bs = B.code_value
WHERE A.계좌번호 = '123456789';
관계형 데이터 모델링 프리미엄 가이드 도서의 내용을 참고하였습니다.
관계형 데이터 모델링 프리미엄 가이드 | 김기창 - 교보문고
관계형 데이터 모델링 프리미엄 가이드 | 출간 이래 데이터 모델러와 데이터 아키텍트(Data Architect)의 필독서로 인정받아온 [관계형 데이터 모델링 프리미엄 가이드]의 개정판이다. 이 책은 저자
product.kyobobook.co.kr