HeliosDB Multi-Model Data Guide
HeliosDB Multi-Model Data Guide
Version: 1.0 Last Updated: 2025-11-30
Quick Start
-- Create table with mixed data typesCREATE TABLE universal_data ( id SERIAL PRIMARY KEY, json_data JSONB, -- Document data xml_data XML, -- Hierarchical data relational_data RECORD, -- Structured data timeseries_data JSONB, -- Time series data graph_data TEXT -- Graph edges);
-- Query all data types togetherSELECT id, json_data->>'name' as name, (xml_data).nodename as xml_node, (relational_data).column1 as rel_valueFROM universal_data;Data Types
JSONB (Document Data)
-- Store document dataCREATE TABLE documents ( id SERIAL PRIMARY KEY, data JSONB);
INSERT INTO documents VALUES (1, '{"title": "Article", "tags": ["tech", "ai"]}');
-- QuerySELECT data->>'title' as title, jsonb_array_length(data->'tags') as tag_countFROM documents;XML (Hierarchical Data)
-- Store XMLCREATE TABLE xml_data ( id SERIAL PRIMARY KEY, content XML);
-- QuerySELECT xmlexists('//book[price > 20]' passing by ref content) as has_expensiveFROM xml_data;Relational (Structured Data)
-- Structured recordsCREATE TABLE mixed ( id SERIAL PRIMARY KEY, person RECORD);
-- InsertINSERT INTO mixed VALUES(1, ROW('John', 30, 'Engineer')::person_type);Array Types
-- Array columnsCREATE TABLE datasets ( id SERIAL PRIMARY KEY, numeric_array INTEGER[], text_array TEXT[], nested_array INTEGER[][]);
-- QuerySELECT id, array_length(numeric_array, 1) as count, array_agg(DISTINCT unnest(text_array)) as unique_valuesFROM datasetsGROUP BY id;Multi-Model Queries
Cross-Type Joins
-- Join document and relational dataSELECT doc.id, doc.data->>'title', struct.name, struct.ageFROM documents docJOIN structured_data struct ON doc.id = struct.id;Hybrid Aggregation
-- Aggregate mixed data typesSELECT (data->>'category')::TEXT as category, COUNT(*) as doc_count, AVG((data->>'price')::NUMERIC) as avg_price, array_agg(DISTINCT tags) as all_tagsFROM json_documentsWHERE (data->>'active')::BOOLEAN = trueGROUP BY category;Performance
Indexing Mixed Data
-- Index JSON keysCREATE INDEX idx_doc_title ON documents USING GIN(data);
-- Index XML nodesCREATE INDEX idx_xml_nodes ON xml_data USING GIN(content);
-- Index array elementsCREATE INDEX idx_array_elem ON datasets USING GIN(numeric_array);Query Planning
-- Mixed type query optimizationEXPLAIN ANALYZESELECT * FROM documents docJOIN structured_data s ON doc.id = s.idWHERE doc.data->>'type' = 'article'AND s.created_date > NOW() - INTERVAL '30 days';ETL Patterns
Converting Between Types
-- Document to RelationalCREATE TABLE orders_relational ASSELECT (data->>'order_id')::INTEGER as order_id, (data->>'customer')::TEXT as customer_name, (data->>'amount')::NUMERIC as amountFROM json_orders;
-- Relational to DocumentCREATE TABLE orders_json ASSELECT to_jsonb(orders_table);Best Practices
- Choose appropriate type for data structure
- Index frequently queried fields
- Use schemaless for flexible data
- Validate data on insert
- Monitor storage usage
- Use type conversions wisely
Related Documentation: