Database Schema

All PostgreSQL tables, columns, relationships, and useful queries.

uns_state

Written by: uns-state — completed machine state durations.

ColumnTypeDescription
machineTEXTMachine identifier
stateTEXTACTIVE, IDLE, ALARM, etc.
started_at / ended_atTIMESTAMPTZDuration boundaries
duration_sNUMERICSeconds
next_stateTEXTTransitioned to

uns_stoppage

Written by: uns-stoppage — links 1:1 to uns_state via state_id.

ColumnTypeDescription
state_idBIGINT UNIQUEReferences uns_state.id
reason_codeTEXTFAULT, NO_WORK, etc.
categoryTEXTplanned / unplanned
auto_classifiedBOOLEANAuto vs operator override

uns_productivity

Written by: uns-productivity — completed production runs.

ColumnTypeDescription
program_id / program_nameTEXTCNC program
parts_completed / parts_targetINTActual vs target
parts_per_hourNUMERICThroughput rate
reasonTEXTcompleted, changed, stopped

uns_input

Written by: uns-input — flexible JSONB data.

ColumnType
input_typeTEXT (scrap, note, quality...)
operatorTEXT
dataJSONB

uns_log

Written by: uns-log — change snapshots.

ColumnType
valuesJSONB (complete snapshot)
changedTEXT[] (changed fields)

Useful Queries

-- Utilisation
SELECT machine, ROUND(SUM(CASE WHEN state='ACTIVE' THEN duration_s ELSE 0 END)/SUM(duration_s)*100,1) AS pct
FROM uns_state WHERE started_at >= NOW()-INTERVAL '24 hours' GROUP BY machine;

-- Stoppage pareto
SELECT reason_code, category, COUNT(*), ROUND(SUM(duration_s)/60,1) AS mins
FROM uns_stoppage WHERE started_at >= NOW()-INTERVAL '24 hours'
GROUP BY reason_code, category ORDER BY mins DESC;

-- MTBF / MTTR
SELECT machine, ROUND(AVG(duration_s)/60,1) AS mtbf FROM uns_state
WHERE state='ACTIVE' AND next_state='ALARM' GROUP BY machine;
SELECT machine, ROUND(AVG(duration_s)/60,1) AS mttr FROM uns_state
WHERE state='ALARM' GROUP BY machine;