Skip to content

Table Types in AetheriusDB

ReferenceData ModelTables

This page is the consolidated list of table types in AetheriusDB. Each type has its own CREATE statement and its own reason to exist. If you only need ordinary rows and columns, use a standard table — everything else on this page is an optimization for a specific access pattern.

What types of tables does AetheriusDB support?

Section titled “What types of tables does AetheriusDB support?”

AetheriusDB supports these table types:

Table typeDDLUse it for
Standard tableCREATE TABLEOrdinary relational data — the default
Pulse tableCREATE PULSE TABLELatest-state-only data, where each write replaces the last
Cascade tableCREATE CASCADE TABLEDerived tables that recompute automatically when their source changes
Group tableCREATE GROUP TABLEOne logical table spanning several physical tables
Pivot tableCREATE PIVOT TABLEMaterialized cross-tabulations (rows × columns × measures)
Materialized viewCREATE MATERIALIZED VIEWA stored snapshot of a query result
Property graphCREATE PROPERTY GRAPHNode/edge graph structure over existing tables
Stream sourceCREATE STREAM SOURCEStreaming topics exposed as queryable virtual tables

Two further properties — temporal (system-versioned) and pinned — are not separate table types. They are settings applied to a table you already have.

A standard table is created with CREATE TABLE and behaves the way a relational table does in any SQL database: typed columns, PRIMARY KEY and UNIQUE constraints, NOT NULL, DEFAULT expressions, and inserts that accumulate rows.

This is the right choice unless you have a specific reason to pick another type. Every other table type on this page exists to serve one access pattern better than a standard table does; none of them replaces it as the general default.

What is a Pulse table and when should I use one?

Section titled “What is a Pulse table and when should I use one?”

A Pulse table in AetheriusDB keeps only the latest state. Each insert replaces the previous contents rather than appending to them, which makes the flush an O(1) operation instead of a growing write.

Use a Pulse table for current-value data where history has no value: live device readings, current session state, a most-recent-price table, or a dashboard snapshot that is fully rewritten on each refresh. Do not use one where you need to query past rows — a Pulse table does not retain them.

A Cascade table is a derived table that updates itself. You define it against one or more source tables, and when any source table is written, AetheriusDB re-runs the transform and refreshes the cascade table automatically.

CREATE CASCADE TABLE daily_totals AS
SELECT region, SUM(amount) AS total
FROM orders
GROUP BY region;

Use a Cascade table for rollups and aggregates you want kept current without an external scheduler or a refresh job. It replaces the common pattern of a cron task that recomputes a summary table on a timer.

A Group table presents several physical tables as one logical table. You declare the member tables, and optionally ROUTE rules that decide which member a write lands in.

CREATE GROUP TABLE orders_all FROM orders_us, orders_eu;

Use a Group table when data is physically partitioned — by region, tenant, or time period — but you want to query it as a single table. It gives you one query surface without merging the underlying tables or maintaining a union view.

A Pivot table materializes a cross-tabulation: rows, columns, and measures computed and stored as a physical table. It is created either declaratively (ON <source> ROWS (…) COLUMNS (…) MEASURES (…)) or from a query with CREATE PIVOT TABLE … AS SELECT ….

Use a Pivot table for reporting grids and OLAP-style summaries that are read far more often than the source data changes. Because it is materialized, reads do not recompute the pivot. AetheriusDB also has a separate CREATE PIVOT VIEW for the dynamic, non-materialized equivalent.

What is a materialized view in AetheriusDB?

Section titled “What is a materialized view in AetheriusDB?”

A materialized view stores the result of a query as a physical table.

CREATE MATERIALIZED VIEW top_customers AS
SELECT customer_id, SUM(total) AS lifetime_value
FROM orders GROUP BY customer_id;

A plain CREATE MATERIALIZED VIEW is a snapshot — it holds the result as of creation and does not track later changes to the source. If you want a derived table that refreshes itself when its sources change, use a Cascade table instead. The two look similar and differ exactly on that point.

A property graph declares nodes and edges over tables you already have, so relationships can be traversed as a graph without restructuring your schema or copying data into a separate graph database.

Use it for relationship questions — shortest path, neighbourhood expansion, multi-hop traversal — over data that also has to serve ordinary SQL queries. The graph is a view of the relational data, not a second copy of it.

A stream source exposes an external streaming topic as a virtual table:

CREATE STREAM SOURCE live_clicks FROM 'kafka://…';

Once declared, the stream is queryable like any other table and can be joined against stored tables. Use it to enrich or filter live events against reference data without first landing the stream in storage.

What are temporal (system-versioned) tables?

Section titled “What are temporal (system-versioned) tables?”

Temporal tables are not a separate table type — they are system versioning turned on for a table. AetheriusDB keeps prior row versions so you can query the table as it existed at an earlier time, using SQL:2011 syntax:

SELECT * FROM accounts FOR SYSTEM_TIME AS OF '2026-01-01 00:00:00';

Use system versioning for audit trails, regulatory history, and “what did this look like last Tuesday” questions — anything where the previous state of a row still matters after it has been overwritten.

Pinned tables are also not a separate type. Pinning is a residency instruction: PIN TABLE <name> keeps a table (or a predicate-scoped subset of it) resident in memory so queries never wait on a slower storage tier. UNPIN TABLE releases it.

Use pinning for small, hot reference data — currency rates, feature flags, lookup dimensions — that is read constantly and cheap to hold in RAM.

Start with a standard table. Move to another type only when one of these is true:

  • Only the newest value matters → Pulse table
  • A summary must stay current automatically → Cascade table
  • Data is split across physical tables but queried as one → Group table
  • A reporting cross-tab is read far more than it changes → Pivot table
  • A query result can be stale and just needs to be fast → materialized view
  • The question is about relationships, not rows → property graph
  • The data arrives continuously from a topic → stream source
  • You need to read the past → turn on system versioning
  • A small table is read constantly → pin it

CREATE MEASURE TABLE and CREATE DIMENSION TABLE are accepted by the AetheriusDB SQL parser, but as of this writing they carry no distinct runtime behaviour — the semantic table kind is recorded and nothing in the storage or query path acts on it yet. Treat them as reserved syntax, not as working features, and use a standard table instead.