wing-ops/database/init.sql
jeonghyo.k 2640d882da feat(incidents): 이미지 분석 연동 강화 및 사고 팝업 리뉴얼
- 사고별 이미지 분석 API 및 항공 미디어 조회 연동
- 사고 마커 팝업 디자인 개선, 필터링된 사고만 지도 표시
- 이미지 분석 시 사고명 파라미터 지원, 기본 예측시간 6시간으로 변경
- 유출량 정밀도 NUMERIC(14,10) 확대 (migration 031)
- OpenDrift 유종 매핑 수정 (원유, 등유)
2026-04-13 16:41:56 +09:00

808 lines
43 KiB
SQL
Executable File

-- ================================================================
-- WING 해양환경 위기대응 통합시스템 데이터베이스
-- 공공데이터베이스 표준화 관리 매뉴얼(2021.06) 기준 적용
-- PostgreSQL 16 + PostGIS 3.4
-- ================================================================
--
-- [표준화 적용 원칙]
-- 1. 표준단어: 한글명 → 영문약어명 매핑 (별도 사전 참조)
-- 2. 표준도메인: 분류명 + 데이터타입 + 길이 규칙
-- 3. 표준용어: 컬럼 물리명 = 영문약어명 조합 (언더스코어 구분, 30자 이내)
-- 4. 저장형식: 날짜 YYYYMMDD(C8), 일시 TIMESTAMP, 여부 Y/N(C1)
-- 5. 표준코드: 공통코드 테이블로 관리
--
-- ================================================================
-- 표준단어 사전 (WING 도메인)
-- ================================================================
-- | 한글명 | 영문약어명 | 영문전체명 |
-- |-------------|----------|----------------------|
-- | 사고 | ACDNT | Accident |
-- | 활성 | ACTV | Active |
-- | 알고리즘 | ALGO | Algorithm |
-- | 시작 | BGNG | Beginning |
-- | 오일펜스 | BOOM | Boom |
-- | 코드 | CD | Code |
-- | 공통 | CMN | Common |
-- | 완료 | CMPL | Completion |
-- | 내용 | CN | Content |
-- | 해안 | CST | Coast |
-- | 설명 | DC | Description |
-- | 배치 | DPLY | Deployment |
-- | 일시 | DTM | DateTime |
-- | 효율 | EFCNC | Efficiency |
-- | 오류 | ERR | Error |
-- | 실행 | EXEC | Execution |
-- | 예측 | FCST | Forecast |
-- | 지오메트리 | GEOM | Geometry |
-- | 그룹 | GRP | Group |
-- | 시간 | HR | Hour |
-- | 아이디 | ID | Identifier |
-- | 정보 | INFO | Information |
-- | 길이 | LEN | Length |
-- | 라인 | LINE | Line |
-- | 위치 | LOC | Location |
-- | 미터 | M | Meter |
-- | 수정 | MDFCN | Modification |
-- | 메시지 | MSG | Message |
-- | 명 | NM | Name |
-- | 번호 | NO | Number |
-- | 발생 | OCCRN | Occurrence |
-- | 유종 | OILTP | OilType |
-- | 조직 | ORG | Organization |
-- | 비밀번호 | PSWD | Password |
-- | 퍼센트 | PCT | Percent |
-- | 사진 | PHOTO | Photo |
-- | 예측 | PRED | Prediction |
-- | 우선순위 | PRIORT | Priority |
-- | 양 | QTY | Quantity |
-- | 등록 | REG | Registration |
-- | 등록자 | RGTR | Registrant |
-- | 직급 | RNKP | RankPosition |
-- | 역할 | ROLE | Role |
-- | 보고 | RPT | Report |
-- | 책임 | RSPNS | Responsible |
-- | 결과 | RSLT | Result |
-- | SCAT | SCAT | SCAT |
-- | 초 | SEC | Second |
-- | 구간 | SECT | Section |
-- | 순번 | SN | SequenceNumber |
-- | 유출 | SPIL | Spill |
-- | 조사 | SRVY | Survey |
-- | 상태 | STTS | Status |
-- | 심각도 | SVRT | Severity |
-- | 촬영 | TAKNG | Taking |
-- | 유형 | TP | Type |
-- | 단위 | UNIT | Unit |
-- | 상위 | UPPER | Upper |
-- | 사용자 | USER | User |
-- | 계정 | ACNT | Account |
-- | 여부 | YN | YesNo |
-- | 일자 | YMD | YearMonthDay |
-- | 구역 | ZONE | Zone |
-- | 민감도 | SNSTVT | Sensitivity |
-- | 오염 | POLUT | Pollution |
-- | 정렬 | SORT | Sort |
-- | 순서 | ORD | Order |
-- | 사용 | USE | Use |
-- | 해시 | HASH | Hash |
-- | 약칭 | ABBR | Abbreviation |
-- | 데이터 | DATA | Data |
-- | 소요 | REQD | Required |
-- | 경로 | PATH | Path |
-- | 파일 | FILE | File |
-- | 비고 | RMK | Remark |
-- | 관할 | JRSD | Jurisdiction |
-- | 기관 | INST | Institution |
-- | 위도 | LAT | Latitude |
-- | 경도 | LON | Longitude |
-- ================================================================
-- 표준도메인 정의
-- ================================================================
-- | 도메인명 | 데이터타입 | 설명 |
-- |-----------------|-------------------|------------------------|
-- | 순번N10 | SERIAL/INTEGER | 순차번호 10자리 |
-- | 아이디V36 | UUID | UUID 식별자 36자리 |
-- | 코드V10 | VARCHAR(10) | 코드 10자리 이내 |
-- | 코드V20 | VARCHAR(20) | 코드 20자리 이내 |
-- | 코드V50 | VARCHAR(50) | 코드 50자리 이내 |
-- | 명칭V20 | VARCHAR(20) | 명칭 20자리 이내 |
-- | 명칭V30 | VARCHAR(30) | 명칭 30자리 이내 |
-- | 명칭V50 | VARCHAR(50) | 명칭 50자리 이내 |
-- | 명칭V100 | VARCHAR(100) | 명칭 100자리 이내 |
-- | 명칭V200 | VARCHAR(200) | 명칭 200자리 이내 |
-- | 내용V255 | VARCHAR(255) | 내용 255자리 이내 |
-- | 내용V500 | VARCHAR(500) | 내용 500자리 이내 |
-- | 내용TEXT | TEXT | 대용량 텍스트 |
-- | 수량N5,2 | NUMERIC(5,2) | 수량 소수점2자리 |
-- | 수량N10 | INTEGER | 정수 수량 |
-- | 수량N10,2 | NUMERIC(10,2) | 수량 소수점2자리 |
-- | 수량N12,2 | NUMERIC(12,2) | 수량 소수점2자리 |
-- | 여부C1 | CHAR(1) | Y/N 여부 |
-- | 연월일C8 | CHAR(8) | YYYYMMDD |
-- | 연월일시분초D | TIMESTAMPTZ | 타임스탬프(시간대포함) |
-- | 경도N13,10 | NUMERIC(13,10) | 경도 소수점10자리 |
-- | 위도N12,10 | NUMERIC(12,10) | 위도 소수점10자리 |
-- | 지오메트리PNT | GEOMETRY(Point) | 포인트 공간정보 |
-- | 지오메트리LINE | GEOMETRY(LineStr) | 라인 공간정보 |
-- | JSON | JSONB | JSON 바이너리 |
-- | 정렬순서N5 | INTEGER | 정렬순서 5자리 |
-- ================================================================
-- ============================================================
-- 확장 설치
-- ============================================================
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ============================================================
-- 1. 공통코드 관리
-- ============================================================
-- 공통코드그룹 (CMN_CD_GRP)
-- 시스템 전체에서 사용되는 코드를 그룹 단위로 관리
CREATE TABLE CMN_CD_GRP (
CMN_CD_GRP_ID VARCHAR(20) NOT NULL, -- 공통코드그룹아이디
CMN_CD_GRP_NM VARCHAR(100) NOT NULL, -- 공통코드그룹명
GRP_DC VARCHAR(500), -- 그룹설명
USE_YN CHAR(1) NOT NULL DEFAULT 'Y', -- 사용여부
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_CMN_CD_GRP PRIMARY KEY (CMN_CD_GRP_ID),
CONSTRAINT CK_CMN_CD_GRP_USE_YN CHECK (USE_YN IN ('Y','N'))
);
COMMENT ON TABLE CMN_CD_GRP IS '공통코드그룹';
COMMENT ON COLUMN CMN_CD_GRP.CMN_CD_GRP_ID IS '공통코드그룹아이디';
COMMENT ON COLUMN CMN_CD_GRP.CMN_CD_GRP_NM IS '공통코드그룹명';
COMMENT ON COLUMN CMN_CD_GRP.GRP_DC IS '그룹설명';
COMMENT ON COLUMN CMN_CD_GRP.USE_YN IS '사용여부 (Y:사용, N:미사용)';
COMMENT ON COLUMN CMN_CD_GRP.REG_DTM IS '등록일시';
-- 공통코드 (CMN_CD)
-- 각 그룹 내 개별 코드값을 관리
CREATE TABLE CMN_CD (
CMN_CD_GRP_ID VARCHAR(20) NOT NULL, -- 공통코드그룹아이디
CMN_CD VARCHAR(20) NOT NULL, -- 공통코드
CMN_CD_NM VARCHAR(100) NOT NULL, -- 공통코드명
CD_DC VARCHAR(500), -- 코드설명
SORT_ORD INTEGER DEFAULT 0, -- 정렬순서
USE_YN CHAR(1) NOT NULL DEFAULT 'Y', -- 사용여부
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_CMN_CD PRIMARY KEY (CMN_CD_GRP_ID, CMN_CD),
CONSTRAINT FK_CMN_CD_GRP FOREIGN KEY (CMN_CD_GRP_ID) REFERENCES CMN_CD_GRP(CMN_CD_GRP_ID),
CONSTRAINT CK_CMN_CD_USE_YN CHECK (USE_YN IN ('Y','N'))
);
COMMENT ON TABLE CMN_CD IS '공통코드';
COMMENT ON COLUMN CMN_CD.CMN_CD_GRP_ID IS '공통코드그룹아이디';
COMMENT ON COLUMN CMN_CD.CMN_CD IS '공통코드';
COMMENT ON COLUMN CMN_CD.CMN_CD_NM IS '공통코드명';
COMMENT ON COLUMN CMN_CD.CD_DC IS '코드설명';
COMMENT ON COLUMN CMN_CD.SORT_ORD IS '정렬순서';
COMMENT ON COLUMN CMN_CD.USE_YN IS '사용여부 (Y:사용, N:미사용)';
COMMENT ON COLUMN CMN_CD.REG_DTM IS '등록일시';
-- ============================================================
-- 2. 조직 (ORG)
-- ============================================================
CREATE TABLE ORG (
ORG_SN SERIAL NOT NULL, -- 조직순번
ORG_NM VARCHAR(100) NOT NULL, -- 조직명
ORG_ABBR_NM VARCHAR(20) NOT NULL, -- 조직약칭명
ORG_TP_CD VARCHAR(20) NOT NULL, -- 조직유형코드
UPPER_ORG_SN INTEGER, -- 상위조직순번
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_ORG PRIMARY KEY (ORG_SN),
CONSTRAINT FK_ORG_UPPER FOREIGN KEY (UPPER_ORG_SN) REFERENCES ORG(ORG_SN)
);
COMMENT ON TABLE ORG IS '조직';
COMMENT ON COLUMN ORG.ORG_SN IS '조직순번';
COMMENT ON COLUMN ORG.ORG_NM IS '조직명 (기관 전체 명칭)';
COMMENT ON COLUMN ORG.ORG_ABBR_NM IS '조직약칭명 (기관 약칭)';
COMMENT ON COLUMN ORG.ORG_TP_CD IS '조직유형코드 (ORG_TP: headquarters, regional, station, agency)';
COMMENT ON COLUMN ORG.UPPER_ORG_SN IS '상위조직순번 (상위 기관 참조)';
COMMENT ON COLUMN ORG.REG_DTM IS '등록일시';
-- ============================================================
-- 3. 사용자 (USER_INFO)
-- ※ USER는 PostgreSQL 예약어이므로 USER_INFO 사용
-- ============================================================
CREATE TABLE USER_INFO (
USER_ID UUID NOT NULL DEFAULT uuid_generate_v4(), -- 사용자아이디
USER_ACNT VARCHAR(50) NOT NULL, -- 사용자계정
PSWD_HASH VARCHAR(255) NOT NULL, -- 비밀번호해시
USER_NM VARCHAR(50) NOT NULL, -- 사용자명
RNKP_NM VARCHAR(30), -- 직급명
ORG_SN INTEGER, -- 조직순번
ROLE_CD VARCHAR(20) NOT NULL DEFAULT 'USER', -- 역할코드
ACTV_YN CHAR(1) NOT NULL DEFAULT 'Y', -- 활성여부
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_USER_INFO PRIMARY KEY (USER_ID),
CONSTRAINT UK_USER_ACNT UNIQUE (USER_ACNT),
CONSTRAINT FK_USER_ORG FOREIGN KEY (ORG_SN) REFERENCES ORG(ORG_SN),
CONSTRAINT CK_USER_ROLE_CD CHECK (ROLE_CD IN ('ADMIN','MANAGER','USER')),
CONSTRAINT CK_USER_ACTV_YN CHECK (ACTV_YN IN ('Y','N'))
);
COMMENT ON TABLE USER_INFO IS '사용자정보';
COMMENT ON COLUMN USER_INFO.USER_ID IS '사용자아이디 (UUID)';
COMMENT ON COLUMN USER_INFO.USER_ACNT IS '사용자계정 (로그인 ID)';
COMMENT ON COLUMN USER_INFO.PSWD_HASH IS '비밀번호해시 (bcrypt 해시값)';
COMMENT ON COLUMN USER_INFO.USER_NM IS '사용자명';
COMMENT ON COLUMN USER_INFO.RNKP_NM IS '직급명';
COMMENT ON COLUMN USER_INFO.ORG_SN IS '조직순번 (소속 조직)';
COMMENT ON COLUMN USER_INFO.ROLE_CD IS '역할코드 (ADMIN, MANAGER, USER)';
COMMENT ON COLUMN USER_INFO.ACTV_YN IS '활성여부 (Y:활성, N:비활성)';
COMMENT ON COLUMN USER_INFO.REG_DTM IS '등록일시';
-- ============================================================
-- 4. 사고 (ACDNT)
-- ============================================================
CREATE TABLE ACDNT (
ACDNT_SN SERIAL NOT NULL, -- 사고순번
ACDNT_CD VARCHAR(20) NOT NULL, -- 사고코드
ACDNT_NM VARCHAR(200) NOT NULL, -- 사고명
ACDNT_TP_CD VARCHAR(50) NOT NULL, -- 사고유형코드
ACDNT_STTS_CD VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', -- 사고상태코드
LOC_GEOM GEOMETRY(Point, 4326) NOT NULL, -- 위치지오메트리
LOC_DC VARCHAR(200), -- 위치설명
OCCRN_DTM TIMESTAMPTZ NOT NULL, -- 발생일시
RPT_DTM TIMESTAMPTZ, -- 보고일시
RSPNS_ORG_SN INTEGER, -- 책임조직순번
SVRT_CD VARCHAR(10), -- 심각도코드
RGTR_ID UUID, -- 등록자아이디
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
MDFCN_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 수정일시
CONSTRAINT PK_ACDNT PRIMARY KEY (ACDNT_SN),
CONSTRAINT UK_ACDNT_CD UNIQUE (ACDNT_CD),
CONSTRAINT FK_ACDNT_ORG FOREIGN KEY (RSPNS_ORG_SN) REFERENCES ORG(ORG_SN),
CONSTRAINT FK_ACDNT_RGTR FOREIGN KEY (RGTR_ID) REFERENCES USER_INFO(USER_ID),
CONSTRAINT CK_ACDNT_STTS CHECK (ACDNT_STTS_CD IN ('ACTIVE','MONITORING','CLOSED')),
CONSTRAINT CK_ACDNT_SVRT CHECK (SVRT_CD IN ('DANGER','ALERT','CAUTION','INTEREST'))
);
COMMENT ON TABLE ACDNT IS '사고';
COMMENT ON COLUMN ACDNT.ACDNT_SN IS '사고순번';
COMMENT ON COLUMN ACDNT.ACDNT_CD IS '사고코드 (예: INC-2025-0042)';
COMMENT ON COLUMN ACDNT.ACDNT_NM IS '사고명';
COMMENT ON COLUMN ACDNT.ACDNT_TP_CD IS '사고유형코드 (ACDNT_TP: 유조선충돌, 좌초 등)';
COMMENT ON COLUMN ACDNT.ACDNT_STTS_CD IS '사고상태코드 (ACTIVE:진행, MONITORING:감시, CLOSED:종료)';
COMMENT ON COLUMN ACDNT.LOC_GEOM IS '위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN ACDNT.LOC_DC IS '위치설명 (텍스트 위치 표기)';
COMMENT ON COLUMN ACDNT.OCCRN_DTM IS '발생일시';
COMMENT ON COLUMN ACDNT.RPT_DTM IS '보고일시';
COMMENT ON COLUMN ACDNT.RSPNS_ORG_SN IS '책임조직순번 (담당 기관)';
COMMENT ON COLUMN ACDNT.SVRT_CD IS '심각도코드 (DANGER:위험, ALERT:경계, CAUTION:주의, INTEREST:관심)';
COMMENT ON COLUMN ACDNT.RGTR_ID IS '등록자아이디';
COMMENT ON COLUMN ACDNT.REG_DTM IS '등록일시';
COMMENT ON COLUMN ACDNT.MDFCN_DTM IS '수정일시';
-- ============================================================
-- 5. 유출정보 (SPIL_DATA)
-- ============================================================
CREATE TABLE SPIL_DATA (
SPIL_DATA_SN SERIAL NOT NULL, -- 유출정보순번
ACDNT_SN INTEGER NOT NULL, -- 사고순번
OIL_TP_CD VARCHAR(50) NOT NULL, -- 유종코드
SPIL_QTY NUMERIC(14,10), -- 유출량
SPIL_UNIT_CD VARCHAR(10) DEFAULT 'KL', -- 유출단위코드
SPIL_TP_CD VARCHAR(20), -- 유출유형코드
SPIL_LOC_GEOM GEOMETRY(Point, 4326), -- 유출위치지오메트리
FCST_HR INTEGER, -- 예측시간
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
IMG_RSLT_DATA JSONB, -- 이미지 분석 결과 (2024-06 추가)
CONSTRAINT PK_SPIL_DATA PRIMARY KEY (SPIL_DATA_SN),
CONSTRAINT FK_SPIL_ACDNT FOREIGN KEY (ACDNT_SN) REFERENCES ACDNT(ACDNT_SN) ON DELETE CASCADE
);
COMMENT ON TABLE SPIL_DATA IS '유출정보';
COMMENT ON COLUMN SPIL_DATA.SPIL_DATA_SN IS '유출정보순번';
COMMENT ON COLUMN SPIL_DATA.ACDNT_SN IS '사고순번 (사고 참조)';
COMMENT ON COLUMN SPIL_DATA.OIL_TP_CD IS '유종코드 (OIL_TP: 벙커C유, 경유, 원유 등)';
COMMENT ON COLUMN SPIL_DATA.SPIL_QTY IS '유출량';
COMMENT ON COLUMN SPIL_DATA.SPIL_UNIT_CD IS '유출단위코드 (KL:킬로리터, L:리터, BBL:배럴)';
COMMENT ON COLUMN SPIL_DATA.SPIL_TP_CD IS '유출유형코드 (SPIL_TP: 연속유출, 순간유출 등)';
COMMENT ON COLUMN SPIL_DATA.SPIL_LOC_GEOM IS '유출위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN SPIL_DATA.FCST_HR IS '예측시간 (시간 단위)';
COMMENT ON COLUMN SPIL_DATA.REG_DTM IS '등록일시';
-- ============================================================
-- 6. 예측실행 (PRED_EXEC)
-- ============================================================
CREATE TABLE PRED_EXEC (
PRED_EXEC_SN SERIAL NOT NULL, -- 예측실행순번
SPIL_DATA_SN INTEGER, -- 유출정보순번 (NULL 허용 — 사고 미연결 단독 실행 대응)
ACDNT_SN INTEGER NOT NULL, -- 사고순번 (사고 참조, 유출정보 미연결 시에도 사고는 필수)
ALGO_CD VARCHAR(20) NOT NULL, -- 알고리즘코드
EXEC_STTS_CD VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- 실행상태코드
BGNG_DTM TIMESTAMPTZ, -- 시작일시
CMPL_DTM TIMESTAMPTZ, -- 완료일시
REQD_SEC INTEGER, -- 소요시간초
RSLT_DATA JSONB, -- 결과데이터
ERR_MSG TEXT, -- 오류메시지
EXEC_NM VARCHAR(100), -- 실행명
CONSTRAINT PK_PRED_EXEC PRIMARY KEY (PRED_EXEC_SN),
CONSTRAINT FK_PRED_SPIL FOREIGN KEY (SPIL_DATA_SN) REFERENCES SPIL_DATA(SPIL_DATA_SN) ON DELETE CASCADE,
CONSTRAINT CK_PRED_STTS CHECK (EXEC_STTS_CD IN ('PENDING','RUNNING','COMPLETED','FAILED'))
);
COMMENT ON TABLE PRED_EXEC IS '예측실행';
COMMENT ON COLUMN PRED_EXEC.PRED_EXEC_SN IS '예측실행순번';
COMMENT ON COLUMN PRED_EXEC.SPIL_DATA_SN IS '유출정보순번 (FK → SPIL_DATA, NULL 허용)';
COMMENT ON COLUMN PRED_EXEC.ACDNT_SN IS '사고순번 (사고 참조)';
COMMENT ON COLUMN PRED_EXEC.ALGO_CD IS '알고리즘코드 (ALGO: GNOME, OSCAR, OPENDRIFT 등)';
COMMENT ON COLUMN PRED_EXEC.EXEC_STTS_CD IS '실행상태코드 (PENDING:대기, RUNNING:실행중, COMPLETED:완료, FAILED:실패)';
COMMENT ON COLUMN PRED_EXEC.BGNG_DTM IS '시작일시';
COMMENT ON COLUMN PRED_EXEC.CMPL_DTM IS '완료일시';
COMMENT ON COLUMN PRED_EXEC.REQD_SEC IS '소요시간초 (실행 소요 시간, 초 단위)';
COMMENT ON COLUMN PRED_EXEC.RSLT_DATA IS '결과데이터 (JSON 형식 예측 결과)';
COMMENT ON COLUMN PRED_EXEC.ERR_MSG IS '오류메시지';
COMMENT ON COLUMN PRED_EXEC.EXEC_NM IS '실행명 (EXPC_{timestamp} 형식, OpenDrift 연동용)';
-- ============================================================
-- 7. 오일펜스배치 (BOOM_LINE)
-- ============================================================
CREATE TABLE BOOM_LINE (
BOOM_SN SERIAL NOT NULL, -- 오일펜스순번
ACDNT_SN INTEGER NOT NULL, -- 사고순번
BOOM_NM VARCHAR(100) NOT NULL, -- 오일펜스명
PRIORT_CD VARCHAR(20), -- 우선순위코드
LEN_M NUMERIC(10,2), -- 길이미터
LINE_GEOM GEOMETRY(LineString, 4326), -- 라인지오메트리
DPLY_STTS_CD VARCHAR(20) NOT NULL DEFAULT 'PLANNED', -- 배치상태코드
EFCNC_PCT NUMERIC(5,2), -- 효율퍼센트
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
MDFCN_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 수정일시
CONSTRAINT PK_BOOM_LINE PRIMARY KEY (BOOM_SN),
CONSTRAINT FK_BOOM_ACDNT FOREIGN KEY (ACDNT_SN) REFERENCES ACDNT(ACDNT_SN) ON DELETE CASCADE,
CONSTRAINT CK_BOOM_PRIORT CHECK (PRIORT_CD IN ('CRITICAL','HIGH','MEDIUM','LOW')),
CONSTRAINT CK_BOOM_STTS CHECK (DPLY_STTS_CD IN ('PLANNED','DEPLOYING','DEPLOYED','REMOVED'))
);
COMMENT ON TABLE BOOM_LINE IS '오일펜스배치';
COMMENT ON COLUMN BOOM_LINE.BOOM_SN IS '오일펜스순번';
COMMENT ON COLUMN BOOM_LINE.ACDNT_SN IS '사고순번 (사고 참조)';
COMMENT ON COLUMN BOOM_LINE.BOOM_NM IS '오일펜스명';
COMMENT ON COLUMN BOOM_LINE.PRIORT_CD IS '우선순위코드 (CRITICAL:긴급, HIGH:높음, MEDIUM:보통, LOW:낮음)';
COMMENT ON COLUMN BOOM_LINE.LEN_M IS '길이미터 (오일펜스 총 길이, 미터)';
COMMENT ON COLUMN BOOM_LINE.LINE_GEOM IS '라인지오메트리 (EPSG:4326 LineString)';
COMMENT ON COLUMN BOOM_LINE.DPLY_STTS_CD IS '배치상태코드 (PLANNED:계획, DEPLOYING:배치중, DEPLOYED:배치완료, REMOVED:회수)';
COMMENT ON COLUMN BOOM_LINE.EFCNC_PCT IS '효율퍼센트 (방제 효율, %)';
COMMENT ON COLUMN BOOM_LINE.REG_DTM IS '등록일시';
COMMENT ON COLUMN BOOM_LINE.MDFCN_DTM IS '수정일시';
-- ============================================================
-- 8. 해안조사구역 (CST_SRVY_ZONE)
-- ============================================================
CREATE TABLE CST_SRVY_ZONE (
CST_SRVY_ZONE_SN SERIAL NOT NULL, -- 해안조사구역순번
ZONE_CD VARCHAR(20) NOT NULL, -- 구역코드
ZONE_NM VARCHAR(100) NOT NULL, -- 구역명
JRSD_ORG_SN INTEGER, -- 관할조직순번
ZONE_DC VARCHAR(500), -- 구역설명
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_CST_SRVY_ZONE PRIMARY KEY (CST_SRVY_ZONE_SN),
CONSTRAINT UK_ZONE_CD UNIQUE (ZONE_CD),
CONSTRAINT FK_ZONE_ORG FOREIGN KEY (JRSD_ORG_SN) REFERENCES ORG(ORG_SN)
);
COMMENT ON TABLE CST_SRVY_ZONE IS '해안조사구역';
COMMENT ON COLUMN CST_SRVY_ZONE.CST_SRVY_ZONE_SN IS '해안조사구역순번';
COMMENT ON COLUMN CST_SRVY_ZONE.ZONE_CD IS '구역코드 (예: JJAW, JJAN 등)';
COMMENT ON COLUMN CST_SRVY_ZONE.ZONE_NM IS '구역명 (예: 제주시 서부, 서귀포시 동부 등)';
COMMENT ON COLUMN CST_SRVY_ZONE.JRSD_ORG_SN IS '관할조직순번 (관할 해경 기관)';
COMMENT ON COLUMN CST_SRVY_ZONE.ZONE_DC IS '구역설명';
COMMENT ON COLUMN CST_SRVY_ZONE.REG_DTM IS '등록일시';
-- ============================================================
-- 9. 해안구간 (CST_SECT)
-- ============================================================
CREATE TABLE CST_SECT (
CST_SECT_SN SERIAL NOT NULL, -- 해안구간순번
CST_SRVY_ZONE_SN INTEGER NOT NULL, -- 해안조사구역순번
SECT_CD VARCHAR(20) NOT NULL, -- 구간코드
SECT_NM VARCHAR(100), -- 구간명
CST_TP_CD VARCHAR(20), -- 해안유형코드
LEN_M NUMERIC(10,2), -- 길이미터
SNSTVT_CD VARCHAR(10), -- 민감도코드
SRVY_STTS_CD VARCHAR(20) DEFAULT 'PENDING', -- 조사상태코드
BGNG_LAT NUMERIC(12,10), -- 시작위도
BGNG_LON NUMERIC(13,10), -- 시작경도
END_LAT NUMERIC(12,10), -- 종료위도
END_LON NUMERIC(13,10), -- 종료경도
BGNG_LOC_GEOM GEOMETRY(Point, 4326), -- 시작위치지오메트리
END_LOC_GEOM GEOMETRY(Point, 4326), -- 종료위치지오메트리
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
MDFCN_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 수정일시
CONSTRAINT PK_CST_SECT PRIMARY KEY (CST_SECT_SN),
CONSTRAINT UK_SECT_CD UNIQUE (SECT_CD),
CONSTRAINT FK_SECT_ZONE FOREIGN KEY (CST_SRVY_ZONE_SN) REFERENCES CST_SRVY_ZONE(CST_SRVY_ZONE_SN)
);
COMMENT ON TABLE CST_SECT IS '해안구간';
COMMENT ON COLUMN CST_SECT.CST_SECT_SN IS '해안구간순번';
COMMENT ON COLUMN CST_SECT.CST_SRVY_ZONE_SN IS '해안조사구역순번 (구역 참조)';
COMMENT ON COLUMN CST_SECT.SECT_CD IS '구간코드 (예: JJAW-1, JJAW-2 등)';
COMMENT ON COLUMN CST_SECT.SECT_NM IS '구간명';
COMMENT ON COLUMN CST_SECT.CST_TP_CD IS '해안유형코드 (CST_TP: 암반, 자갈, 모래, 혼합 등)';
COMMENT ON COLUMN CST_SECT.LEN_M IS '길이미터 (해안구간 길이, 미터)';
COMMENT ON COLUMN CST_SECT.SNSTVT_CD IS '민감도코드 (SNSTVT: HIGH, MEDIUM, LOW)';
COMMENT ON COLUMN CST_SECT.SRVY_STTS_CD IS '조사상태코드 (PENDING:미조사, PROGRESS:진행중, COMPLETED:완료)';
COMMENT ON COLUMN CST_SECT.BGNG_LAT IS '시작위도';
COMMENT ON COLUMN CST_SECT.BGNG_LON IS '시작경도';
COMMENT ON COLUMN CST_SECT.END_LAT IS '종료위도';
COMMENT ON COLUMN CST_SECT.END_LON IS '종료경도';
COMMENT ON COLUMN CST_SECT.BGNG_LOC_GEOM IS '시작위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN CST_SECT.END_LOC_GEOM IS '종료위치지오메트리 (EPSG:4326 Point)';
COMMENT ON COLUMN CST_SECT.REG_DTM IS '등록일시';
COMMENT ON COLUMN CST_SECT.MDFCN_DTM IS '수정일시';
-- ============================================================
-- 10. SCAT조사 (SCAT_SRVY)
-- ============================================================
CREATE TABLE SCAT_SRVY (
SCAT_SRVY_SN SERIAL NOT NULL, -- SCAT조사순번
CST_SECT_SN INTEGER NOT NULL, -- 해안구간순번
ACDNT_SN INTEGER, -- 사고순번
SRVY_YMD CHAR(8), -- 조사일자 (YYYYMMDD)
SRVY_TP_CD VARCHAR(20), -- 조사유형코드
SRVY_PHASE_CD VARCHAR(20), -- 조사단계코드
POLUT_CD VARCHAR(20), -- 오염도코드
SRVYR_ID UUID, -- 조사자아이디
RMK VARCHAR(500), -- 비고
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_SCAT_SRVY PRIMARY KEY (SCAT_SRVY_SN),
CONSTRAINT FK_SCAT_SECT FOREIGN KEY (CST_SECT_SN) REFERENCES CST_SECT(CST_SECT_SN),
CONSTRAINT FK_SCAT_ACDNT FOREIGN KEY (ACDNT_SN) REFERENCES ACDNT(ACDNT_SN),
CONSTRAINT FK_SCAT_SRVYR FOREIGN KEY (SRVYR_ID) REFERENCES USER_INFO(USER_ID)
);
COMMENT ON TABLE SCAT_SRVY IS 'SCAT조사';
COMMENT ON COLUMN SCAT_SRVY.SCAT_SRVY_SN IS 'SCAT조사순번';
COMMENT ON COLUMN SCAT_SRVY.CST_SECT_SN IS '해안구간순번 (해안구간 참조)';
COMMENT ON COLUMN SCAT_SRVY.ACDNT_SN IS '사고순번 (관련 사고 참조)';
COMMENT ON COLUMN SCAT_SRVY.SRVY_YMD IS '조사일자 (YYYYMMDD 저장형식)';
COMMENT ON COLUMN SCAT_SRVY.SRVY_TP_CD IS '조사유형코드 (SRVY_TP: Pre-SCAT, SCAT, Post-SCAT)';
COMMENT ON COLUMN SCAT_SRVY.SRVY_PHASE_CD IS '조사단계코드 (SRVY_PHASE: 1차, 2차, 3차 등)';
COMMENT ON COLUMN SCAT_SRVY.POLUT_CD IS '오염도코드 (POLUT: HEAVY, MODERATE, LIGHT, CLEAN)';
COMMENT ON COLUMN SCAT_SRVY.SRVYR_ID IS '조사자아이디';
COMMENT ON COLUMN SCAT_SRVY.RMK IS '비고';
COMMENT ON COLUMN SCAT_SRVY.REG_DTM IS '등록일시';
-- ============================================================
-- 11. SCAT조사사진 (SCAT_SRVY_PHOTO)
-- ============================================================
CREATE TABLE SCAT_SRVY_PHOTO (
SCAT_PHOTO_SN SERIAL NOT NULL, -- SCAT조사사진순번
SCAT_SRVY_SN INTEGER NOT NULL, -- SCAT조사순번
PHOTO_FILE_PATH VARCHAR(500) NOT NULL, -- 사진파일경로
PHOTO_DC VARCHAR(200), -- 사진설명
TAKNG_DTM TIMESTAMPTZ, -- 촬영일시
SORT_ORD INTEGER DEFAULT 0, -- 정렬순서
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_SCAT_PHOTO PRIMARY KEY (SCAT_PHOTO_SN),
CONSTRAINT FK_PHOTO_SRVY FOREIGN KEY (SCAT_SRVY_SN) REFERENCES SCAT_SRVY(SCAT_SRVY_SN) ON DELETE CASCADE
);
COMMENT ON TABLE SCAT_SRVY_PHOTO IS 'SCAT조사사진';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.SCAT_PHOTO_SN IS 'SCAT조사사진순번';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.SCAT_SRVY_SN IS 'SCAT조사순번 (SCAT조사 참조)';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.PHOTO_FILE_PATH IS '사진파일경로';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.PHOTO_DC IS '사진설명';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.TAKNG_DTM IS '촬영일시';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.SORT_ORD IS '정렬순서';
COMMENT ON COLUMN SCAT_SRVY_PHOTO.REG_DTM IS '등록일시';
-- ============================================================
-- 12. HNS물질정보 (HNS_SBST)
-- ============================================================
CREATE TABLE HNS_SBST (
HNS_SBST_SN SERIAL NOT NULL, -- HNS물질순번
SBST_NM VARCHAR(200) NOT NULL, -- 물질명
SBST_ENG_NM VARCHAR(200), -- 물질영문명
CAS_NO VARCHAR(20), -- CAS번호
UN_NO VARCHAR(10), -- UN번호
RISK_GRD_CD VARCHAR(10), -- 위험등급코드
PHYS_STATE_CD VARCHAR(20), -- 물리상태코드
DNST NUMERIC(10,4), -- 밀도
VAPOR_PRSR NUMERIC(12,4), -- 증기압
WATER_SLBLT_CD VARCHAR(20), -- 수용성코드
TOXICITY_CD VARCHAR(20), -- 독성코드
SBST_DC TEXT, -- 물질설명
REG_DTM TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 등록일시
CONSTRAINT PK_HNS_SBST PRIMARY KEY (HNS_SBST_SN)
);
COMMENT ON TABLE HNS_SBST IS 'HNS물질정보';
COMMENT ON COLUMN HNS_SBST.HNS_SBST_SN IS 'HNS물질순번';
COMMENT ON COLUMN HNS_SBST.SBST_NM IS '물질명 (한글명)';
COMMENT ON COLUMN HNS_SBST.SBST_ENG_NM IS '물질영문명';
COMMENT ON COLUMN HNS_SBST.CAS_NO IS 'CAS번호 (화학물질등록번호)';
COMMENT ON COLUMN HNS_SBST.UN_NO IS 'UN번호 (위험물 식별번호)';
COMMENT ON COLUMN HNS_SBST.RISK_GRD_CD IS '위험등급코드';
COMMENT ON COLUMN HNS_SBST.PHYS_STATE_CD IS '물리상태코드 (SOLID, LIQUID, GAS)';
COMMENT ON COLUMN HNS_SBST.DNST IS '밀도 (g/cm³)';
COMMENT ON COLUMN HNS_SBST.VAPOR_PRSR IS '증기압 (mmHg)';
COMMENT ON COLUMN HNS_SBST.WATER_SLBLT_CD IS '수용성코드 (SOLUBLE, PARTIAL, INSOLUBLE)';
COMMENT ON COLUMN HNS_SBST.TOXICITY_CD IS '독성코드 (HIGH, MEDIUM, LOW)';
COMMENT ON COLUMN HNS_SBST.SBST_DC IS '물질설명';
COMMENT ON COLUMN HNS_SBST.REG_DTM IS '등록일시';
-- ============================================================
-- 13. 인덱스
-- ============================================================
-- 공간 인덱스 (GIST)
CREATE INDEX IDX_ACDNT_LOC_GEOM ON ACDNT USING GIST(LOC_GEOM);
CREATE INDEX IDX_SPIL_LOC_GEOM ON SPIL_DATA USING GIST(SPIL_LOC_GEOM);
CREATE INDEX IDX_BOOM_LINE_GEOM ON BOOM_LINE USING GIST(LINE_GEOM);
CREATE INDEX IDX_SECT_BGNG_GEOM ON CST_SECT USING GIST(BGNG_LOC_GEOM);
CREATE INDEX IDX_SECT_END_GEOM ON CST_SECT USING GIST(END_LOC_GEOM);
-- 상태 코드 인덱스
CREATE INDEX IDX_ACDNT_STTS ON ACDNT (ACDNT_STTS_CD);
CREATE INDEX IDX_PRED_STTS ON PRED_EXEC (EXEC_STTS_CD);
CREATE INDEX IDX_BOOM_STTS ON BOOM_LINE (DPLY_STTS_CD);
CREATE INDEX IDX_SECT_SRVY_STTS ON CST_SECT (SRVY_STTS_CD);
-- 외래키 인덱스
CREATE INDEX IDX_USER_ORG_SN ON USER_INFO (ORG_SN);
CREATE INDEX IDX_ACDNT_RSPNS_ORG ON ACDNT (RSPNS_ORG_SN);
CREATE INDEX IDX_SPIL_ACDNT_SN ON SPIL_DATA (ACDNT_SN);
CREATE INDEX IDX_PRED_SPIL_SN ON PRED_EXEC (SPIL_DATA_SN);
CREATE INDEX IDX_BOOM_ACDNT_SN ON BOOM_LINE (ACDNT_SN);
CREATE INDEX IDX_SECT_ZONE_SN ON CST_SECT (CST_SRVY_ZONE_SN);
CREATE INDEX IDX_SCAT_SECT_SN ON SCAT_SRVY (CST_SECT_SN);
CREATE INDEX IDX_SCAT_ACDNT_SN ON SCAT_SRVY (ACDNT_SN);
CREATE INDEX IDX_PHOTO_SRVY_SN ON SCAT_SRVY_PHOTO (SCAT_SRVY_SN);
-- 코드 테이블 인덱스
CREATE INDEX IDX_CMN_CD_GRP_USE ON CMN_CD_GRP (USE_YN);
CREATE INDEX IDX_CMN_CD_USE ON CMN_CD (USE_YN);
-- 텍스트 검색 인덱스
CREATE INDEX IDX_ACDNT_NM_TRGM ON ACDNT USING GIN(ACDNT_NM gin_trgm_ops);
CREATE INDEX IDX_HNS_SBST_NM_TRGM ON HNS_SBST USING GIN(SBST_NM gin_trgm_ops);
-- ============================================================
-- 14. 공통코드 데이터
-- ============================================================
-- 조직유형 (ORG_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ORG_TP', '조직유형', '조직의 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ORG_TP', 'HEADQUARTERS', '본청', 1),
('ORG_TP', 'REGIONAL', '지방청', 2),
('ORG_TP', 'STATION', '해양경찰서', 3),
('ORG_TP', 'AGENCY', '유관기관', 4);
-- 사용자역할 (USER_ROLE)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('USER_ROLE', '사용자역할', '사용자의 시스템 역할을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('USER_ROLE', 'ADMIN', '관리자', 1),
('USER_ROLE', 'MANAGER', '운영자', 2),
('USER_ROLE', 'USER', '일반사용자', 3);
-- 사고유형 (ACDNT_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ACDNT_TP', '사고유형', '해양사고의 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ACDNT_TP', 'COLLISION', '충돌', 1),
('ACDNT_TP', 'GROUNDING', '좌초', 2),
('ACDNT_TP', 'SINKING', '침몰', 3),
('ACDNT_TP', 'LEAK', '누출', 4),
('ACDNT_TP', 'EXPLOSION', '폭발', 5),
('ACDNT_TP', 'ETC', '기타', 99);
-- 사고상태 (ACDNT_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ACDNT_STTS', '사고상태', '사고의 진행 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ACDNT_STTS', 'ACTIVE', '진행중', 1),
('ACDNT_STTS', 'MONITORING', '감시중', 2),
('ACDNT_STTS', 'CLOSED', '종료', 3);
-- 심각도 (SVRT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SVRT', '심각도', '사고의 심각도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SVRT', 'DANGER', '위험', 1),
('SVRT', 'ALERT', '경계', 2),
('SVRT', 'CAUTION', '주의', 3),
('SVRT', 'INTEREST', '관심', 4);
-- 유종 (OIL_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('OIL_TP', '유종', '유출유의 종류를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('OIL_TP', 'CRUDE', '원유', 1),
('OIL_TP', 'BUNKER_C', '벙커C유', 2),
('OIL_TP', 'DIESEL', '경유', 3),
('OIL_TP', 'GASOLINE', '휘발유', 4),
('OIL_TP', 'KEROSENE', '등유', 5),
('OIL_TP', 'LUBE', '윤활유', 6),
('OIL_TP', 'ETC', '기타', 99);
-- 유출단위 (SPIL_UNIT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SPIL_UNIT', '유출단위', '유출량의 측정 단위를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SPIL_UNIT', 'KL', '킬로리터', 1),
('SPIL_UNIT', 'L', '리터', 2),
('SPIL_UNIT', 'BBL', '배럴', 3),
('SPIL_UNIT', 'TON', '', 4);
-- 유출유형 (SPIL_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SPIL_TP', '유출유형', '유출의 형태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SPIL_TP', 'CONTINUOUS', '연속유출', 1),
('SPIL_TP', 'INSTANTANEOUS','순간유출', 2);
-- 예측알고리즘 (ALGO)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('ALGO', '예측알고리즘', '유출 확산 예측에 사용되는 알고리즘 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('ALGO', 'GNOME', 'GNOME 모델', 1),
('ALGO', 'OSCAR', 'OSCAR 모델', 2),
('ALGO', 'MOHID', 'MOHID 모델', 3);
-- 실행상태 (EXEC_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('EXEC_STTS', '실행상태', '예측 실행의 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('EXEC_STTS', 'PENDING', '대기', 1),
('EXEC_STTS', 'RUNNING', '실행중', 2),
('EXEC_STTS', 'COMPLETED', '완료', 3),
('EXEC_STTS', 'FAILED', '실패', 4);
-- 오일펜스우선순위 (BOOM_PRIORT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('BOOM_PRIORT', '오일펜스우선순위', '오일펜스 배치 우선순위를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('BOOM_PRIORT', 'CRITICAL', '긴급', 1),
('BOOM_PRIORT', 'HIGH', '높음', 2),
('BOOM_PRIORT', 'MEDIUM', '보통', 3),
('BOOM_PRIORT', 'LOW', '낮음', 4);
-- 오일펜스배치상태 (DPLY_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('DPLY_STTS', '배치상태', '오일펜스의 배치 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('DPLY_STTS', 'PLANNED', '계획', 1),
('DPLY_STTS', 'DEPLOYING', '배치중', 2),
('DPLY_STTS', 'DEPLOYED', '배치완료', 3),
('DPLY_STTS', 'REMOVED', '회수', 4);
-- 해안유형 (CST_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('CST_TP', '해안유형', '해안의 지형 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('CST_TP', 'ROCK', '암반해안', 1),
('CST_TP', 'GRAVEL', '자갈해안', 2),
('CST_TP', 'SAND', '모래해안', 3),
('CST_TP', 'MUD', '갯벌', 4),
('CST_TP', 'MIXED', '혼합해안', 5),
('CST_TP', 'SEAWALL', '인공구조물', 6),
('CST_TP', 'TETRAPOD', '테트라포드', 7);
-- 민감도 (SNSTVT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SNSTVT', '민감도', '해안구간의 환경 민감도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SNSTVT', 'HIGH', '', 1),
('SNSTVT', 'MEDIUM', '', 2),
('SNSTVT', 'LOW', '', 3);
-- 조사상태 (SRVY_STTS)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SRVY_STTS', '조사상태', '해안구간 조사의 진행 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SRVY_STTS', 'PENDING', '미조사', 1),
('SRVY_STTS', 'PROGRESS', '진행중', 2),
('SRVY_STTS', 'COMPLETED', '완료', 3);
-- 조사유형 (SRVY_TP)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SRVY_TP', '조사유형', 'SCAT 조사의 유형을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SRVY_TP', 'PRE_SCAT', 'Pre-SCAT', 1),
('SRVY_TP', 'SCAT', 'SCAT', 2),
('SRVY_TP', 'POST_SCAT', 'Post-SCAT', 3);
-- 조사단계 (SRVY_PHASE)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('SRVY_PHASE', '조사단계', 'SCAT 조사의 단계를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('SRVY_PHASE', 'PHASE_1', '1차 조사', 1),
('SRVY_PHASE', 'PHASE_2', '2차 조사', 2),
('SRVY_PHASE', 'PHASE_3', '3차 조사', 3);
-- 오염도 (POLUT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('POLUT', '오염도', '해안구간의 오염 정도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('POLUT', 'HEAVY', '심각', 1),
('POLUT', 'MODERATE', '보통', 2),
('POLUT', 'LIGHT', '경미', 3),
('POLUT', 'CLEAN', '깨끗', 4);
-- 물리상태 (PHYS_STATE)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('PHYS_STATE', '물리상태', '화학물질의 물리적 상태를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('PHYS_STATE', 'SOLID', '고체', 1),
('PHYS_STATE', 'LIQUID', '액체', 2),
('PHYS_STATE', 'GAS', '기체', 3);
-- 수용성 (WATER_SLBLT)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('WATER_SLBLT', '수용성', '화학물질의 수용성 정도를 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('WATER_SLBLT', 'SOLUBLE', '수용성', 1),
('WATER_SLBLT', 'PARTIAL', '부분용해', 2),
('WATER_SLBLT', 'INSOLUBLE', '불용성', 3);
-- 독성 (TOXICITY)
INSERT INTO CMN_CD_GRP (CMN_CD_GRP_ID, CMN_CD_GRP_NM, GRP_DC) VALUES
('TOXICITY', '독성', '화학물질의 독성 수준을 구분하는 코드');
INSERT INTO CMN_CD (CMN_CD_GRP_ID, CMN_CD, CMN_CD_NM, SORT_ORD) VALUES
('TOXICITY', 'HIGH', '고독성', 1),
('TOXICITY', 'MEDIUM', '중독성', 2),
('TOXICITY', 'LOW', '저독성', 3);
-- ============================================================
-- 15. 샘플 데이터
-- ============================================================
-- 조직
INSERT INTO ORG (ORG_NM, ORG_ABBR_NM, ORG_TP_CD) VALUES
('해양경찰청', '해경청', 'HEADQUARTERS'),
('남해지방해양경찰청', '남해청', 'REGIONAL'),
('제주지방해양경찰청', '제주청', 'REGIONAL'),
('여수해양경찰서', '여수서', 'STATION'),
('서귀포해양경찰서', '서귀포서', 'STATION'),
('제주해양경찰서', '제주서', 'STATION');
-- 상위조직 설정
UPDATE ORG SET UPPER_ORG_SN = 1 WHERE ORG_SN IN (2, 3);
UPDATE ORG SET UPPER_ORG_SN = 2 WHERE ORG_SN = 4;
UPDATE ORG SET UPPER_ORG_SN = 3 WHERE ORG_SN IN (5, 6);
-- 관리자 (비밀번호: admin1234)
INSERT INTO USER_INFO (USER_ACNT, PSWD_HASH, USER_NM, RNKP_NM, ORG_SN, ROLE_CD) VALUES
('admin', '$2b$10$rN3qJ9qZ5yH.KfxYvYvW0.VxJ8K5vN8qJ9qZ5yH.KfxYvYvW0.VxJ8', '관리자', '경정', 1, 'ADMIN');
-- 샘플 사고 (여수 앞바다)
INSERT INTO ACDNT (ACDNT_CD, ACDNT_NM, ACDNT_TP_CD, LOC_GEOM, LOC_DC, OCCRN_DTM, RSPNS_ORG_SN, SVRT_CD) VALUES
('INC-2025-0042', '여수 앞바다 유조선 충돌', 'COLLISION',
ST_SetSRID(ST_MakePoint(127.8, 34.5), 4326),
'여수 돌산 남방 5NM', '2025-02-10 06:30:00+09', 4, 'DANGER');
-- ============================================================
-- 데이터베이스 코멘트
-- ============================================================
COMMENT ON DATABASE wing IS 'WING 해양환경 위기대응 통합시스템 - 공공데이터베이스 표준화 관리 매뉴얼(2021.06) 적용';