촬영 요청/Feasibility 평가는 고객 요청 접수부터 가능성 평가, 확률 추정, 사람 리뷰, 리스크 관리, 보고서 생성까지의 업무 도메인이다.
요청 접수: AOI, 시간창, 품질 조건, SLA를 포함한 촬영 요청을 등록한다.AOI 분할: 대면적 요청을 타일로 분할해 계산 복잡도를 제어한다.평가 실행 관리: 궤도, 기상, 제약 스냅샷을 캡처해 재현 가능한 실행 단위를 만든다.후보 생성: 위성, 패스, 타일을 조합해 촬영 후보를 생성한다.기준 체크: 평가 기준별 PASS/FAIL/WARN과 점수를 기록한다.충돌 분석: 기존 정책, 우선순위, 일정과 충돌하는 후보를 분석한다.확률 추정: 성공 확률, 품질 확률, 구름량, 다운링크 정시성 등을 추정한다.리뷰 및 승인: 자동 평가 결과를 사람이 검토하고 최종 판단한다.리스크 및 보고: 리스크와 완화 계획을 기록하고 feasibility 보고서를 발행한다.IMAGING_REQUESTAOI_TILEFEASIBILITY_RUNORBIT_SNAPSHOTWEATHER_SNAPSHOTOP_CONSTRAINT_SNAPSHOTIMAGING_CANDIDATEFEASIBILITY_CRITERIONFEASIBILITY_CHECK_RESULTCONFLICT_ANALYSISCONFLICT_ITEMPROBABILITY_MODELPROBABILITY_ESTIMATEMODEL_EVIDENCE_LINEAGECLOUD_COVER_ESTIMATEDOWNLINK_WINDOW_CANDIDATEDOWNLINK_FEASIBILITYREVIEW_TASKREVIEW_DECISIONRISK_REGISTERFEASIBILITY_REPORTREPORT_ATTACHMENTerDiagram
IMAGING_REQUEST {
uuid request_id PK
uuid tenant_id FK
uuid customer_id FK
geometry aoi_geom
datetime time_window_start
datetime time_window_end
int priority
datetime sla_due_time
string product_level
float max_cloud_pct
float max_off_nadir_deg
string status
string reason_code
uuid correlation_id
datetime created_at
}
AOI_TILE {
uuid tile_id PK
uuid request_id FK
int tile_index
geometry tile_geom
float area_km2
string status
datetime created_at
}
FEASIBILITY_RUN {
uuid feas_run_id PK
uuid request_id FK
uuid initiated_by_user_id FK
string run_type
string status
datetime horizon_start
datetime horizon_end
string policy_version
datetime started_at
datetime finished_at
}
ORBIT_SNAPSHOT {
uuid orbit_snap_id PK
uuid feas_run_id FK
string source_type
datetime source_epoch
string source_ref
datetime captured_at
}
WEATHER_SNAPSHOT {
uuid weather_snap_id PK
uuid feas_run_id FK
string provider
datetime forecast_base_time
datetime captured_at
}
OP_CONSTRAINT_SNAPSHOT {
uuid constraint_snap_id PK
uuid feas_run_id FK
string constraint_version
json constraint_json
datetime captured_at
}
IMAGING_CANDIDATE {
uuid candidate_id PK
uuid request_id FK
uuid feas_run_id FK
uuid satellite_id FK
uuid pass_id FK
uuid tile_id FK
string mode_code
datetime predicted_start
datetime predicted_end
float score_value
boolean feasible_flag
string infeasible_reason
float nominal_gsd_m
float predicted_off_nadir_deg
datetime created_at
}
FEASIBILITY_CRITERION {
uuid criterion_id PK
string domain
string criterion_code
string description
string severity
boolean hard_flag
}
FEASIBILITY_CHECK_RESULT {
uuid check_id PK
uuid candidate_id FK
uuid criterion_id FK
string result
float score
string reason_code
json evidence_json
datetime evaluated_at
}
CONFLICT_ANALYSIS {
uuid conflict_id PK
uuid feas_run_id FK
uuid candidate_id FK
string conflict_type
string severity
string resolution_suggestion
float impact_score
datetime analyzed_at
}
CONFLICT_ITEM {
uuid conflict_item_id PK
uuid conflict_id FK
string conflicted_entity_type
uuid conflicted_entity_id
string details
}
PROBABILITY_MODEL {
uuid model_id PK
string model_name
string model_type
string version
string owner
string input_schema_uri
string status
}
PROBABILITY_ESTIMATE {
uuid prob_id PK
uuid candidate_id FK
uuid model_id FK
string target_metric
float probability
float confidence
json feature_json
datetime estimated_at
}
MODEL_EVIDENCE_LINEAGE {
uuid lineage_id PK
uuid prob_id FK
string input_type
string input_ref
string checksum
datetime captured_at
}
CLOUD_COVER_ESTIMATE {
uuid cloud_est_id PK
uuid candidate_id FK
uuid weather_snap_id FK
float cloud_pct_mean
float cloud_pct_p90
string method
datetime estimated_at
}
DOWNLINK_WINDOW_CANDIDATE {
uuid dl_win_id PK
uuid feas_run_id FK
uuid satellite_id FK
uuid station_id FK
uuid pass_id FK
datetime window_start
datetime window_end
float max_elevation_deg
datetime created_at
}
DOWNLINK_FEASIBILITY {
uuid dl_feas_id PK
uuid candidate_id FK
uuid dl_win_id FK
float volume_est_gb
float rate_est_mbps
float on_time_probability
string result
string reason_code
json evidence_json
datetime evaluated_at
}
REVIEW_TASK {
uuid review_task_id PK
uuid feas_run_id FK
uuid assignee_user_id FK
string review_type
string status
datetime assigned_at
datetime due_at
}
REVIEW_DECISION {
uuid decision_id PK
uuid review_task_id FK
uuid decided_by_user_id FK
string decision
string rationale
string risk_level
string conditions
datetime decided_at
}
RISK_REGISTER {
uuid risk_id PK
uuid feas_run_id FK
uuid candidate_id FK
uuid owner_user_id FK
string risk_type
string risk_level
string description
string mitigation_plan
string status
datetime created_at
datetime updated_at
}
FEASIBILITY_REPORT {
uuid report_id PK
uuid feas_run_id FK
string overall_feasibility
float overall_score
float overall_probability
string summary
datetime generated_at
}
REPORT_ATTACHMENT {
uuid attachment_id PK
uuid report_id FK
string file_name
string uri
string checksum
datetime uploaded_at
}
IMAGING_REQUEST ||--o{ AOI_TILE : splits_into
IMAGING_REQUEST ||--o{ FEASIBILITY_RUN : evaluated_by
FEASIBILITY_RUN ||--o{ ORBIT_SNAPSHOT : captures
FEASIBILITY_RUN ||--o{ WEATHER_SNAPSHOT : captures
FEASIBILITY_RUN ||--o{ OP_CONSTRAINT_SNAPSHOT : captures
IMAGING_REQUEST ||--o{ IMAGING_CANDIDATE : scopes
FEASIBILITY_RUN ||--o{ IMAGING_CANDIDATE : generates
AOI_TILE ||--o{ IMAGING_CANDIDATE : targeted_by
FEASIBILITY_CRITERION ||--o{ FEASIBILITY_CHECK_RESULT : applied_as
IMAGING_CANDIDATE ||--o{ FEASIBILITY_CHECK_RESULT : produces
FEASIBILITY_RUN ||--o{ CONFLICT_ANALYSIS : analyzes
IMAGING_CANDIDATE ||--o{ CONFLICT_ANALYSIS : has
CONFLICT_ANALYSIS ||--o{ CONFLICT_ITEM : includes
PROBABILITY_MODEL ||--o{ PROBABILITY_ESTIMATE : used_by
IMAGING_CANDIDATE ||--o{ PROBABILITY_ESTIMATE : has
PROBABILITY_ESTIMATE ||--o{ MODEL_EVIDENCE_LINEAGE : traces_inputs
WEATHER_SNAPSHOT ||--o{ CLOUD_COVER_ESTIMATE : provides
IMAGING_CANDIDATE ||--o{ CLOUD_COVER_ESTIMATE : has
FEASIBILITY_RUN ||--o{ DOWNLINK_WINDOW_CANDIDATE : proposes
IMAGING_CANDIDATE ||--o{ DOWNLINK_FEASIBILITY : evaluated_by
DOWNLINK_WINDOW_CANDIDATE ||--o{ DOWNLINK_FEASIBILITY : uses
FEASIBILITY_RUN ||--o{ REVIEW_TASK : reviewed_by
REVIEW_TASK ||--o{ REVIEW_DECISION : decided_as
FEASIBILITY_RUN ||--o{ RISK_REGISTER : records
IMAGING_CANDIDATE ||--o{ RISK_REGISTER : has
FEASIBILITY_RUN ||--o{ FEASIBILITY_REPORT : summarized_as
FEASIBILITY_REPORT ||--o{ REPORT_ATTACHMENT : attaches
IMAGING_CANDIDATE는 스케줄링 도메인의 SCHEDULE_SLOT으로 연결된다.DOWNLINK_WINDOW_CANDIDATE는 궤도/지상국 운영 도메인의 패스 정보에 의존한다.USER_ACCOUNT는 실행 주체, 검토자, 리스크 담당자로 연결된다.request_id는 요청 식별자, tenant_id와 customer_id는 요청 주체, aoi_geom은 촬영 영역, time_window_start, time_window_end는 요청 가능 시간창, priority는 우선순위, sla_due_time은 납기, product_level은 산출물 수준, max_cloud_pct와 max_off_nadir_deg는 품질 제약, status와 reason_code는 처리 상태와 사유, correlation_id는 추적 키, created_at은 생성 시각이다.tile_id는 타일 식별자, request_id는 상위 요청, tile_index는 순번, tile_geom은 타일 영역, area_km2는 면적, status는 분할 상태, created_at은 생성 시각이다.feas_run_id는 실행 식별자, request_id는 대상 요청, initiated_by_user_id는 실행 사용자, run_type은 실행 유형, status는 상태, horizon_start, horizon_end는 평가 범위, policy_version은 적용 정책 버전, started_at, finished_at은 실행 시각이다.orbit_snap_id는 식별자, feas_run_id는 상위 실행, source_type은 입력 유형, source_epoch는 기준 시각, source_ref는 원본 참조, captured_at은 캡처 시각이다.weather_snap_id는 식별자, feas_run_id는 상위 실행, provider는 제공자, forecast_base_time은 기준 시각, captured_at은 캡처 시각이다.constraint_snap_id는 식별자, feas_run_id는 상위 실행, constraint_version은 제약 버전, constraint_json은 상세 제약, captured_at은 캡처 시각이다.candidate_id는 후보 식별자, request_id는 원 요청, feas_run_id는 상위 실행, satellite_id와 pass_id는 위성/패스 연결, tile_id는 대상 타일, mode_code는 촬영 모드, predicted_start, predicted_end는 예측 시각, score_value는 종합 점수, feasible_flag는 가능 여부, infeasible_reason은 불가 사유, nominal_gsd_m과 predicted_off_nadir_deg는 품질 추정치, created_at은 생성 시각이다.criterion_id는 식별자, domain은 평가 영역, criterion_code는 기준 코드, description은 설명, severity는 중요도, hard_flag는 필수 조건 여부다.check_id는 결과 식별자, candidate_id는 대상 후보, criterion_id는 적용 기준, result는 판정 결과, score는 점수, reason_code는 사유 코드, evidence_json은 근거 데이터, evaluated_at은 평가 시각이다.conflict_id는 식별자, feas_run_id와 candidate_id는 분석 문맥, conflict_type은 충돌 유형, severity는 심각도, resolution_suggestion은 해소 제안, impact_score는 영향 점수, analyzed_at은 분석 시각이다.conflict_item_id는 식별자, conflict_id는 상위 분석, conflicted_entity_type은 충돌 대상 종류, conflicted_entity_id는 대상 식별자, details는 상세 내용이다.model_id는 식별자, model_name은 모델명, model_type은 유형, version은 버전, owner는 관리 주체, input_schema_uri는 입력 스키마 참조, status는 운영 상태다.prob_id는 식별자, candidate_id는 대상 후보, model_id는 사용 모델, target_metric은 목표 지표, probability는 확률값, confidence는 신뢰도, feature_json은 입력 피처 스냅샷, estimated_at은 계산 시각이다.lineage_id는 식별자, prob_id는 상위 확률 결과, input_type은 입력 종류, input_ref는 원본 참조, checksum은 무결성 값, captured_at은 기록 시각이다.cloud_est_id는 식별자, candidate_id는 대상 후보, weather_snap_id는 사용 예보, cloud_pct_mean은 평균 구름량, cloud_pct_p90은 보수적 추정치, method는 추정 방식, estimated_at은 계산 시각이다.dl_win_id는 식별자, feas_run_id는 상위 실행, satellite_id, station_id, pass_id는 관련 자원, window_start, window_end는 가능 시간창, max_elevation_deg는 예상 최대 고도, created_at은 생성 시각이다.dl_feas_id는 식별자, candidate_id는 대상 후보, dl_win_id는 사용 다운링크 창, volume_est_gb는 예상 용량, rate_est_mbps는 예상 전송률, on_time_probability는 정시 전송 확률, result는 판정, reason_code는 사유 코드, evidence_json은 근거 데이터, evaluated_at은 평가 시각이다.review_task_id는 식별자, feas_run_id는 상위 실행, assignee_user_id는 담당자, review_type은 검토 유형, status는 진행 상태, assigned_at과 due_at은 할당 및 마감 시각이다.decision_id는 식별자, review_task_id는 대상 태스크, decided_by_user_id는 결정자, decision은 판정, rationale은 근거, risk_level은 리스크 수준, conditions는 부가 조건, decided_at은 결정 시각이다.risk_id는 식별자, feas_run_id와 candidate_id는 리스크 문맥, owner_user_id는 담당자, risk_type은 분류, risk_level은 수준, description은 설명, mitigation_plan은 완화 계획, status는 처리 상태, created_at, updated_at은 기록 시각이다.report_id는 식별자, feas_run_id는 대상 실행, overall_feasibility는 종합 판정, overall_score는 종합 점수, overall_probability는 종합 확률, summary는 요약, generated_at은 생성 시각이다.attachment_id는 식별자, report_id는 상위 보고서, file_name은 파일명, uri는 저장 위치, checksum은 무결성 값, uploaded_at은 업로드 시각이다.request_id, FK는 tenant_id -> TENANT.tenant_id, customer_id -> CUSTOMER.customer_id.tenant_id, aoi_geom, time_window_start, time_window_end, priority, product_level, status, created_at은 NOT NULL 권장.(tenant_id, status, created_at DESC), (customer_id, created_at DESC), sla_due_time, correlation_id 인덱스 권장. aoi_geom에는 공간 인덱스 권장.status는 requested, in_review, approved, scheduled, captured, cancelled. product_level은 L0, L1, L2, L3.tile_id, FK는 request_id -> IMAGING_REQUEST.request_id.request_id, tile_index, tile_geom, status, created_at은 NOT NULL 권장.(request_id, tile_index) 유니크, tile_geom 공간 인덱스 권장.status는 generated, evaluated, selected, dropped.feas_run_id, FK는 request_id -> IMAGING_REQUEST.request_id, initiated_by_user_id -> USER_ACCOUNT.user_id.request_id, run_type, status, horizon_start, horizon_end, policy_version, started_at은 NOT NULL, finished_at은 nullable 가능.(request_id, started_at DESC), (status, started_at DESC), initiated_by_user_id 인덱스 권장.run_type은 auto, manual, emergency. status는 created, running, completed, failed.orbit_snap_id, FK는 feas_run_id -> FEASIBILITY_RUN.feas_run_id.feas_run_id, source_type, captured_at은 NOT NULL, source_epoch, source_ref는 nullable 가능.(feas_run_id, captured_at DESC) 인덱스 권장.source_type은 TLE, EPH, OEM.weather_snap_id, FK는 feas_run_id -> FEASIBILITY_RUN.feas_run_id.feas_run_id, provider, forecast_base_time, captured_at은 NOT NULL 권장.(feas_run_id, captured_at DESC), (provider, forecast_base_time) 인덱스 권장.provider는 ECMWF, GFS, KMA, internal-nowcast.constraint_snap_id, FK는 feas_run_id -> FEASIBILITY_RUN.feas_run_id.feas_run_id, constraint_version, constraint_json, captured_at은 NOT NULL 권장.(feas_run_id, captured_at DESC) 인덱스 권장.candidate_id, FK는 request_id, feas_run_id, satellite_id, pass_id, tile_id.request_id, feas_run_id, satellite_id, mode_code, predicted_start, predicted_end, created_at은 NOT NULL 권장.(feas_run_id, score_value DESC), (request_id, feasible_flag), (satellite_id, predicted_start), (pass_id) 인덱스 권장.feasible_flag는 boolean. 별도 상태 컬럼 추가 시 generated, ranked, selected, rejected 권장.criterion_id.domain, criterion_code, description, severity, hard_flag는 NOT NULL 권장.(domain, criterion_code) 유니크 권장.domain은 orbit, weather, resource, policy, downlink. severity는 low, medium, high, critical.check_id, FK는 candidate_id -> IMAGING_CANDIDATE.candidate_id, criterion_id -> FEASIBILITY_CRITERION.criterion_id.candidate_id, criterion_id, result, evaluated_at은 NOT NULL, score, reason_code, evidence_json은 nullable 가능.(candidate_id, criterion_id) 유니크, (candidate_id, result) 인덱스 권장.result는 PASS, FAIL, WARN, INFO.conflict_id, FK는 feas_run_id, candidate_id.feas_run_id, candidate_id, conflict_type, severity, analyzed_at은 NOT NULL.(candidate_id, severity), (feas_run_id, analyzed_at DESC) 인덱스 권장.conflict_type은 schedule_overlap, priority_preemption, policy_violation, resource_exhaustion. severity는 low, medium, high.conflict_item_id, FK는 conflict_id -> CONFLICT_ANALYSIS.conflict_id.conflict_id, conflicted_entity_type, conflicted_entity_id는 NOT NULL, details는 nullable 가능.(conflict_id), (conflicted_entity_type, conflicted_entity_id) 인덱스 권장.conflicted_entity_type은 schedule_slot, policy_rule, antenna_resource, downlink_window.model_id.model_name, model_type, version, owner, status는 NOT NULL, input_schema_uri는 nullable 가능.(model_name, version) 유니크, status 인덱스 권장.model_type은 classification, regression, bayesian, rules. status는 active, shadow, deprecated.prob_id, FK는 candidate_id -> IMAGING_CANDIDATE.candidate_id, model_id -> PROBABILITY_MODEL.model_id.candidate_id, model_id, target_metric, probability, estimated_at은 NOT NULL, confidence, feature_json은 nullable 가능.(candidate_id, target_metric), (model_id, estimated_at DESC) 인덱스 권장.target_metric은 SUCCESS, QUALITY, SLA_ON_TIME, DOWNLINK_ON_TIME.lineage_id, FK는 prob_id -> PROBABILITY_ESTIMATE.prob_id.prob_id, input_type, input_ref, captured_at은 NOT NULL, checksum은 nullable 가능.(prob_id), (input_type, input_ref) 인덱스 권장.input_type은 weather_snapshot, orbit_snapshot, constraint_snapshot, feature_table.cloud_est_id, FK는 candidate_id -> IMAGING_CANDIDATE.candidate_id, weather_snap_id -> WEATHER_SNAPSHOT.weather_snap_id.candidate_id, weather_snap_id, cloud_pct_mean, cloud_pct_p90, method, estimated_at은 NOT NULL 권장.(candidate_id), (weather_snap_id) 인덱스 권장.method는 NWP, Nowcast, Ensemble, SatelliteBlend.dl_win_id, FK는 feas_run_id, satellite_id, station_id, pass_id.window_start, window_end, max_elevation_deg, created_at은 NOT NULL 권장.(feas_run_id, window_start), (satellite_id, window_start), (station_id, window_start) 인덱스 권장.window_start < window_end 체크 권장.dl_feas_id, FK는 candidate_id -> IMAGING_CANDIDATE.candidate_id, dl_win_id -> DOWNLINK_WINDOW_CANDIDATE.dl_win_id.candidate_id, dl_win_id, volume_est_gb, rate_est_mbps, on_time_probability, result, evaluated_at은 NOT NULL 권장.(candidate_id, result), (dl_win_id) 인덱스 권장.result는 FEASIBLE, NOT_FEASIBLE, CONDITIONAL.review_task_id, FK는 feas_run_id -> FEASIBILITY_RUN.feas_run_id, assignee_user_id -> USER_ACCOUNT.user_id.feas_run_id, review_type, status, assigned_at은 NOT NULL, assignee_user_id, due_at는 nullable 가능.(assignee_user_id, status, due_at), (feas_run_id, status) 인덱스 권장.review_type은 TECH, OPS, SECURITY, COMMERCIAL. status는 OPEN, IN_REVIEW, DONE, REJECTED.decision_id, FK는 review_task_id -> REVIEW_TASK.review_task_id, decided_by_user_id -> USER_ACCOUNT.user_id.review_task_id, decision, decided_at은 NOT NULL, rationale, risk_level, conditions는 nullable 가능.(review_task_id) 유니크 검토, (decided_by_user_id, decided_at DESC) 인덱스 권장.decision은 APPROVE, REJECT, CONDITIONAL_APPROVE. risk_level은 LOW, MEDIUM, HIGH.risk_id, FK는 feas_run_id, candidate_id, owner_user_id.feas_run_id, risk_type, risk_level, description, status, created_at은 NOT NULL, candidate_id, owner_user_id, updated_at은 nullable 가능.(feas_run_id, status), (owner_user_id, status), (candidate_id) 인덱스 권장.risk_type은 weather, resource, policy, customer, delivery. status는 OPEN, MITIGATING, ACCEPTED, CLOSED.report_id, FK는 feas_run_id -> FEASIBILITY_RUN.feas_run_id.feas_run_id, overall_feasibility, generated_at은 NOT NULL, overall_score, overall_probability, summary는 nullable 가능.(feas_run_id) 유니크 검토, generated_at 인덱스 권장.overall_feasibility는 FEASIBLE, NOT_FEASIBLE, CONDITIONAL.attachment_id, FK는 report_id -> FEASIBILITY_REPORT.report_id.report_id, file_name, uri, uploaded_at은 NOT NULL, checksum은 nullable 가능.(report_id), checksum 인덱스 권장.