- database/schema/ 14개 DDL 파일 신규 생성 (운영 DB pg_dump 기반) - database/seed/ 14개 초기 데이터 파일 분리 - database/_deprecated/로 구 init.sql, auth_init.sql 이동 - database/README.md 신규 작성 (DB 아키텍처, 설치 절차) - docs/ 6개 가이드 문서 wing_auth→auth 스키마 구조로 수정 - README.md, CLAUDE.md wing 단일 DB 구조 반영 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
189 lines
7.7 KiB
SQL
189 lines
7.7 KiB
SQL
-- WING-OPS Database Schema: SCAT Tables
|
|
-- wing 스키마 해안조사/SCAT 테이블
|
|
|
|
-- ============================================================
|
|
-- 1. cst_srvy_zone — 해안조사구역
|
|
-- ============================================================
|
|
CREATE TABLE wing.cst_srvy_zone (
|
|
cst_srvy_zone_sn integer NOT NULL,
|
|
zone_cd character varying(10) NOT NULL,
|
|
zone_nm character varying(100) NOT NULL,
|
|
jrsd_nm character varying(20),
|
|
sect_cnt integer DEFAULT 0,
|
|
lat_center numeric(9,6),
|
|
lng_center numeric(9,6),
|
|
lat_range numeric(9,6),
|
|
lng_range numeric(9,6),
|
|
geom public.geometry(Point,4326),
|
|
use_yn character(1) DEFAULT 'Y'::bpchar,
|
|
reg_dtm timestamp with time zone DEFAULT now(),
|
|
CONSTRAINT cst_srvy_zone_pkey PRIMARY KEY (cst_srvy_zone_sn),
|
|
CONSTRAINT cst_srvy_zone_zone_cd_key UNIQUE (zone_cd)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.cst_srvy_zone_cst_srvy_zone_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.cst_srvy_zone_cst_srvy_zone_sn_seq OWNED BY wing.cst_srvy_zone.cst_srvy_zone_sn;
|
|
ALTER TABLE ONLY wing.cst_srvy_zone ALTER COLUMN cst_srvy_zone_sn SET DEFAULT nextval('wing.cst_srvy_zone_cst_srvy_zone_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- 2. cst_sect — 해안구간
|
|
-- ============================================================
|
|
CREATE TABLE wing.cst_sect (
|
|
cst_sect_sn integer NOT NULL,
|
|
cst_srvy_zone_sn integer,
|
|
sect_cd character varying(20) NOT NULL,
|
|
sect_nm character varying(200),
|
|
cst_tp_cd character varying(30),
|
|
esi_cd character varying(5),
|
|
esi_num smallint,
|
|
len_m numeric(8,1),
|
|
snstvt_cd character varying(10),
|
|
srvy_stts_cd character varying(10) DEFAULT '미조사'::character varying,
|
|
lat numeric(9,6),
|
|
lng numeric(9,6),
|
|
geom public.geometry(Point,4326),
|
|
tags jsonb DEFAULT '[]'::jsonb,
|
|
shore_tp character varying(20),
|
|
access_dc character varying(500),
|
|
access_pt character varying(200),
|
|
sensitive_info jsonb DEFAULT '[]'::jsonb,
|
|
cleanup_methods jsonb DEFAULT '[]'::jsonb,
|
|
end_criteria jsonb DEFAULT '[]'::jsonb,
|
|
notes jsonb DEFAULT '[]'::jsonb,
|
|
use_yn character(1) DEFAULT 'Y'::bpchar,
|
|
reg_dtm timestamp with time zone DEFAULT now(),
|
|
CONSTRAINT cst_sect_pkey PRIMARY KEY (cst_sect_sn),
|
|
CONSTRAINT cst_sect_sect_cd_key UNIQUE (sect_cd)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.cst_sect_cst_sect_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.cst_sect_cst_sect_sn_seq OWNED BY wing.cst_sect.cst_sect_sn;
|
|
ALTER TABLE ONLY wing.cst_sect ALTER COLUMN cst_sect_sn SET DEFAULT nextval('wing.cst_sect_cst_sect_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- 3. scat_srvy — SCAT조사
|
|
-- (pg_dump에 없음, init.sql 기반으로 wing 스키마 변환)
|
|
-- ============================================================
|
|
CREATE TABLE wing.scat_srvy (
|
|
scat_srvy_sn integer NOT NULL,
|
|
cst_sect_sn integer NOT NULL,
|
|
acdnt_sn integer,
|
|
srvy_ymd character(8),
|
|
srvy_tp_cd character varying(20),
|
|
srvy_phase_cd character varying(20),
|
|
polut_cd character varying(20),
|
|
srvyr_id uuid,
|
|
rmk character varying(500),
|
|
reg_dtm timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT pk_scat_srvy PRIMARY KEY (scat_srvy_sn)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.scat_srvy_scat_srvy_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.scat_srvy_scat_srvy_sn_seq OWNED BY wing.scat_srvy.scat_srvy_sn;
|
|
ALTER TABLE ONLY wing.scat_srvy ALTER COLUMN scat_srvy_sn SET DEFAULT nextval('wing.scat_srvy_scat_srvy_sn_seq'::regclass);
|
|
|
|
COMMENT ON TABLE wing.scat_srvy IS 'SCAT조사';
|
|
COMMENT ON COLUMN wing.scat_srvy.scat_srvy_sn IS 'SCAT조사순번';
|
|
COMMENT ON COLUMN wing.scat_srvy.cst_sect_sn IS '해안구간순번 (해안구간 참조)';
|
|
COMMENT ON COLUMN wing.scat_srvy.acdnt_sn IS '사고순번 (관련 사고 참조)';
|
|
COMMENT ON COLUMN wing.scat_srvy.srvy_ymd IS '조사일자 (YYYYMMDD 저장형식)';
|
|
COMMENT ON COLUMN wing.scat_srvy.srvy_tp_cd IS '조사유형코드 (SRVY_TP: Pre-SCAT, SCAT, Post-SCAT)';
|
|
COMMENT ON COLUMN wing.scat_srvy.srvy_phase_cd IS '조사단계코드 (SRVY_PHASE: 1차, 2차, 3차 등)';
|
|
COMMENT ON COLUMN wing.scat_srvy.polut_cd IS '오염도코드 (POLUT: HEAVY, MODERATE, LIGHT, CLEAN)';
|
|
COMMENT ON COLUMN wing.scat_srvy.srvyr_id IS '조사자아이디';
|
|
COMMENT ON COLUMN wing.scat_srvy.rmk IS '비고';
|
|
COMMENT ON COLUMN wing.scat_srvy.reg_dtm IS '등록일시';
|
|
|
|
|
|
-- ============================================================
|
|
-- 4. scat_srvy_photo — SCAT조사사진
|
|
-- (pg_dump에 없음, init.sql 기반으로 wing 스키마 변환)
|
|
-- ============================================================
|
|
CREATE TABLE wing.scat_srvy_photo (
|
|
scat_photo_sn integer NOT NULL,
|
|
scat_srvy_sn integer NOT NULL,
|
|
photo_file_path character varying(500) NOT NULL,
|
|
photo_dc character varying(200),
|
|
takng_dtm timestamp with time zone,
|
|
sort_ord integer DEFAULT 0,
|
|
reg_dtm timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT pk_scat_photo PRIMARY KEY (scat_photo_sn)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.scat_srvy_photo_scat_photo_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.scat_srvy_photo_scat_photo_sn_seq OWNED BY wing.scat_srvy_photo.scat_photo_sn;
|
|
ALTER TABLE ONLY wing.scat_srvy_photo ALTER COLUMN scat_photo_sn SET DEFAULT nextval('wing.scat_srvy_photo_scat_photo_sn_seq'::regclass);
|
|
|
|
COMMENT ON TABLE wing.scat_srvy_photo IS 'SCAT조사사진';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.scat_photo_sn IS 'SCAT조사사진순번';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.scat_srvy_sn IS 'SCAT조사순번 (SCAT조사 참조)';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.photo_file_path IS '사진파일경로';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.photo_dc IS '사진설명';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.takng_dtm IS '촬영일시';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.sort_ord IS '정렬순서';
|
|
COMMENT ON COLUMN wing.scat_srvy_photo.reg_dtm IS '등록일시';
|
|
|
|
|
|
-- ============================================================
|
|
-- FK 제약조건
|
|
-- ============================================================
|
|
ALTER TABLE ONLY wing.cst_sect
|
|
ADD CONSTRAINT cst_sect_cst_srvy_zone_sn_fkey FOREIGN KEY (cst_srvy_zone_sn) REFERENCES wing.cst_srvy_zone(cst_srvy_zone_sn);
|
|
|
|
ALTER TABLE ONLY wing.scat_srvy
|
|
ADD CONSTRAINT fk_scat_sect FOREIGN KEY (cst_sect_sn) REFERENCES wing.cst_sect(cst_sect_sn);
|
|
|
|
ALTER TABLE ONLY wing.scat_srvy
|
|
ADD CONSTRAINT fk_scat_acdnt FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn);
|
|
|
|
ALTER TABLE ONLY wing.scat_srvy_photo
|
|
ADD CONSTRAINT fk_photo_srvy FOREIGN KEY (scat_srvy_sn) REFERENCES wing.scat_srvy(scat_srvy_sn) ON DELETE CASCADE;
|
|
|
|
|
|
-- ============================================================
|
|
-- 인덱스
|
|
-- ============================================================
|
|
-- 공간 인덱스
|
|
CREATE INDEX idx_cst_srvy_zone_geom ON wing.cst_srvy_zone USING gist (geom);
|
|
CREATE INDEX idx_cst_sect_geom ON wing.cst_sect USING gist (geom);
|
|
|
|
-- 외래키/상태 인덱스
|
|
CREATE INDEX idx_cst_sect_zone ON wing.cst_sect USING btree (cst_srvy_zone_sn);
|
|
CREATE INDEX idx_cst_sect_stts ON wing.cst_sect USING btree (srvy_stts_cd);
|
|
CREATE INDEX idx_cst_sect_esi ON wing.cst_sect USING btree (esi_num);
|
|
|
|
-- SCAT 조사 인덱스
|
|
CREATE INDEX idx_scat_sect_sn ON wing.scat_srvy USING btree (cst_sect_sn);
|
|
CREATE INDEX idx_scat_acdnt_sn ON wing.scat_srvy USING btree (acdnt_sn);
|
|
CREATE INDEX idx_photo_srvy_sn ON wing.scat_srvy_photo USING btree (scat_srvy_sn);
|