-- 공통코드. 진행단계·처리결과·공공누리유형 같은 선택지를 소스가 아니라 데이터로 관리한다. -- -- 저장값(code)은 지금 각 업무 테이블에 들어 있는 한글 문자열을 그대로 쓴다. 영문 코드키로 -- 바꾸면 기존 데이터를 전부 변환해야 하고 엑셀 업로드/다운로드 양식까지 손봐야 해서, -- 위험 대비 실익이 없다. 진행단계만 예외로 숫자 문자열이며 organization.stage는 smallint 유지. create table code_group ( group_id varchar(50) primary key, group_name varchar(100) not null, description text, -- 관리 화면에서 코드 추가·삭제를 허용할지. 로직과 강하게 묶인 그룹(STAGE 등)은 false로 두고 -- 표시명·순서만 바꾸게 한다. 단계 추가는 마이그레이션으로 한다. editable boolean not null default true ); create table code ( group_id varchar(50) not null references code_group(group_id), -- 저장값. review_item.review_minor가 varchar(300)이라 그 길이에 맞춘다. code varchar(300) not null, -- 화면 표시명. 저장값과 다를 수 있다 - 권리확인 세부항목은 저장값이 -- '2. 후천적 권리 전부 보유(계약서 확인 필요)'인데 화면에는 짧은 형태로 나온다. label varchar(200) not null, sort_order int not null, active boolean not null default true, -- 코드별 부가 속성. 값만 담고 동작은 담지 않는다 - 동작까지 밀어넣으면 -- DB 안에 규칙 언어를 새로 만드는 꼴이 되어 오히려 읽기 어려워진다. attrs jsonb not null default '{}'::jsonb, primary key (group_id, code) ); create index idx_code_group_sort on code (group_id, sort_order);