← 목록으로

modeling/0.integrated-ERD.md


통합 ERD v2

문서 목차

통합 기준

공통 핵심 엔터티

업무 도메인 구분

v2 문서는 테이블을 단순 기술 분류가 아니라 실제 업무 흐름 기준으로 다음 7개 업무 도메인으로 구분한다.

테이블-업무 도메인 매핑

업무 도메인 주요 책임 포함 테이블
고객/계정 관리 조직, 사용자, 접근 권한, 인증 키 관리 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

서브 도메인별 업무 설명

1. 고객/계정 관리

2. 위성/자산 관리

3. 궤도/지상국 운영

4. 촬영 요청 / Feasibility 평가

5. 스케줄링 / 실행 통제

6. 데이터 상품 / 다운링크 / 전달

7. 감사 / 추적

도메인 그룹 뷰 (Mermaid)

erDiagram은 도메인별 그룹 박스를 직접 표현하기에 제약이 있어, 업무 도메인 박스는 flowchartsubgraph로 별도 표현한다. 이 뷰는 도메인 경계와 주요 연계를 빠르게 파악하기 위한 상위 차트다.

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

상세 통합 ERD (Mermaid)

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

해석 메모

테이블 정의서

아래 정의서는 위의 업무 도메인 구분을 기준으로 정리했다.

1. 고객/계정 관리 Domain

TENANT

CUSTOMER

USER_ACCOUNT

ROLE

USER_ROLE

API_KEY

2. 위성/자산 관리 Domain

SATELLITE

SATELLITE_PROFILE_SET

IMAGING_PROFILE

COMM_PROFILE

CONSTRAINT_PROFILE

3. 궤도/지상국 운영 Domain

ORBIT_SOURCE

TLE

GROUND_STATION

VISIBILITY_PASS

ANTENNA_RESOURCE

CONTACT_SESSION

4. 촬영 요청 / Feasibility 평가 Domain

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

5. 스케줄링 / 실행 통제 Domain

SCHEDULE_RUN

SCHEDULE_SLOT

SCHEDULE_SLOT_HISTORY

COMMAND_DICTIONARY

COMMAND_REQUEST

COMMAND_EXECUTION

6. 데이터 상품 / 다운링크 / 전달 Domain

DOWNLINK_REQUEST

DOWNLINK_PLAN

DATA_PRODUCT

PRODUCT_DERIVATION

PROCESS_JOB

CATALOG_ITEM

DELIVERY_ORDER

BILLING_RECORD

7. 감사 / 추적 Domain

AUDIT_LOG