Няма нужда да създавате уникално ограничение на времевото измерение. Това работи:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
Обърнете внимание, че първичният ключ на id
се премахва.
TimescaleDB изисква всяко уникално ограничение или първичен ключ да включва измерението време. Това е подобно на ограничението на PostgreSQL в декларативно разделяне за включване на разделителен ключ в уникално ограничение:
TimescaleDB също налага уникалност във всяка част поотделно. Поддържането на уникалност в частите може драстично да повлияе на производителността при приемане.
Най-често срещаният подход за да коригирате проблема с първичния ключ е да създадете съставен ключ и да включите времевото измерение, както е предложено във въпроса. Ако индексът на времевата величина не е необходим (не се очакват заявки само по време), тогава индексът на времевата величина може да бъде избегнат:
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);
Възможно е също така да се използва колона с цели числа като измерение на времето. Важно е такава колона да има свойства на измерението на времето:стойността се увеличава с течение на времето, което е важно за производителността на вмъкването, и заявките ще изберат времеви диапазон, който е от решаващо значение за производителността на заявките в голяма база данни. Често срещаният случай е за съхраняване на unix епоха.
Тъй като id
в event_hyper
е СЕРИЕН, ще се увеличава с времето. Съмнявам се обаче, че заявките ще изберат диапазона в него. За пълнота SQL ще бъде:
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);