modleing-ERD-v2.md를 운영 기준 베이스로 사용modeling-feasibility-v2.md의 평가 실행, 스냅샷, 체크, 확률, 리뷰, 리포트 계층을 병합TENANT, IMAGING_REQUEST, SATELLITE, GROUND_STATION, VISIBILITY_PASS, IMAGING_CANDIDATE, AUDIT_LOGFEASIBILITY_RUN, 스냅샷, 체크 결과, 확률 추정, 리뷰/리스크, feasibility 리포트본 v2 문서는 테이블을 단순 기술 분류가 아니라 실제 업무 흐름 기준으로 다음 7개 업무 도메인으로 구분한다.
고객/계정 관리: 테넌트, 고객, 사용자, 권한, API 인증 관리위성/자산 관리: 위성 마스터, 촬영/통신/제약 프로파일 관리궤도/지상국 운영: 궤도 원천, TLE, 패스 계산, 지상국/안테나/세션 관리촬영 요청/Feasibility 평가: 촬영 요청 접수, AOI 분할, feasibility 실행, 후보 생성, 체크, 확률, 리뷰, 리스크, 보고서스케줄링/실행 통제: 일정 생성, 슬롯 운영, 명령 요청 및 실행 통제데이터 상품/다운링크/전달: 데이터 상품 생성, 다운링크 실행 계획, 처리, 카탈로그, 전달, 과금감사/추적: 전 업무 도메인의 공통 감사 로그와 상관관계 추적| 업무 도메인 | 주요 책임 | 포함 테이블 |
|---|---|---|
| 고객/계정 관리 | 조직, 사용자, 접근 권한, 인증 키 관리 | TENANT, CUSTOMER, USER_ACCOUNT, ROLE, USER_ROLE, API_KEY |
| 위성/자산 관리 | 위성 자산과 운용 특성 관리 | SATELLITE, SATELLITE_PROFILE_SET, IMAGING_PROFILE, COMM_PROFILE, CONSTRAINT_PROFILE |
| 궤도/지상국 운영 | 궤도 원천, 패스, 지상국 및 접촉 세션 운영 | ORBIT_SOURCE, TLE, GROUND_STATION, VISIBILITY_PASS, ANTENNA_RESOURCE, CONTACT_SESSION |
| 촬영 요청/Feasibility 평가 | 요청 접수부터 가능성 평가와 승인 보고서까지의 업무 | IMAGING_REQUEST, AOI_TILE, FEASIBILITY_RUN, ORBIT_SNAPSHOT, WEATHER_SNAPSHOT, OP_CONSTRAINT_SNAPSHOT, IMAGING_CANDIDATE, FEASIBILITY_CRITERION, FEASIBILITY_CHECK_RESULT, CONFLICT_ANALYSIS, CONFLICT_ITEM, PROBABILITY_MODEL, PROBABILITY_ESTIMATE, MODEL_EVIDENCE_LINEAGE, CLOUD_COVER_ESTIMATE, DOWNLINK_WINDOW_CANDIDATE, DOWNLINK_FEASIBILITY, REVIEW_TASK, REVIEW_DECISION, RISK_REGISTER, FEASIBILITY_REPORT, REPORT_ATTACHMENT |
| 스케줄링/실행 통제 | 촬영/운용 일정 수립과 명령 실행 통제 | SCHEDULE_RUN, SCHEDULE_SLOT, SCHEDULE_SLOT_HISTORY, COMMAND_DICTIONARY, COMMAND_REQUEST, COMMAND_EXECUTION |
| 데이터 상품/다운링크/전달 | 생성물 관리, 다운링크, 처리, 카탈로그, 배송, 과금 | DOWNLINK_REQUEST, DOWNLINK_PLAN, DATA_PRODUCT, PRODUCT_DERIVATION, PROCESS_JOB, CATALOG_ITEM, DELIVERY_ORDER, BILLING_RECORD |
| 감사/추적 | 전사 공통 감사 및 상관관계 추적 | AUDIT_LOG |
테넌트 관리: 고객사 또는 조직 단위의 시스템 경계, 운영 상태, 정책 적용 범위를 관리한다.고객 계정 관리: 계약 단위 고객, 청구 대상, 서비스 사용 주체를 관리한다.사용자/권한 관리: 사용자 계정 생성, 역할 부여, 승인 권한과 리뷰 권한을 통제한다.API 인증 관리: 외부 시스템 연동용 키 발급, 만료, 상태 관리와 호출 주체 식별을 담당한다.위성 마스터 관리: 위성 식별 정보, 임무 유형, 수명 주기 상태를 관리한다.촬영 프로파일 관리: 센서 모드, 해상도, 촬영 폭, 오프나딜 한계를 관리한다.통신 프로파일 관리: 업링크/다운링크 주파수와 전송 성능을 관리한다.운용 제약 관리: 일일 촬영 시간, 다운링크 용량, 저장 용량 등 자원 한계를 관리한다.궤도 원천 관리: TLE 또는 기타 궤도 입력의 원천과 수집 상태를 관리한다.패스 계산 관리: 위성-지상국 가시 구간을 계산하고 예측 이력을 유지한다.지상국 자원 관리: 지상국, 안테나, 밴드 가용성을 운영한다.접촉 세션 운영: 명령 전송과 다운링크가 수행될 실제 세션을 계획 및 추적한다.요청 접수: 고객 요구조건, AOI, 시간창, 품질 제약, SLA를 등록한다.AOI 분할: 대면적 요청을 평가 가능한 타일 단위로 쪼개 후보 폭을 제어한다.평가 실행 관리: 특정 시점의 궤도, 기상, 제약 스냅샷으로 feasibility 실행을 고정한다.후보 생성 및 체크: 후보 촬영안을 만들고 평가 기준별 PASS/FAIL/WARN을 산출한다.확률/품질 추정: 성공 확률, 구름량, 정시 납기 가능성을 모델 기반으로 추정한다.리뷰 및 승인: 자동 평가 결과를 사람이 검토하고 승인, 반려, 조건부 승인을 결정한다.리스크/보고서 관리: 리스크와 완화 계획을 기록하고 공식 feasibility 보고서를 생성한다.스케줄 실행: 특정 horizon 내 촬영/다운링크/유휴 슬롯을 생성하고 최적화한다.슬롯 변경 이력 관리: 슬롯의 상태 전이와 수동 개입 이력을 추적한다.명령 사전 관리: 허용된 명령 유형과 스키마를 통제한다.명령 요청/승인/실행: 명령 요청부터 승인, 실제 세션 전송과 결과 수집까지 관리한다.상품 원장 관리: 실제 촬영 결과물의 수준, 포맷, 저장 위치, 무결성을 관리한다.다운링크 실행 계획: 상품을 어떤 세션으로 내릴지 계획하고 전송량을 산정한다.처리 파이프라인 운영: 가공, 정사보정, 파생 생성 등 처리 작업을 실행한다.카탈로그/전달 관리: 검색 노출과 외부 전달 주문을 관리한다.과금 관리: 요청 또는 상품 기준으로 비용을 산정하고 청구 이력을 기록한다.행위 감사: 사용자, 시스템, API 호출의 주요 행위를 엔터티 단위로 기록한다.상관관계 추적: 요청부터 평가, 실행, 상품, 과금까지 하나의 correlation_id 흐름으로 추적한다.분쟁/규제 대응: 누가 언제 어떤 판단과 실행을 했는지 증빙 자료를 제공한다.erDiagram은 도메인별 그룹 박스를 직접 표현하기에 제약이 있어, 업무 도메인 박스는 flowchart의 subgraph로 별도 표현한다. 이 뷰는 도메인 경계와 주요 연계를 빠르게 파악하기 위한 상위 차트다.
flowchart LR subgraph D1["고객/계정 관리"] TENANT_N["TENANT"] CUSTOMER_N["CUSTOMER"] USER_N["USER_ACCOUNT"] ROLE_N["ROLE"] USER_ROLE_N["USER_ROLE"] API_KEY_N["API_KEY"] end subgraph D2["위성/자산 관리"] SATELLITE_N["SATELLITE"] PROFILE_SET_N["SATELLITE_PROFILE_SET"] IMG_PROFILE_N["IMAGING_PROFILE"] COMM_PROFILE_N["COMM_PROFILE"] CONSTRAINT_PROFILE_N["CONSTRAINT_PROFILE"] end subgraph D3["궤도/지상국 운영"] ORBIT_SOURCE_N["ORBIT_SOURCE"] TLE_N["TLE"] GROUND_N["GROUND_STATION"] PASS_N["VISIBILITY_PASS"] ANTENNA_N["ANTENNA_RESOURCE"] SESSION_N["CONTACT_SESSION"] end subgraph D4["촬영 요청 / Feasibility 평가"] REQUEST_N["IMAGING_REQUEST"] TILE_N["AOI_TILE"] FEAS_RUN_N["FEASIBILITY_RUN"] ORBIT_SNAP_N["ORBIT_SNAPSHOT"] WEATHER_SNAP_N["WEATHER_SNAPSHOT"] CONSTRAINT_SNAP_N["OP_CONSTRAINT_SNAPSHOT"] CANDIDATE_N["IMAGING_CANDIDATE"] CRITERION_N["FEASIBILITY_CRITERION"] CHECK_N["FEASIBILITY_CHECK_RESULT"] CONFLICT_N["CONFLICT_ANALYSIS / CONFLICT_ITEM"] PROB_N["PROBABILITY_MODEL / PROBABILITY_ESTIMATE / MODEL_EVIDENCE_LINEAGE"] CLOUD_N["CLOUD_COVER_ESTIMATE"] DL_FEAS_N["DOWNLINK_WINDOW_CANDIDATE / DOWNLINK_FEASIBILITY"] REVIEW_N["REVIEW_TASK / REVIEW_DECISION"] RISK_N["RISK_REGISTER"] REPORT_N["FEASIBILITY_REPORT / REPORT_ATTACHMENT"] end subgraph D5["스케줄링 / 실행 통제"] SCHED_RUN_N["SCHEDULE_RUN"] SLOT_N["SCHEDULE_SLOT"] SLOT_HIST_N["SCHEDULE_SLOT_HISTORY"] CMD_DICT_N["COMMAND_DICTIONARY"] CMD_REQ_N["COMMAND_REQUEST"] CMD_EXEC_N["COMMAND_EXECUTION"] end subgraph D6["데이터 상품 / 다운링크 / 전달"] DL_REQ_N["DOWNLINK_REQUEST"] DL_PLAN_N["DOWNLINK_PLAN"] PRODUCT_N["DATA_PRODUCT"] DERIVE_N["PRODUCT_DERIVATION"] JOB_N["PROCESS_JOB"] CATALOG_N["CATALOG_ITEM"] DELIVERY_N["DELIVERY_ORDER"] BILLING_N["BILLING_RECORD"] end subgraph D7["감사 / 추적"] AUDIT_N["AUDIT_LOG"] end TENANT_N --> REQUEST_N CUSTOMER_N --> REQUEST_N USER_N --> FEAS_RUN_N ROLE_N --> USER_ROLE_N USER_N --> USER_ROLE_N TENANT_N --> API_KEY_N SATELLITE_N --> PROFILE_SET_N PROFILE_SET_N --> IMG_PROFILE_N PROFILE_SET_N --> COMM_PROFILE_N PROFILE_SET_N --> CONSTRAINT_PROFILE_N ORBIT_SOURCE_N --> TLE_N SATELLITE_N --> TLE_N SATELLITE_N --> PASS_N GROUND_N --> PASS_N GROUND_N --> ANTENNA_N SATELLITE_N --> SESSION_N GROUND_N --> SESSION_N ANTENNA_N --> SESSION_N REQUEST_N --> TILE_N REQUEST_N --> FEAS_RUN_N FEAS_RUN_N --> ORBIT_SNAP_N FEAS_RUN_N --> WEATHER_SNAP_N FEAS_RUN_N --> CONSTRAINT_SNAP_N REQUEST_N --> CANDIDATE_N FEAS_RUN_N --> CANDIDATE_N PASS_N --> CANDIDATE_N SATELLITE_N --> CANDIDATE_N TILE_N --> CANDIDATE_N CANDIDATE_N --> CHECK_N CRITERION_N --> CHECK_N CANDIDATE_N --> CONFLICT_N CANDIDATE_N --> PROB_N WEATHER_SNAP_N --> CLOUD_N CANDIDATE_N --> CLOUD_N CANDIDATE_N --> DL_FEAS_N FEAS_RUN_N --> REVIEW_N FEAS_RUN_N --> RISK_N FEAS_RUN_N --> REPORT_N CANDIDATE_N --> SLOT_N SCHED_RUN_N --> SLOT_N SLOT_N --> SLOT_HIST_N CMD_DICT_N --> CMD_REQ_N USER_N --> CMD_REQ_N SATELLITE_N --> CMD_REQ_N CMD_REQ_N --> CMD_EXEC_N SESSION_N --> CMD_EXEC_N REQUEST_N --> PRODUCT_N SATELLITE_N --> PRODUCT_N PRODUCT_N --> DERIVE_N PRODUCT_N --> JOB_N PRODUCT_N --> CATALOG_N PRODUCT_N --> DELIVERY_N PRODUCT_N --> DL_REQ_N DL_REQ_N --> DL_PLAN_N SESSION_N --> DL_PLAN_N CUSTOMER_N --> BILLING_N REQUEST_N --> BILLING_N PRODUCT_N --> BILLING_N TENANT_N --> AUDIT_N REQUEST_N --> AUDIT_N FEAS_RUN_N --> AUDIT_N SLOT_N --> AUDIT_N CMD_EXEC_N --> AUDIT_N PRODUCT_N --> AUDIT_N style D1 fill:#f6efe3,stroke:#8a6a2f,stroke-width:2px,color:#2b2418 style D2 fill:#e7f4ea,stroke:#31724b,stroke-width:2px,color:#173322 style D3 fill:#eaf3fb,stroke:#2f6e96,stroke-width:2px,color:#173245 style D4 fill:#fff2dc,stroke:#b6771f,stroke-width:2px,color:#4b3412 style D5 fill:#f2eafd,stroke:#7050a8,stroke-width:2px,color:#2f1f52 style D6 fill:#e8f7f4,stroke:#2c8170,stroke-width:2px,color:#163832 style D7 fill:#f4f4f4,stroke:#666666,stroke-width:2px,color:#222222 classDef tenant fill:#fcf7ef,stroke:#8a6a2f,color:#2b2418,stroke-width:1px classDef asset fill:#eef8f0,stroke:#31724b,color:#173322,stroke-width:1px classDef orbit fill:#eef6fc,stroke:#2f6e96,color:#173245,stroke-width:1px classDef tasking fill:#fff7ea,stroke:#b6771f,color:#4b3412,stroke-width:1px classDef sched fill:#f7f1fe,stroke:#7050a8,color:#2f1f52,stroke-width:1px classDef product fill:#edf9f7,stroke:#2c8170,color:#163832,stroke-width:1px classDef audit fill:#f7f7f7,stroke:#666666,color:#222222,stroke-width:1px class TENANT_N,CUSTOMER_N,USER_N,ROLE_N,USER_ROLE_N,API_KEY_N tenant class SATELLITE_N,PROFILE_SET_N,IMG_PROFILE_N,COMM_PROFILE_N,CONSTRAINT_PROFILE_N asset class ORBIT_SOURCE_N,TLE_N,GROUND_N,PASS_N,ANTENNA_N,SESSION_N orbit class REQUEST_N,TILE_N,FEAS_RUN_N,ORBIT_SNAP_N,WEATHER_SNAP_N,CONSTRAINT_SNAP_N,CANDIDATE_N,CRITERION_N,CHECK_N,CONFLICT_N,PROB_N,CLOUD_N,DL_FEAS_N,REVIEW_N,RISK_N,REPORT_N tasking class SCHED_RUN_N,SLOT_N,SLOT_HIST_N,CMD_DICT_N,CMD_REQ_N,CMD_EXEC_N sched class DL_REQ_N,DL_PLAN_N,PRODUCT_N,DERIVE_N,JOB_N,CATALOG_N,DELIVERY_N,BILLING_N product class AUDIT_N audit
erDiagram
%% =========================
%% IDENTITY / TENANT DOMAIN
%% =========================
TENANT {
uuid tenant_id PK
string tenant_name
string tenant_type
string status
datetime created_at
}
CUSTOMER {
uuid customer_id PK
uuid tenant_id FK
string customer_name
string billing_type
string status
datetime created_at
}
USER_ACCOUNT {
uuid user_id PK
uuid tenant_id FK
string email
string display_name
string status
datetime created_at
}
ROLE {
uuid role_id PK
string role_name
string description
}
USER_ROLE {
uuid user_role_id PK
uuid user_id FK
uuid role_id FK
datetime granted_at
}
API_KEY {
uuid api_key_id PK
uuid tenant_id FK
string key_hash
string status
datetime issued_at
datetime expires_at
}
%% =========================
%% SATELLITE / ASSET DOMAIN
%% =========================
SATELLITE {
uuid satellite_id PK
string name
int norad_id
string cospar_id
string orbit_type
string mission_type
string status
datetime launch_date
datetime eol_estimated_at
}
SATELLITE_PROFILE_SET {
uuid profile_set_id PK
uuid satellite_id FK
uuid imaging_profile_id FK
uuid comm_profile_id FK
uuid constraint_profile_id FK
datetime effective_from
datetime effective_to
}
IMAGING_PROFILE {
uuid imaging_profile_id PK
string sensor_type
string mode_code
float gsd_m
float swath_km
float max_off_nadir_deg
float slew_rate_deg_per_sec
float min_sun_elev_deg
boolean night_support
}
COMM_PROFILE {
uuid comm_profile_id PK
string uplink_freq
string downlink_freq
float data_rate_mbps
string modulation
string crypto_mode
}
CONSTRAINT_PROFILE {
uuid constraint_profile_id PK
float max_daily_imaging_time_min
float max_daily_downlink_volume_gb
float storage_capacity_gb
}
%% =========================
%% ORBIT / GROUND DOMAIN
%% =========================
ORBIT_SOURCE {
uuid orbit_source_id PK
string source_type
string provider
string status
datetime last_ingested_at
}
TLE {
uuid tle_id PK
uuid satellite_id FK
uuid orbit_source_id FK
datetime epoch_time
string line1
string line2
datetime ingested_at
}
GROUND_STATION {
uuid station_id PK
string name
float latitude
float longitude
float altitude
string status
}
VISIBILITY_PASS {
uuid pass_id PK
uuid satellite_id FK
uuid station_id FK
uuid orbit_source_id FK
datetime aos_time
datetime los_time
float max_elevation_deg
datetime predicted_at
}
ANTENNA_RESOURCE {
uuid antenna_id PK
uuid station_id FK
string antenna_name
string band_capability
string status
}
CONTACT_SESSION {
uuid session_id PK
uuid satellite_id FK
uuid station_id FK
uuid antenna_id FK
datetime planned_start
datetime planned_end
datetime actual_start
datetime actual_end
string session_type
string status
}
%% =========================
%% TASKING / FEASIBILITY DOMAIN
%% =========================
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
}
%% =========================
%% SCHEDULING / EXECUTION DOMAIN
%% =========================
SCHEDULE_RUN {
uuid schedule_run_id PK
datetime horizon_start
datetime horizon_end
datetime freeze_from
datetime freeze_to
string objective_policy
string status
datetime created_at
}
SCHEDULE_SLOT {
uuid slot_id PK
uuid schedule_run_id FK
uuid satellite_id FK
uuid candidate_id FK
uuid superseded_by_slot_id
datetime start_time
datetime end_time
string slot_type
string state
int version
boolean locked
datetime created_at
}
SCHEDULE_SLOT_HISTORY {
uuid slot_hist_id PK
uuid slot_id FK
uuid actor_user_id FK
string action
string prev_state
string new_state
datetime changed_at
string reason_code
}
COMMAND_DICTIONARY {
uuid cmd_dict_id PK
string command_type
string schema_version
string validation_rules_uri
string status
}
COMMAND_REQUEST {
uuid cmd_req_id PK
uuid satellite_id FK
uuid tenant_id FK
uuid user_id FK
uuid cmd_dict_id FK
uuid approved_by_user_id FK
string command_type
json payload_json
int priority
string status
uuid correlation_id
datetime requested_at
datetime approved_at
}
COMMAND_EXECUTION {
uuid cmd_exec_id PK
uuid cmd_req_id FK
uuid session_id FK
datetime sent_at
datetime ack_at
string result
string error_code
string raw_log_uri
}
%% =========================
%% PRODUCT / DOWNLINK / DELIVERY DOMAIN
%% =========================
DOWNLINK_REQUEST {
uuid dl_req_id PK
uuid product_id FK
uuid tenant_id FK
datetime required_by_time
int priority
float volume_est_gb
string status
datetime created_at
}
DOWNLINK_PLAN {
uuid dl_plan_id PK
uuid session_id FK
uuid dl_req_id FK
float planned_rate_mbps
float planned_volume_gb
string status
datetime created_at
}
DATA_PRODUCT {
uuid product_id PK
uuid request_id FK
uuid tenant_id FK
uuid satellite_id FK
datetime sensing_time
geometry footprint_geom
string level
string processing_status
string format
string uri
string checksum
datetime created_at
}
PRODUCT_DERIVATION {
uuid derivation_id PK
uuid parent_product_id FK
uuid child_product_id FK
string derivation_type
datetime created_at
}
PROCESS_JOB {
uuid job_id PK
uuid product_id FK
string pipeline_name
string pipeline_version
string status
datetime started_at
datetime finished_at
string log_uri
}
CATALOG_ITEM {
uuid catalog_id PK
uuid product_id FK
uuid tenant_id FK
datetime indexed_at
string stac_item_uri
}
DELIVERY_ORDER {
uuid delivery_id PK
uuid product_id FK
uuid tenant_id FK
string method
string destination
string status
datetime delivered_at
}
BILLING_RECORD {
uuid billing_id PK
uuid tenant_id FK
uuid customer_id FK
uuid request_id FK
uuid product_id FK
string charge_type
float amount
string currency
datetime billed_at
}
%% =========================
%% AUDIT DOMAIN
%% =========================
AUDIT_LOG {
uuid audit_id PK
uuid tenant_id FK
string actor_type
uuid actor_id
string action
string entity_type
uuid entity_id
uuid correlation_id
datetime event_time
json metadata_json
}
%% =========================
%% RELATIONSHIPS
%% =========================
TENANT ||--o{ CUSTOMER : has
TENANT ||--o{ USER_ACCOUNT : has
TENANT ||--o{ API_KEY : issues
USER_ACCOUNT ||--o{ USER_ROLE : granted
ROLE ||--o{ USER_ROLE : includes
SATELLITE ||--o{ SATELLITE_PROFILE_SET : has
SATELLITE_PROFILE_SET }o--|| IMAGING_PROFILE : uses
SATELLITE_PROFILE_SET }o--|| COMM_PROFILE : uses
SATELLITE_PROFILE_SET }o--|| CONSTRAINT_PROFILE : uses
ORBIT_SOURCE ||--o{ TLE : provides
SATELLITE ||--o{ TLE : has
ORBIT_SOURCE ||--o{ VISIBILITY_PASS : basis_for
SATELLITE ||--o{ VISIBILITY_PASS : generates
GROUND_STATION ||--o{ VISIBILITY_PASS : observes
GROUND_STATION ||--o{ ANTENNA_RESOURCE : has
GROUND_STATION ||--o{ CONTACT_SESSION : hosts
ANTENNA_RESOURCE ||--o{ CONTACT_SESSION : uses
SATELLITE ||--o{ CONTACT_SESSION : contacts
TENANT ||--o{ IMAGING_REQUEST : owns
CUSTOMER ||--o{ IMAGING_REQUEST : submits
IMAGING_REQUEST ||--o{ AOI_TILE : splits_into
IMAGING_REQUEST ||--o{ FEASIBILITY_RUN : evaluated_by
USER_ACCOUNT ||--o{ FEASIBILITY_RUN : initiates
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
SATELLITE ||--o{ IMAGING_CANDIDATE : candidate_for
VISIBILITY_PASS ||--o{ IMAGING_CANDIDATE : based_on
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
SATELLITE ||--o{ DOWNLINK_WINDOW_CANDIDATE : downlinks_on
GROUND_STATION ||--o{ DOWNLINK_WINDOW_CANDIDATE : receives_at
VISIBILITY_PASS ||--o{ DOWNLINK_WINDOW_CANDIDATE : derived_to
IMAGING_CANDIDATE ||--o{ DOWNLINK_FEASIBILITY : evaluated_by
DOWNLINK_WINDOW_CANDIDATE ||--o{ DOWNLINK_FEASIBILITY : uses
FEASIBILITY_RUN ||--o{ REVIEW_TASK : reviewed_by
USER_ACCOUNT ||--o{ REVIEW_TASK : assigned_to
REVIEW_TASK ||--o{ REVIEW_DECISION : decided_as
USER_ACCOUNT ||--o{ REVIEW_DECISION : decides
FEASIBILITY_RUN ||--o{ RISK_REGISTER : records
IMAGING_CANDIDATE ||--o{ RISK_REGISTER : has
USER_ACCOUNT ||--o{ RISK_REGISTER : owns
FEASIBILITY_RUN ||--o{ FEASIBILITY_REPORT : summarized_as
FEASIBILITY_REPORT ||--o{ REPORT_ATTACHMENT : attaches
SCHEDULE_RUN ||--o{ SCHEDULE_SLOT : produces
SATELLITE ||--o{ SCHEDULE_SLOT : scheduled_on
IMAGING_CANDIDATE ||--o{ SCHEDULE_SLOT : selected_from
SCHEDULE_SLOT ||--o{ SCHEDULE_SLOT_HISTORY : changes
USER_ACCOUNT ||--o{ SCHEDULE_SLOT_HISTORY : changes_by
SCHEDULE_SLOT ||--o{ SCHEDULE_SLOT : supersedes
COMMAND_DICTIONARY ||--o{ COMMAND_REQUEST : validates
TENANT ||--o{ COMMAND_REQUEST : owns
USER_ACCOUNT ||--o{ COMMAND_REQUEST : requests
USER_ACCOUNT ||--o{ COMMAND_REQUEST : approves
SATELLITE ||--o{ COMMAND_REQUEST : receives
COMMAND_REQUEST ||--o{ COMMAND_EXECUTION : executed_as
CONTACT_SESSION ||--o{ COMMAND_EXECUTION : carries
IMAGING_REQUEST ||--o{ DATA_PRODUCT : results_in
TENANT ||--o{ DATA_PRODUCT : owns
SATELLITE ||--o{ DATA_PRODUCT : captures
DATA_PRODUCT ||--o{ PRODUCT_DERIVATION : parent
DATA_PRODUCT ||--o{ PRODUCT_DERIVATION : child
DATA_PRODUCT ||--o{ PROCESS_JOB : processed_by
DATA_PRODUCT ||--o{ CATALOG_ITEM : indexed_as
DATA_PRODUCT ||--o{ DELIVERY_ORDER : delivered_via
DATA_PRODUCT ||--o{ DOWNLINK_REQUEST : requires
DOWNLINK_REQUEST ||--o{ DOWNLINK_PLAN : planned_as
CONTACT_SESSION ||--o{ DOWNLINK_PLAN : executes_in
TENANT ||--o{ BILLING_RECORD : billed
CUSTOMER ||--o{ BILLING_RECORD : billed_for
IMAGING_REQUEST ||--o{ BILLING_RECORD : charges
DATA_PRODUCT ||--o{ BILLING_RECORD : bills
TENANT ||--o{ AUDIT_LOG : logs
IMAGING_CANDIDATE는 운영 문서의 요청 중심 모델과 feasibility 문서의 실행 중심 모델을 모두 수용하기 위해 request_id와 feas_run_id를 함께 유지DOWNLINK_WINDOW_CANDIDATE와 DOWNLINK_FEASIBILITY는 사전 평가용, DOWNLINK_REQUEST와 DOWNLINK_PLAN은 실제 실행 계획용으로 분리FEASIBILITY_REPORT는 평가 결과의 공식 산출물, DATA_PRODUCT는 실제 촬영 및 처리 결과물로 역할이 다름아래 정의서는 위의 업무 도메인 구분을 기준으로 정리했다.
tenant_id는 테넌트 식별자, tenant_name은 표시명, tenant_type은 commercial/defense/internal 등 운영 구분, status는 사용 상태, created_at은 생성 시각이다.customer_id는 고객 식별자, tenant_id는 소속 테넌트, customer_name은 고객명, billing_type은 과금 방식, status는 계정 상태, created_at은 생성 시각이다.user_id는 사용자 식별자, tenant_id는 소속 테넌트, email은 로그인 식별자, display_name은 표시명, status는 계정 상태, created_at은 생성 시각이다.role_id는 롤 식별자, role_name은 롤 이름, description은 권한 설명이다.user_role_id는 매핑 식별자, user_id는 사용자 FK, role_id는 롤 FK, granted_at은 부여 시각이다.api_key_id는 키 식별자, tenant_id는 발급 테넌트, key_hash는 키 해시, status는 활성 상태, issued_at과 expires_at은 발급 및 만료 시각이다.satellite_id는 위성 식별자, name은 위성명, norad_id와 cospar_id는 우주 객체 식별자, orbit_type은 궤도 유형, mission_type은 임무 유형, status는 운용 상태, launch_date와 eol_estimated_at은 수명 주기 정보다.profile_set_id는 프로파일 세트 식별자, satellite_id는 대상 위성, imaging_profile_id, comm_profile_id, constraint_profile_id는 세부 프로파일 FK, effective_from과 effective_to는 적용 기간이다.imaging_profile_id는 식별자, sensor_type은 광학/SAR 등 센서 종류, mode_code는 운용 모드, gsd_m은 해상도, swath_km은 촬영 폭, max_off_nadir_deg는 최대 오프나딜, slew_rate_deg_per_sec는 기동 속도, min_sun_elev_deg는 최소 태양고도, night_support는 야간 지원 여부다.comm_profile_id는 식별자, uplink_freq와 downlink_freq는 주파수, data_rate_mbps는 전송률, modulation은 변조 방식, crypto_mode는 암호화 운용 방식이다.constraint_profile_id는 식별자, max_daily_imaging_time_min은 일일 최대 촬영 시간, max_daily_downlink_volume_gb는 일일 최대 다운링크량, storage_capacity_gb는 저장 용량이다.orbit_source_id는 식별자, source_type은 TLE/EPH 등 원천 유형, provider는 제공자, status는 사용 상태, last_ingested_at은 최근 수집 시각이다.tle_id는 식별자, satellite_id는 위성 FK, orbit_source_id는 원천 FK, epoch_time은 기준 epoch, line1, line2는 TLE 본문, ingested_at은 수집 시각이다.station_id는 지상국 식별자, name은 지상국명, latitude, longitude, altitude는 위치 정보, status는 운용 상태다.pass_id는 패스 식별자, satellite_id와 station_id는 위성/지상국 FK, orbit_source_id는 계산 근거, aos_time과 los_time은 가시 시작/종료, max_elevation_deg는 최대 고도, predicted_at은 계산 시각이다.antenna_id는 안테나 식별자, station_id는 소속 지상국, antenna_name은 자원명, band_capability는 지원 밴드, status는 사용 상태다.session_id는 세션 식별자, satellite_id, station_id, antenna_id는 자원 FK, planned_start, planned_end는 계획 시각, actual_start, actual_end는 실제 시각, session_type은 세션 목적, status는 진행 상태다.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는 평가 실행 FK, source_type은 데이터 유형, source_epoch는 기준 시각, source_ref는 원본 참조, captured_at은 캡처 시각이다.weather_snap_id는 식별자, feas_run_id는 평가 실행 FK, provider는 예보 제공자, forecast_base_time은 기준 시각, captured_at은 캡처 시각이다.constraint_snap_id는 식별자, feas_run_id는 평가 실행 FK, 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는 PASS/FAIL/WARN 등 결과, 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은 SUCCESS/QUALITY/SLA_ON_TIME 등 목표 지표, probability는 확률값, confidence는 신뢰도, feature_json은 입력 피처 스냅샷, estimated_at은 계산 시각이다.lineage_id는 식별자, prob_id는 확률 결과 FK, 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은 업로드 시각이다.schedule_run_id는 실행 식별자, horizon_start, horizon_end는 스케줄링 범위, freeze_from, freeze_to는 고정 구간, objective_policy는 최적화 목표, status는 실행 상태, created_at은 생성 시각이다.slot_id는 슬롯 식별자, schedule_run_id는 생성 배치 실행, satellite_id는 대상 위성, candidate_id는 원본 후보, superseded_by_slot_id는 대체 슬롯, start_time, end_time은 시간 구간, slot_type은 슬롯 유형, state는 상태, version은 버전, locked는 고정 여부, created_at은 생성 시각이다.slot_hist_id는 이력 식별자, slot_id는 대상 슬롯, actor_user_id는 변경 사용자, action은 수행 행위, prev_state, new_state는 상태 전이, changed_at은 변경 시각, reason_code는 변경 사유다.cmd_dict_id는 식별자, command_type은 명령 유형, schema_version은 명령 스키마 버전, validation_rules_uri는 검증 규칙 참조, status는 사용 상태다.cmd_req_id는 식별자, satellite_id, tenant_id, user_id, cmd_dict_id는 관련 자원, approved_by_user_id는 승인자, command_type은 명령 종류, payload_json은 명령 본문, priority는 우선순위, status는 상태, correlation_id는 추적 키, requested_at, approved_at은 요청 및 승인 시각이다.cmd_exec_id는 식별자, cmd_req_id는 원 요청, session_id는 수행 세션, sent_at과 ack_at은 전송/응답 시각, result는 실행 결과, error_code는 오류 코드, raw_log_uri는 원시 로그 위치다.dl_req_id는 식별자, product_id는 대상 상품, tenant_id는 요청 테넌트, required_by_time은 필요 시점, priority는 우선순위, volume_est_gb는 예상 용량, status는 처리 상태, created_at은 생성 시각이다.dl_plan_id는 식별자, session_id는 실행 세션, dl_req_id는 요청 FK, planned_rate_mbps는 계획 전송률, planned_volume_gb는 계획 전송량, status는 상태, created_at은 생성 시각이다.product_id는 식별자, request_id는 원 요청, tenant_id는 소유 테넌트, satellite_id는 촬영 위성, sensing_time은 촬영 시각, footprint_geom은 장면 발자국, level은 처리 레벨, processing_status는 처리 상태, format은 저장 형식, uri는 저장 위치, checksum은 무결성 값, created_at은 생성 시각이다.derivation_id는 식별자, parent_product_id와 child_product_id는 상위/하위 상품, derivation_type은 파생 유형, created_at은 생성 시각이다.job_id는 식별자, product_id는 대상 상품, pipeline_name과 pipeline_version은 처리 파이프라인 정보, status는 실행 상태, started_at, finished_at은 처리 시각, log_uri는 로그 위치다.catalog_id는 식별자, product_id는 대상 상품, tenant_id는 소유 테넌트, indexed_at은 색인 시각, stac_item_uri는 STAC 메타데이터 위치다.delivery_id는 식별자, product_id는 대상 상품, tenant_id는 소유 테넌트, method는 전달 방식, destination은 수신 위치, status는 처리 상태, delivered_at은 전달 완료 시각이다.billing_id는 식별자, tenant_id, customer_id는 과금 주체, request_id와 product_id는 과금 기준 대상, charge_type은 과금 유형, amount는 금액, currency는 통화, billed_at은 청구 시각이다.audit_id는 식별자, tenant_id는 소속 테넌트, actor_type과 actor_id는 행위 주체, action은 수행 행위, entity_type과 entity_id는 대상 엔터티, correlation_id는 추적 키, event_time은 이벤트 시각, metadata_json은 상세 메타데이터다.