wing-ops/database/schema/11_aerial_rescue_tables.sql
htlee 13d6ca69e2 refactor(db): DDL 스크립트 현행화 + wing_auth→auth 스키마 문서 전면 수정
- 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>
2026-03-01 15:16:38 +09:00

218 lines
8.2 KiB
SQL

-- WING-OPS Database Schema: Aerial & Rescue Tables
-- wing 스키마: aerial_media, cctv_camera, sat_request, rescue_ops, rescue_scenario
-- FK 의존성: rescue_scenario → rescue_ops
-- ============================================================
-- 1. 항공 미디어 (aerial_media)
-- ============================================================
CREATE TABLE wing.aerial_media (
aerial_media_sn integer NOT NULL,
acdnt_sn integer,
file_nm character varying(200) NOT NULL,
orgnl_nm character varying(200),
file_path character varying(500),
lon numeric(10,6),
lat numeric(9,6),
geom public.geometry(Point, 4326),
loc_dc character varying(100),
equip_tp_cd character varying(20),
equip_nm character varying(50),
media_tp_cd character varying(20),
takng_dtm timestamp with time zone,
file_sz character varying(20),
resolution character varying(30),
use_yn character(1) DEFAULT 'Y'::bpchar,
reg_dtm timestamp with time zone DEFAULT now(),
CONSTRAINT aerial_media_pkey PRIMARY KEY (aerial_media_sn)
);
CREATE SEQUENCE wing.aerial_media_aerial_media_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.aerial_media_aerial_media_sn_seq OWNED BY wing.aerial_media.aerial_media_sn;
ALTER TABLE ONLY wing.aerial_media ALTER COLUMN aerial_media_sn SET DEFAULT nextval('wing.aerial_media_aerial_media_sn_seq'::regclass);
-- ============================================================
-- 2. CCTV 카메라 (cctv_camera)
-- ============================================================
CREATE TABLE wing.cctv_camera (
cctv_sn integer NOT NULL,
camera_nm character varying(100) NOT NULL,
region_nm character varying(20),
lon numeric(10,6),
lat numeric(9,6),
geom public.geometry(Point, 4326),
loc_dc character varying(200),
coord_dc character varying(50),
stts_cd character varying(20) DEFAULT 'LIVE'::character varying,
ptz_yn character(1) DEFAULT 'N'::bpchar,
source_nm character varying(50),
stream_url character varying(500),
use_yn character(1) DEFAULT 'Y'::bpchar,
reg_dtm timestamp with time zone DEFAULT now(),
CONSTRAINT cctv_camera_pkey PRIMARY KEY (cctv_sn)
);
CREATE SEQUENCE wing.cctv_camera_cctv_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.cctv_camera_cctv_sn_seq OWNED BY wing.cctv_camera.cctv_sn;
ALTER TABLE ONLY wing.cctv_camera ALTER COLUMN cctv_sn SET DEFAULT nextval('wing.cctv_camera_cctv_sn_seq'::regclass);
-- ============================================================
-- 3. 위성 촬영 요청 (sat_request)
-- ============================================================
CREATE TABLE wing.sat_request (
sat_req_sn integer NOT NULL,
req_cd character varying(20) NOT NULL,
acdnt_sn integer,
lon numeric(10,6),
lat numeric(9,6),
geom public.geometry(Point, 4326),
zone_dc character varying(200),
coord_dc character varying(50),
zone_area_km2 numeric(8,2),
sat_nm character varying(50),
provider_nm character varying(50),
resolution character varying(20),
purpose_dc character varying(200),
reqstr_nm character varying(50),
req_dtm timestamp with time zone,
expected_rcv_dtm timestamp with time zone,
stts_cd character varying(20) DEFAULT 'PENDING'::character varying,
use_yn character(1) DEFAULT 'Y'::bpchar,
reg_dtm timestamp with time zone DEFAULT now(),
CONSTRAINT sat_request_pkey PRIMARY KEY (sat_req_sn),
CONSTRAINT sat_request_req_cd_key UNIQUE (req_cd),
CONSTRAINT ck_sat_stts CHECK (
((stts_cd)::text = ANY ((ARRAY['PENDING'::character varying, 'SHOOTING'::character varying, 'COMPLETED'::character varying, 'CANCELLED'::character varying])::text[]))
)
);
CREATE SEQUENCE wing.sat_request_sat_req_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.sat_request_sat_req_sn_seq OWNED BY wing.sat_request.sat_req_sn;
ALTER TABLE ONLY wing.sat_request ALTER COLUMN sat_req_sn SET DEFAULT nextval('wing.sat_request_sat_req_sn_seq'::regclass);
-- ============================================================
-- 4. 구조 작전 (rescue_ops)
-- ============================================================
CREATE TABLE wing.rescue_ops (
rescue_ops_sn integer NOT NULL,
acdnt_sn integer,
ops_cd character varying(20) NOT NULL,
acdnt_tp_cd character varying(20),
vessel_nm character varying(100),
commander_nm character varying(50),
lon numeric(10,6),
lat numeric(9,6),
geom public.geometry(Point, 4326),
loc_dc character varying(100),
depth_m numeric(6,1),
current_dc character varying(50),
gm_m numeric(5,2),
list_deg numeric(5,1),
trim_m numeric(5,2),
buoyancy_pct numeric(5,1),
oil_rate_lpm numeric(8,1),
bm_ratio_pct numeric(5,1),
total_crew integer,
survivors integer,
missing integer,
hydro_data jsonb,
gmdss_data jsonb,
stts_cd character varying(20) DEFAULT 'ACTIVE'::character varying,
use_yn character(1) DEFAULT 'Y'::bpchar,
reg_dtm timestamp with time zone DEFAULT now(),
mdfcn_dtm timestamp with time zone DEFAULT now(),
CONSTRAINT rescue_ops_pkey PRIMARY KEY (rescue_ops_sn),
CONSTRAINT rescue_ops_ops_cd_key UNIQUE (ops_cd)
);
CREATE SEQUENCE wing.rescue_ops_rescue_ops_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.rescue_ops_rescue_ops_sn_seq OWNED BY wing.rescue_ops.rescue_ops_sn;
ALTER TABLE ONLY wing.rescue_ops ALTER COLUMN rescue_ops_sn SET DEFAULT nextval('wing.rescue_ops_rescue_ops_sn_seq'::regclass);
-- ============================================================
-- 5. 구조 시나리오 (rescue_scenario)
-- 의존: rescue_ops
-- ============================================================
CREATE TABLE wing.rescue_scenario (
scenario_sn integer NOT NULL,
rescue_ops_sn integer NOT NULL,
time_step character varying(10) NOT NULL,
scenario_dtm timestamp with time zone,
svrt_cd character varying(20),
gm_m numeric(5,2),
list_deg numeric(5,1),
trim_m numeric(5,2),
buoyancy_pct numeric(5,1),
oil_rate_lpm numeric(8,1),
bm_ratio_pct numeric(5,1),
description text,
compartments jsonb,
assessment jsonb,
actions jsonb,
sort_ord integer DEFAULT 0,
reg_dtm timestamp with time zone DEFAULT now(),
CONSTRAINT rescue_scenario_pkey PRIMARY KEY (scenario_sn)
);
CREATE SEQUENCE wing.rescue_scenario_scenario_sn_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE wing.rescue_scenario_scenario_sn_seq OWNED BY wing.rescue_scenario.scenario_sn;
ALTER TABLE ONLY wing.rescue_scenario ALTER COLUMN scenario_sn SET DEFAULT nextval('wing.rescue_scenario_scenario_sn_seq'::regclass);
-- ============================================================
-- FK 제약조건
-- ============================================================
ALTER TABLE ONLY wing.aerial_media
ADD CONSTRAINT aerial_media_acdnt_sn_fkey
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn);
ALTER TABLE ONLY wing.sat_request
ADD CONSTRAINT sat_request_acdnt_sn_fkey
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn);
ALTER TABLE ONLY wing.rescue_ops
ADD CONSTRAINT rescue_ops_acdnt_sn_fkey
FOREIGN KEY (acdnt_sn) REFERENCES wing.acdnt(acdnt_sn);
ALTER TABLE ONLY wing.rescue_scenario
ADD CONSTRAINT rescue_scenario_rescue_ops_sn_fkey
FOREIGN KEY (rescue_ops_sn) REFERENCES wing.rescue_ops(rescue_ops_sn) ON DELETE CASCADE;