- 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>
191 lines
7.5 KiB
SQL
191 lines
7.5 KiB
SQL
-- WING-OPS Database Schema: Incidents Tables
|
|
-- wing 스키마: acdnt, spil_data, pred_exec, acdnt_weather, acdnt_media
|
|
-- 출처: pg_dump 현행 DDL (migration/009_incidents.sql 기반, wing 스키마 적용)
|
|
-- 주의: pg_dump 기준 acdnt에는 loc_geom(geometry) 컬럼이 추가되어 있음
|
|
|
|
-- ============================================================
|
|
-- 1. 사고 (acdnt)
|
|
-- ============================================================
|
|
CREATE TABLE wing.acdnt (
|
|
acdnt_sn integer NOT NULL,
|
|
acdnt_cd character varying(20) NOT NULL,
|
|
acdnt_nm character varying(200) NOT NULL,
|
|
acdnt_tp_cd character varying(50) NOT NULL,
|
|
acdnt_stts_cd character varying(20) NOT NULL DEFAULT 'ACTIVE'::character varying,
|
|
lat numeric(9,6),
|
|
lng numeric(10,6),
|
|
loc_dc character varying(200),
|
|
occrn_dtm timestamp with time zone NOT NULL,
|
|
rpt_dtm timestamp with time zone,
|
|
region_nm character varying(20),
|
|
office_nm character varying(30),
|
|
svrt_cd character varying(10),
|
|
vessel_tp character varying(30),
|
|
phase_cd character varying(20) DEFAULT 'RESPONSE'::character varying,
|
|
analyst_nm character varying(50),
|
|
rgtr_id uuid,
|
|
use_yn character(1) DEFAULT 'Y'::bpchar,
|
|
reg_dtm timestamp with time zone NOT NULL DEFAULT now(),
|
|
mdfcn_dtm timestamp with time zone,
|
|
loc_geom public.geometry(Point, 4326),
|
|
CONSTRAINT pk_acdnt PRIMARY KEY (acdnt_sn),
|
|
CONSTRAINT uk_acdnt_cd UNIQUE (acdnt_cd),
|
|
CONSTRAINT ck_acdnt_stts CHECK (((acdnt_stts_cd)::text = ANY ((ARRAY['ACTIVE'::character varying, 'INVESTIGATING'::character varying, 'CLOSED'::character varying])::text[]))),
|
|
CONSTRAINT ck_acdnt_svrt CHECK (((svrt_cd IS NULL) OR ((svrt_cd)::text = ANY ((ARRAY['DANGER'::character varying, 'ALERT'::character varying, 'CAUTION'::character varying, 'INTEREST'::character varying])::text[])))),
|
|
CONSTRAINT ck_acdnt_phase CHECK (((phase_cd IS NULL) OR ((phase_cd)::text = ANY ((ARRAY['RESPONSE'::character varying, 'STANDBY'::character varying, 'CLOSED'::character varying])::text[]))))
|
|
);
|
|
|
|
CREATE SEQUENCE wing.acdnt_acdnt_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.acdnt_acdnt_sn_seq OWNED BY wing.acdnt.acdnt_sn;
|
|
ALTER TABLE ONLY wing.acdnt ALTER COLUMN acdnt_sn SET DEFAULT nextval('wing.acdnt_acdnt_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- 2. 유출정보 (spil_data)
|
|
-- ============================================================
|
|
CREATE TABLE wing.spil_data (
|
|
spil_data_sn integer NOT NULL,
|
|
acdnt_sn integer NOT NULL,
|
|
oil_tp_cd character varying(50) NOT NULL,
|
|
spil_qty numeric(12,2),
|
|
spil_unit_cd character varying(10) DEFAULT 'KL'::character varying,
|
|
spil_tp_cd character varying(20),
|
|
fcst_hr integer,
|
|
reg_dtm timestamp with time zone NOT NULL DEFAULT now(),
|
|
CONSTRAINT pk_spil_data PRIMARY KEY (spil_data_sn)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.spil_data_spil_data_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.spil_data_spil_data_sn_seq OWNED BY wing.spil_data.spil_data_sn;
|
|
ALTER TABLE ONLY wing.spil_data ALTER COLUMN spil_data_sn SET DEFAULT nextval('wing.spil_data_spil_data_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- 3. 예측 실행 (pred_exec)
|
|
-- ============================================================
|
|
CREATE TABLE wing.pred_exec (
|
|
pred_exec_sn integer NOT NULL,
|
|
acdnt_sn integer NOT NULL,
|
|
algo_cd character varying(20) NOT NULL,
|
|
exec_stts_cd character varying(20) NOT NULL DEFAULT 'PENDING'::character varying,
|
|
bgng_dtm timestamp with time zone,
|
|
cmpl_dtm timestamp with time zone,
|
|
reqd_sec integer,
|
|
rslt_data jsonb,
|
|
err_msg text,
|
|
CONSTRAINT pk_pred_exec PRIMARY KEY (pred_exec_sn),
|
|
CONSTRAINT ck_pred_stts CHECK (((exec_stts_cd)::text = ANY ((ARRAY['PENDING'::character varying, 'RUNNING'::character varying, 'COMPLETED'::character varying, 'FAILED'::character varying])::text[])))
|
|
);
|
|
|
|
CREATE SEQUENCE wing.pred_exec_pred_exec_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.pred_exec_pred_exec_sn_seq OWNED BY wing.pred_exec.pred_exec_sn;
|
|
ALTER TABLE ONLY wing.pred_exec ALTER COLUMN pred_exec_sn SET DEFAULT nextval('wing.pred_exec_pred_exec_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- 4. 사고별 기상정보 스냅샷 (acdnt_weather)
|
|
-- ============================================================
|
|
CREATE TABLE wing.acdnt_weather (
|
|
weather_sn integer NOT NULL,
|
|
acdnt_sn integer NOT NULL,
|
|
loc_nm character varying(100),
|
|
obs_dtm timestamp with time zone,
|
|
icon character varying(10),
|
|
temp character varying(20),
|
|
weather_dc character varying(50),
|
|
wind character varying(30),
|
|
wave character varying(20),
|
|
humid character varying(20),
|
|
vis character varying(20),
|
|
sst character varying(20),
|
|
tide character varying(30),
|
|
high_tide character varying(30),
|
|
low_tide character varying(30),
|
|
forecast jsonb,
|
|
impact_dc text,
|
|
reg_dtm timestamp with time zone DEFAULT now(),
|
|
CONSTRAINT acdnt_weather_pkey PRIMARY KEY (weather_sn)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.acdnt_weather_weather_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.acdnt_weather_weather_sn_seq OWNED BY wing.acdnt_weather.weather_sn;
|
|
ALTER TABLE ONLY wing.acdnt_weather ALTER COLUMN weather_sn SET DEFAULT nextval('wing.acdnt_weather_weather_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- 5. 사고별 미디어 메타데이터 (acdnt_media)
|
|
-- ============================================================
|
|
CREATE TABLE wing.acdnt_media (
|
|
media_sn integer NOT NULL,
|
|
acdnt_sn integer NOT NULL,
|
|
photo_cnt smallint DEFAULT 0,
|
|
video_cnt smallint DEFAULT 0,
|
|
sat_cnt smallint DEFAULT 0,
|
|
cctv_cnt smallint DEFAULT 0,
|
|
photo_meta jsonb,
|
|
drone_meta jsonb,
|
|
sat_meta jsonb,
|
|
cctv_meta jsonb,
|
|
reg_dtm timestamp with time zone DEFAULT now(),
|
|
CONSTRAINT acdnt_media_pkey PRIMARY KEY (media_sn)
|
|
);
|
|
|
|
CREATE SEQUENCE wing.acdnt_media_media_sn_seq
|
|
AS integer
|
|
START WITH 1
|
|
INCREMENT BY 1
|
|
NO MINVALUE
|
|
NO MAXVALUE
|
|
CACHE 1;
|
|
|
|
ALTER SEQUENCE wing.acdnt_media_media_sn_seq OWNED BY wing.acdnt_media.media_sn;
|
|
ALTER TABLE ONLY wing.acdnt_media ALTER COLUMN media_sn SET DEFAULT nextval('wing.acdnt_media_media_sn_seq'::regclass);
|
|
|
|
|
|
-- ============================================================
|
|
-- FK 제약조건
|
|
-- ============================================================
|
|
ALTER TABLE ONLY wing.spil_data
|
|
ADD CONSTRAINT fk_spil_acdnt
|
|
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn) ON DELETE CASCADE;
|
|
|
|
ALTER TABLE ONLY wing.pred_exec
|
|
ADD CONSTRAINT fk_pred_acdnt
|
|
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn) ON DELETE CASCADE;
|
|
|
|
ALTER TABLE ONLY wing.acdnt_weather
|
|
ADD CONSTRAINT acdnt_weather_acdnt_sn_fkey
|
|
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn) ON DELETE CASCADE;
|
|
|
|
ALTER TABLE ONLY wing.acdnt_media
|
|
ADD CONSTRAINT acdnt_media_acdnt_sn_fkey
|
|
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn) ON DELETE CASCADE;
|