-- 009: 선단/어구그룹 폴리곤 스냅샷 테이블 -- 5분 주기 APPEND, 7일 보존 SET search_path TO kcg, public; CREATE TABLE IF NOT EXISTS kcg.group_polygon_snapshots ( id BIGSERIAL PRIMARY KEY, -- 그룹 식별 group_type VARCHAR(20) NOT NULL, -- FLEET | GEAR_IN_ZONE | GEAR_OUT_ZONE group_key VARCHAR(100) NOT NULL, -- fleet: company_id, gear: parent_name group_label TEXT, -- 표시명 (회사명 또는 모선명) -- 스냅샷 시각 snapshot_time TIMESTAMPTZ NOT NULL, -- PostGIS geometry polygon geometry(Polygon, 4326), -- convex hull + buffer (3점 미만 시 NULL) center_point geometry(Point, 4326), -- 중심점 -- 지표 area_sq_nm DOUBLE PRECISION DEFAULT 0, -- 면적 (제곱 해리) member_count INT NOT NULL DEFAULT 0, -- 소속 선박/어구 수 -- 수역 분류 (어구그룹용) zone_id VARCHAR(20), -- ZONE_I ~ ZONE_IV | OUTSIDE zone_name TEXT, -- 멤버 상세 (JSONB 배열) members JSONB NOT NULL DEFAULT '[]', -- [{mmsi, name, lat, lon, sog, cog, role, isParent}] -- 색상 힌트 color VARCHAR(20), created_at TIMESTAMPTZ DEFAULT NOW() ); -- 조회 성능 인덱스 CREATE INDEX IF NOT EXISTS idx_gps_type_time ON kcg.group_polygon_snapshots(group_type, snapshot_time DESC); CREATE INDEX IF NOT EXISTS idx_gps_key_time ON kcg.group_polygon_snapshots(group_key, snapshot_time DESC); CREATE INDEX IF NOT EXISTS idx_gps_snapshot_time ON kcg.group_polygon_snapshots(snapshot_time DESC); -- 공간 인덱스 CREATE INDEX IF NOT EXISTS idx_gps_polygon_gist ON kcg.group_polygon_snapshots USING GIST(polygon);