데이터베이스 모델
플랫폼이 데이터를 어디에 무슨 모양으로 담는지 정리한 문서입니다. 백업 범위를 정하거나, 직접 조회해야 하거나, 보존 기간을 조정할 때 봅니다.
플랫폼은 데이터 성격에 따라 저장소를 나눠 씁니다(polyglot persistence). 어느 데이터가 어디 있는지 모르면 백업이 반쪽이 됩니다.
| 저장소 | 담는 것 | 규모 |
|---|---|---|
| PostgreSQL | 마스터 데이터 · 설정 · 트랜잭션 | pp 스키마 169 테이블 + 현장 앱 pf 스키마 |
Aster TSDB (pp) | 시계열 · 이벤트 · 집계 · KPI | 125 테이블 |
Iceberg (spark.plantpulse) | 장기 보관 · 분석 | 1 테이블 |
PostgreSQL — 마스터와 설정
관계형 데이터가 들어갑니다. 스키마 변경은 Flyway 가 관리하며 이력은
flyway_schema_history_v2 에 남습니다.
테이블 이름은 mm_ 접두사(master/meta)가 159개로 대부분입니다. 묶음별 전체 목록은 아래에 있습니다.
| 묶음 | 대표 테이블 |
|---|---|
| 조직·자산 | mm_asset_tree · mm_enterprise · mm_site · mm_area · mm_line · mm_equipment · mm_asset_class |
| 수집 정의 | mm_opc · mm_tag · mm_point · mm_edge |
| 알람 | mm_alarm · mm_alarm_config · mm_alarm_delivery · mm_alarm_suppressed · mm_alarm_shelve · mm_alarm_out_of_service |
| 생산 | mm_order · mm_order_oee · mm_product · mm_shift · mm_calendar |
| 정비·고장 | mm_maintenance_order · mm_maintenance_plan · mm_failure_record |
| 사람·거래처 | mm_employee · mm_customer |
| 보안 | mm_security · mm_token · user_login · user_login_session |
관계 — 자산과 수집
mm_asset_tree 한 표에 기업(E) → 사이트(S) → 구역(A) → 라인(L) → 설비(M) 다섯 층이 모두 들어갑니다.
이름·설명·설비 분류·운전 상태·외부 번호처럼 모든 층이 가진 칸은 트리에만 있습니다 — mm_site 에 site_name 이,
mm_enterprise 에 enterprise_name 이 없습니다. 층마다 고유한 칸은 1:1 확장 표(mm_enterprise · mm_site · mm_area ·
mm_line · mm_equipment)에 있고, 트리 행을 지우면 함께 지워집니다.
| 규칙 | 지키는 쪽 |
|---|---|
| 부모는 바로 위 층이고, 구역 아래로는 같은 사이트 | 외래키 fk_mm_asset_tree_parent · fk_mm_asset_tree_parent_site |
뿌리는 기업뿐이고 기업에는 site_id 가 없음, 사이트의 site_id 는 자기 자신 | CHECK 제약 |
층마다 ID 꼴 — 정식 접두 또는 옛 ASSET_ | CHECK chk_asset_id |
| 설비만 받는 칸(워크오더·정비·달력 등) | mm_equipment 를 가리키는 외래키 |
위치 경로는 뷰 mv_path 가 줍니다 — 노드마다 asset_type · depth(기업 0 ~ 설비 4) · enterprise_id · site_id · area_id · line_id · equipment_id · id_path · name_path.
관계 — 알람
관계 — 생산과 사용자
위 관계는 대부분 외래키로 선언돼 있습니다. 그래서 참조되는 행을 직접 DELETE 하면 거절되거나, 표에 따라 함께 지워집니다
(ON DELETE CASCADE). 지우는 일은 화면이나 API 로 하십시오.
전체 테이블 (169)
| 묶음 | 테이블 |
|---|---|
| 조직·자산 (29) | mm_area · mm_area_function · mm_asset_class · mm_asset_class_iso_class · mm_asset_connection_status · mm_asset_document · mm_asset_health_status · mm_asset_layout · mm_asset_plan_generation · mm_asset_plan_segment · mm_asset_qr_access_audit · mm_asset_qr_token · mm_asset_relation · mm_asset_standard_profile · mm_asset_status · mm_asset_tree · mm_asset_type · mm_canvas · mm_enterprise · mm_equipment · mm_equipment_criticality · mm_image · mm_line · mm_line_kind · mm_operational_status · mm_site · mm_stats_site · mm_stats_system · mm_status |
| 수집 정의 (11) | mm_edge · mm_edge_status_snapshot · mm_opc · mm_opc_connection_status · mm_opc_latency_status · mm_opc_protocol · mm_opc_source_type · mm_point · mm_tag · mm_tag_java_type · mm_tag_type |
| 알람 (16) | mm_alarm · mm_alarm_cause · mm_alarm_config · mm_alarm_config_recipient · mm_alarm_config_revision · mm_alarm_delay · mm_alarm_delivery · mm_alarm_label_revision · mm_alarm_notification · mm_alarm_out_of_service · mm_alarm_resolution_guide · mm_alarm_resolution_guide_cause · mm_alarm_shelve · mm_alarm_signal_gap · mm_alarm_suppressed · mm_tag_alarm_recipient |
| 설비 명령·스테이트먼트 (13) | mm_asset_command · mm_asset_command_revision · mm_asset_statement · mm_asset_statement_deployment · mm_asset_statement_plugin · mm_asset_statement_revision · mm_command_area · mm_command_execution · mm_command_execution_event · mm_command_switch · mm_command_switch_audit · mm_event · mm_event_attributes |
| 생산 (35) | mm_calendar · mm_calendar_revision · mm_calendar_type · mm_defect_cause · mm_defect_record · mm_defect_record_revision · mm_holiday · mm_order · mm_order_ems · mm_order_flow · mm_order_note · mm_order_oee · mm_order_pause · mm_order_performance · mm_order_progress · mm_order_quantity_correction · mm_order_quantity_correction_revision · mm_order_ram · mm_order_revision · mm_process_segment · mm_process_segment_asset · mm_product · mm_product_route · mm_product_standard_profile · mm_production_target · mm_shift · mm_shift_override · mm_shift_pattern · mm_shift_pattern_asset · mm_shift_pattern_slot · mm_shift_schedule_revision · mm_shift_slot_break · mm_stop_cause · mm_stop_reason · mm_stop_reason_revision |
| 정비·고장 (25) | mm_failure_record · mm_failure_record_change · mm_failure_record_label · mm_failure_record_link · mm_fault_cause · mm_fault_cause_alarm_cause · mm_fault_code_map · mm_fault_code_map_history · mm_iso_detection_method · mm_iso_equipment_category · mm_iso_equipment_class · mm_iso_failure_cause · mm_iso_failure_mechanism · mm_iso_failure_mode · mm_iso_failure_mode_class · mm_iso_maintainable_item · mm_iso_maintainable_item_class · mm_iso_maintenance_activity · mm_maintenance_attachment · mm_maintenance_code_map · mm_maintenance_code_map_history · mm_maintenance_order · mm_maintenance_order_revision · mm_maintenance_plan · mm_maintenance_plan_revision |
| 사람·거래처 (10) | mm_app_account · mm_app_account_audit · mm_app_account_revision · mm_app_account_scope · mm_customer · mm_employee · mm_employee_audit · mm_employee_emergency_contact · mm_employee_photo · mm_employee_qualification |
| 플로우 (5) | mm_flow · mm_flow_health_status · mm_flow_link · mm_flow_node · mm_flow_snapshot |
| 보안 (3) | mm_security · mm_security_asset_scope · mm_token |
| 기타 (22) | mm_blob · mm_config · mm_diagnostic_code · mm_diagnostic_state · mm_metadata · mm_query_history · mm_reference_external_key · mm_reference_revision · mm_reference_text · mm_report · mm_schedule_fire_log · mm_schedule_watermark · dual · edge_active_flows · flow_snapshots · flyway_schema_history_v2 · metadata · node_component · user_login · user_login_session · version · version_history |
Aster TSDB — 시계열과 이벤트
키스페이스는 pp 입니다. 125개 테이블이 두 갈래로 나뉩니다.
| 접두사 | 개수 | 뜻 |
|---|---|---|
tm_ | 117 | 시계열·집계·통계·KPI (time series measurement) |
ts_ | 8 | 범용 시계열 엔진 내부 구조 |
tm_ 은 대상별로 다시 갈립니다 — 태그 32 · KPI 26 · 자산 17 · 시스템 6 · 모니터 6 · 옵션 5
OPC 5 · 사이트 3 · blob 3 등.
핵심 테이블 — tm_tag_point
원시 수집값이 들어가는 자리입니다. 나머지 태그 테이블은 대개 이것의 파생입니다.
PRIMARY KEY (tag_id, timestamp)
WITH CLUSTERING ORDER BY (timestamp DESC)
| 성질 | 값 |
|---|---|
| 파티션 키 | tag_id — 태그 하나가 파티션 하나 |
| 클러스터링 | timestamp 내림차순 — 최신부터 읽는 것이 기본 |
| 기본 TTL | 315360000 초 = 3650일(10년) — 값의 정본은 storage.tag.point.ttl 입니다 (보존 기간 설정) |
| Compaction | UnifiedCompactionStrategy (Cassandra 5.0+ 기능) |
| 인덱스 | asset_id · opc_id 에 SAI(Storage Attached Index) |
site_id · asset_id · line_id · area_id · opc_id · tag_name · type 은
static 입니다. 태그 하나(=파티션 하나) 안에서 값이 같으므로 파티션당 한 번만 저장합니다.
매 데이터 포인트마다 반복 저장하지 않아 용량이 크게 줄어듭니다.
파생 테이블 — 미리 계산해 둔다
Aster TSDB 는 조회 시점 집계가 비싸므로 쓸 때 미리 만들어 둡니다. 그래서 테이블이 많습니다.
| 갈래 | 예 |
|---|---|
| 집계 | tm_tag_point_aggregation_{1,5,10,30}_minutes · _1_hours |
| 샘플링 | tm_tag_point_sampling_{10,30}_seconds · _{1,5,10,30}_minutes · _1_hours |
| 카운트 | tm_tag_point_count · _by_date · _by_opc · _by_site |
| 품질·검증 | tm_tag_point_validation · _by_timestamp · _validation_count |
| AI 분석 | tm_tag_point_anomalies · _forecasts |
| 스냅샷·보관 | tm_tag_point_snapshot · tm_tag_point_archive |
알람도 같은 방식입니다 — tm_tag_alarm 과 _count · _count_by_date · _count_by_opc
_count_by_site · _duration · _on.
원시 데이터에서 다시 만들어지지 않습니다. 지우면 그 구간의 화면·리포트가 비어 버리고 복구는 백업뿐입니다.
KPI 테이블 — OEE · RAM · EMS
설비 KPI(OEE · RAM · EMS)는 tm_kpi_ 로 시작하는 26개 테이블에 담깁니다 — 도메인별로
tm_kpi_oee_* · tm_kpi_ram_* · tm_kpi_ems_* 입니다. 계산 잡이 약 10초마다 설비별로 값을 계산해 씁니다.
tm_asset_oee* · tm_asset_ram* · tm_asset_ems* 테이블은 없습니다KPI 는 이제 새 테이블에만 씁니다. 옛 이름으로 조회하던 쿼리·리포트는 새 테이블과 파티션 키에 맞게 고쳐야 합니다. 키가 바뀌었으므로 옛 조건을 그대로 옮기면 오류가 아니라 빈 결과가 나오기 쉽고, 그 빈 결과는 「데이터 없음」과 구별되지 않습니다.
테이블은 모양에 따라 네 갈래입니다.
| 갈래 | 이름 | 기본키 | 한 행이 뜻하는 것 |
|---|---|---|---|
| 현재값 | tm_kpi_*_current | (asset_id) | 설비의 지금 값 — 설비당 한 행, 계산할 때마다 덮어쓴다 |
| 오더별 | tm_kpi_oee_order · tm_kpi_ems_order | (order_id) | 작업 오더 하나의 값 — 오더당 한 행, 오더가 끝나도 남는다 |
| 이력 | tm_kpi_*_history 등 | ((asset_id, day), timestamp) | 계산 한 번(틱)의 값 — UTC 날짜별 파티션, 최신이 먼저 |
| 롤업 | tm_kpi_*_rollup | ((scope, scope_id, day), timestamp) | 라인 · 구역 · 사이트 · 기업 단위로 묶은 값 |
- 버킷은 UTC 날짜입니다.
day는yyyymmdd,month는yyyymm정수이고, 행의timestamp를 UTC 로 본 날짜입니다 — 사이트 현지 자정이 아닙니다. 그래서 현지 하루는 UTC 버킷 두 개에 걸칩니다(한국 시간 00:00 ~ 08:59 의 행은 전날 UTC 버킷에 있습니다). - 드물게 생기는 데이터는 월 버킷입니다 — 설비 상태(
tm_kpi_oee_status), 고장 (tm_kpi_ram_failure·_failure_rollup), 연료(tm_kpi_ems_fuel)는month로 파티션을 나눕니다. - 롤업의
scope는LINE·AREA·SITE·ENTERPRISE중 하나이고,scope_id는 그 라인·구역·사이트의 ID 입니다. 기업 단위는scope_id = 'ALL'입니다. - 원인 카운터
tm_kpi_oee_defect_cause·_stop_cause·_fault_cause는 불량 · 정지 · 고장 원인별 일 누계입니다. 기본키는((asset_id, month), date, cause_code)입니다. - 이력 행은 오더 누계입니다.
*_history의 한 행은 그 틱까지의 오더 전체 값(가동시간 · 생산수 · 에너지 등)입니다. 행을 더하지 마세요 — 기간 값이 필요하면 오더별로 마지막 행이나*_order행을 읽습니다. - 설비 상태의 지속시간은 저장하지 않습니다.
tm_kpi_oee_status는 상태가 바뀐 시각만 담고, 한 상태는 다음 행의 시각까지 이어집니다. 월 경계에서 자르지 말고 버킷을 이어서 읽습니다.
asset_id 와 day(또는 month)를 모두 조건에 넣습니다. ALLOW FILTERING 은 쓰지
마세요. 기간을 조회할 때는 기간을 UTC 날짜 목록으로 펼쳐 버킷마다 한 번씩 읽습니다.
SELECT timestamp, oee, availability, performance, quality
FROM pp.tm_kpi_oee_history
WHERE asset_id = 'EQUIPMENT_000001' AND day = 20260925
AND timestamp >= '2026-09-25 00:00:00+0000';
사이트에 속한 설비별 값이 필요하면 설비 목록을 PostgreSQL 에서 얻고 설비마다
tm_kpi_*_current 를 읽습니다. 사이트 합계는 롤업 테이블의 scope = 'SITE' 입니다.
보존 기간은 5년입니다. 버킷이 있는 테이블(이력 · 이벤트 · 상태 · 롤업 등)의 기본 TTL 은
157680000 초(1825일)이고, 값의 정본은 storage.asset.kpi.ttl(없으면
storage.asset.standard.ttl) 입니다(보존 기간 설정). 현재값(*_current) · 오더별(*_order) · 원인 카운터는 TTL 이 없습니다.
이력성 테이블 14개는 매일 Iceberg 의 tw_kpi_* 로 옮겨 적어 두므로,
5년이 지나 Aster TSDB 에서 지워진 뒤에도 Iceberg 에서 조회할 수 있습니다.
어떻게 나뉘나 — 파티션 키가 곧 조회 축입니다
Aster TSDB 에는 조인이 없습니다. 묻는 방식대로 표를 따로 만듭니다 — 그래서 표가 125개입니다. 같은 데이터가 여러 표에 다른 파티션 키로 들어 있는 것은 중복이 아니라 설계입니다.
| 파티션 키 모양 | 무엇을 위한 것 | 예 |
|---|---|---|
(tag_id) + timestamp | 한 태그의 시간축 조회 | tm_tag_point |
(asset_id, date, hour) + timestamp | 한 설비의 하루·한 시간 구간 | tm_asset_data |
(asset_id, day) + timestamp | 한 설비의 UTC 하루 KPI | tm_kpi_oee_history |
(scope, scope_id, day) + timestamp | 라인·구역·사이트·기업의 UTC 하루 KPI | tm_kpi_oee_rollup |
(site_id, year, month, day) | 사이트 단위 집계 | tm_site_summary |
(id) 만 | 현재값 — 시간축이 없어 만료도 없다 | *_count, *_last_update, tm_kpi_*_current |
전체 테이블 (125)
태그 · 포인트 (32)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
tm_tag_alarm | tag_id, alarm_seq |
tm_tag_alarm_count | `` |
tm_tag_alarm_count_by_date | tag_id, year, month, day, hour, minute |
tm_tag_alarm_count_by_opc | (opc_id, tag_id), year, month, day, hour, minute |
tm_tag_alarm_count_by_site | (site_id, tag_id), year, month, day, hour, minute |
tm_tag_alarm_duration | alarm_config_id, alarm_seq |
tm_tag_alarm_on | `` |
tm_tag_point | tag_id, timestamp |
tm_tag_point_aggregation_10_minutes | tag_id, timestamp |
tm_tag_point_aggregation_1_hours | tag_id, timestamp |
tm_tag_point_aggregation_1_minutes | tag_id, timestamp |
tm_tag_point_aggregation_30_minutes | tag_id, timestamp |
tm_tag_point_aggregation_5_minutes | tag_id, timestamp |
tm_tag_point_anomalies | job_id, timestamp, tag_id |
tm_tag_point_archive | (site_id, year, month, day, hour), minute, second, tuuid |
tm_tag_point_count | `` |
tm_tag_point_count_by_date | tag_id, year, month, day, hour, minute |
tm_tag_point_count_by_opc | `` |
tm_tag_point_count_by_site | `` |
tm_tag_point_forecasts | job_id, timestamp, tag_id |
tm_tag_point_map | (year, month, day, hour, minute), timestamp |
tm_tag_point_sampling_10_minutes | tag_id, timestamp |
tm_tag_point_sampling_10_seconds | tag_id, timestamp |
tm_tag_point_sampling_1_hours | tag_id, timestamp |
tm_tag_point_sampling_1_minutes | tag_id, timestamp |
tm_tag_point_sampling_30_minutes | tag_id, timestamp |
tm_tag_point_sampling_30_seconds | tag_id, timestamp |
tm_tag_point_sampling_5_minutes | tag_id, timestamp |
tm_tag_point_snapshot | (site_id, snapshot_id, date), timestamp |
tm_tag_point_validation | tag_id, timestamp |
tm_tag_point_validation_by_timestamp | yyyymmdd, timestamp, tag_id |
tm_tag_point_validation_count | tag_id, year, month, day, hour, minute |
자산 (17)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
tm_asset_aggregation | asset_id, timestamp |
tm_asset_alarm | asset_id, alarm_seq |
tm_asset_command | asset_id, timestamp |
tm_asset_connection_status | asset_id, timestamp |
tm_asset_context | asset_id, timestamp |
tm_asset_data | (asset_id, date, hour), timestamp |
tm_asset_data_anomalies | job_id, timestamp, asset_id, tag_id |
tm_asset_data_based_day | asset_id, timestamp |
tm_asset_data_based_hour | asset_id, timestamp |
tm_asset_data_based_minute | (asset_id, date), timestamp |
tm_asset_data_based_second | (asset_id, date, hour), timestamp |
tm_asset_data_based_timestamp | (asset_id, date, hour), timestamp |
tm_asset_data_forecasts | job_id, timestamp, asset_id, tag_id |
tm_asset_event | asset_id, timestamp |
tm_asset_health_status | asset_id, timestamp |
tm_asset_status | asset_id, timestamp |
tm_asset_timeline | asset_id, timestamp, timeline_group, timeline_type |
KPI — OEE · RAM · EMS (26)
버킷 열의 「일」은 day(UTC yyyymmdd), 「월」은 month(UTC yyyymm) 입니다.
원인 카운터의 month 는 date 에서 얻습니다. 읽는 법은 KPI 테이블 절을 보세요.
| 테이블 | 기본키 (파티션 · 클러스터링) | 버킷 | 담는 것 |
|---|---|---|---|
tm_kpi_oee_current | asset_id | — | 설비의 지금 OEE |
tm_kpi_oee_order | order_id | — | 작업 오더 하나의 OEE |
tm_kpi_oee_history | (asset_id, day), timestamp | 일 | 계산 틱마다의 OEE(오더 누계) |
tm_kpi_oee_event | (asset_id, day), timestamp | 일 | OEE 입력 이벤트 |
tm_kpi_oee_count | (asset_id, day), timestamp | 일 | 양품 · 불량 생산 수(로트 · 시리얼) |
tm_kpi_oee_rolling | (asset_id, day), timestamp | 일 | 최근 N분 OEE |
tm_kpi_oee_rollup | (scope, scope_id, day), timestamp | 일 | 라인 · 구역 · 사이트 · 기업 OEE |
tm_kpi_oee_status | (asset_id, month), timestamp | 월 | 설비 상태 변경 |
tm_kpi_oee_status_current | asset_id | — | 설비의 직전 상태 |
tm_kpi_oee_defect_cause | (asset_id, month), date, cause_code | 월 | 불량 원인 일 누계(카운터) |
tm_kpi_oee_stop_cause | (asset_id, month), date, cause_code | 월 | 정지 원인 일 누계(카운터) |
tm_kpi_oee_fault_cause | (asset_id, month), date, cause_code | 월 | 고장 원인 일 누계(카운터) |
tm_kpi_ram_current | asset_id | — | 설비의 지금 RAM |
tm_kpi_ram_history | (asset_id, day), timestamp | 일 | 계산 틱마다의 RAM(오더 누계) |
tm_kpi_ram_failure | (asset_id, month), timestamp | 월 | 고장 시작 · 종료 이벤트 |
tm_kpi_ram_failure_rollup | (scope, scope_id, month), timestamp, asset_id | 월 | 라인 · 구역 · 사이트 고장 이벤트 |
tm_kpi_ram_rolling | (asset_id, day), timestamp | 일 | 최근 N분 RAM |
tm_kpi_ram_rollup | (scope, scope_id, day), timestamp | 일 | 라인 · 구역 · 사이트 · 기업 RAM |
tm_kpi_ems_current | asset_id | — | 설비의 지금 EMS |
tm_kpi_ems_order | order_id | — | 작업 오더 하나의 EMS |
tm_kpi_ems_history | (asset_id, day), timestamp | 일 | 계산 틱마다의 EMS(오더 누계) |
tm_kpi_ems_power | (asset_id, day), timestamp | 일 | 전력 계량 이벤트(kW · kWh) |
tm_kpi_ems_power_rollup | (scope, scope_id, day), timestamp, asset_id | 일 | 라인 · 구역 · 사이트 전력 이벤트 |
tm_kpi_ems_fuel | (asset_id, month), timestamp | 월 | 연료 계량 이벤트(스코프 1) |
tm_kpi_ems_rolling | (asset_id, day), timestamp | 일 | 최근 N분 EMS |
tm_kpi_ems_rollup | (scope, scope_id, day), timestamp | 일 | 라인 · 구역 · 사이트 · 기업 EMS |
수집 · 사이트 (8)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
tm_opc_connection_latency_history | opc_id, timestamp |
tm_opc_connection_status_history | opc_id, timestamp |
tm_opc_point_count | `` |
tm_opc_point_count_by_date | opc_id, year, month, day, hour, minute |
tm_opc_point_last_update | `` |
tm_site_status | site_id, timestamp |
tm_site_summary | site_id, year, month, day, hour, minute |
tm_site_summary_total | `` |
모니터링 (13)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
tm_monitor_cep_metrics | type, timestamp |
tm_monitor_cluster_metrics | type, ip, timestamp |
tm_monitor_cluster_status | type, ip, timestamp |
tm_monitor_nodes | type, ip |
tm_monitor_platform_health | type, ip, timestamp |
tm_monitor_platform_status | type, ip, timestamp |
tm_system_health_status | app_name, timestamp |
tm_system_log | app_name, timestamp, seq |
tm_system_log_count | (app_name, level), year, month, day, hour, minute |
tm_system_log_hourly | app_name, bucket_start, instance_id, level |
tm_system_properties | property, timestamp |
tm_system_start_date | `` |
tm_system_trend | year, month, day, hour |
배치 · 감사 (4)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
tm_batch_audit | yyyymmdd, timestamp, id |
tm_batch_job_run | yyyymmdd, timestamp, id |
tm_warehouse_audit | yyyymmdd, timestamp, id |
tm_warehouse_storage_usage_daily | year_bucket, day, table_name |
시계열 엔진 (TSE 전용) (8)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
ts_data_points | key, column1 |
ts_row_key_index | key, column1 |
ts_row_key_time_index | metric, table_name, row_time |
ts_row_keys | (metric, table_name, row_time), data_type, tags |
ts_service_index | (service, service_key), key |
ts_spec | spec_type, name |
ts_string_index | key, column1 |
ts_tag_indexed_row_keys | (metric, table_name, row_time, single_tag_pair), data_type, tag_collection_hash, tags |
그 밖 (17)
| 테이블 | 기본키 (파티션 · 클러스터링) |
|---|---|
tm_blob | blob_id, timestamp |
tm_blob_count_and_size | `` |
tm_blob_object | `` |
tm_data_gateway_count | `` |
tm_data_gateway_log | lang, timestamp |
tm_database_size | keyspace_name, date |
tm_diagnostic | year, timestamp |
tm_diagnostic_count | year, level |
tm_domain_change_history | (domain_type, object_id), timestamp |
tm_edge_status | `` |
tm_option_eql_listener_result | `` |
tm_option_eql_statement | `` |
tm_option_eql_statement_history | stmt_name, timestamp |
tm_option_job_trigger_history | job_name, context_fire_time |
tm_option_listener_push_cache | url, timestamp |
tm_pipeline_exception_history | bucket, timestamp, type, object_id |
tm_trigger_result | trigger_id, timestamp |
Iceberg — 장기 보관
아카이브 테이블(tm_tag_point_archive, 기본 365일)의 데이터를 오브젝트 스토리지에 쌓아 분석합니다.
원시 테이블에서 바로 넘어가는 것이 아니라 아카이브를 거칩니다.
| 항목 | 값 |
|---|---|
| 카탈로그 | spark.plantpulse |
| 테이블 | tw_tag_point — 태그 시계열. tw_asset_* · tw_blob 등 tw_ 로 시작하는 9종이 있습니다. KPI 는 tw_kpi_* 14종이 따로 있습니다 |
| 파티션 | site_id → year → month → day |
| 포맷 | Iceberg v2 (row-level delete 지원) |
| 압축 | Zstandard |
| 실행 | Spark SQL |
KPI 아카이브 — tw_kpi_*
KPI 는 아카이브 테이블을 거치지 않고 tm_kpi_* 에서 바로 옮겨집니다. 매일 새벽 전날
하루치를 복사하므로, 최근 데이터는 Aster TSDB 와 Iceberg 양쪽에 있고 5년(TTL)이 지난
데이터는 Iceberg 에만 남습니다. Iceberg 쪽은 지우지 않습니다. 파티션은 year → month → day
(월 버킷 테이블은 year → month)입니다.
| Aster TSDB | Iceberg |
|---|---|
tm_kpi_oee_history · _event · _count · _status · _rollup | tw_kpi_oee_history · _event · _count · _status · _rollup |
tm_kpi_ram_history · _failure · _rollup · _failure_rollup | tw_kpi_ram_history · _failure · _rollup · _failure_rollup |
tm_kpi_ems_history · _power · _fuel · _rollup · _power_rollup | tw_kpi_ems_history · _power · _fuel · _rollup · _power_rollup |
현재값(*_current · oee_status_current) · 오더별(*_order) · 최근 N분(*_rolling) · 원인
카운터(*_cause)는 옮기지 않습니다 — 이력이 아니거나 이력에서 다시 계산할 수 있는 값입니다.
Aster TSDB 에는 없습니다. Iceberg 쪽을 조회하세요 → 분석 계층. 테이블별 보존 기간은 데이터 보존 기간(TTL) 설정 에 있습니다.
백업에서 놓치기 쉬운 것
세 저장소가 각각 백업 대상입니다. PostgreSQL 만 받아 두고 안심하는 경우가 있는데, 그러면 시계열이 통째로 빠집니다.
| 저장소 | 빠뜨리면 |
|---|---|
| PostgreSQL | 설비·태그 정의, 사용자, 대시보드가 사라진다 |
| Aster TSDB | 보존 기간 안의 시계열이 사라진다 |
| Iceberg / 오브젝트 스토리지 | 장기 이력이 사라진다 |
절차는 백업 및 복구 를 보세요.