Není potřeba vytvářet jedinečné omezení časové dimenze. Toto funguje:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
Všimněte si, že primární klíč na id
je odstraněn.
TimescaleDB vyžaduje, aby jakékoli jedinečné omezení nebo primární klíč zahrnovaly časovou dimenzi. Toto je podobné omezení PostgreSQL v deklarativního dělení zahrnout klíč oddílu do jedinečného omezení:
TimescaleDB také vynucuje jedinečnost v každém bloku jednotlivě. Zachování jedinečnosti napříč bloky může dramaticky ovlivnit výkon příjmu.
Nejběžnější přístup k vyřešení problému s primárním klíčem je vytvořit složený klíč a zahrnout časovou dimenzi, jak je navrženo v otázce. Pokud index v dimenzi času není potřeba (neočekávají se žádné dotazy pouze na čas), lze se indexu v dimenzi času vyhnout:
CREATE TABLE event_hyper (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL,
PRIMARY KEY (id, ts)
);
SELECT create_hypertable('event_hyper', 'ts', create_default_indexes => FALSE);
Jako časovou dimenzi je také možné použít celočíselný sloupec. Je důležité, aby takový sloupec měl vlastnosti časové dimenze:hodnota se postupem času zvyšuje, což je důležité pro výkon vkládání, a dotazy vyberou časový rozsah, který je kritický pro výkon dotazů ve velké databázi. Běžný případ je pro ukládání unixové epochy.
Od id
v event_hyper
je SÉRIOVÝ, bude se časem zvyšovat. Pochybuji však, že dotazy vyberou rozsah na něm. Pro úplnost SQL bude:
CREATE TABLE event_hyper (
id serial PRIMARY KEY,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event_hyper', 'id', chunk_time_interval => 1000000);