No hay necesidad de crear una restricción única en la dimensión del tiempo. Esto funciona:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
Tenga en cuenta que la clave principal en id
se elimina.
TimescaleDB requiere que cualquier restricción única o clave principal incluya la dimensión de tiempo. Esto es similar a la limitación de PostgreSQL en particionamiento declarativo para incluir la clave de partición en la restricción única:
TimescaleDB también impone la unicidad en cada fragmento individualmente. Mantener la unicidad entre fragmentos puede afectar drásticamente el rendimiento de la ingesta.
El enfoque más común para solucionar el problema con la clave principal es crear una clave compuesta e incluir la dimensión de tiempo como se propone en la pregunta. Si no se necesita el índice en la dimensión de tiempo (no se esperan consultas solo en el tiempo), entonces se puede evitar el índice en la dimensión de tiempo:
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);
También es posible utilizar una columna de enteros como dimensión de tiempo. Es importante que dicha columna tenga propiedades de dimensión de tiempo:el valor aumenta con el tiempo, lo cual es importante para el rendimiento de la inserción, y las consultas seleccionarán un rango de tiempo, lo cual es fundamental para el rendimiento de las consultas en una base de datos grande. El caso común es para almacenar la época de Unix.
Desde id
en event_hyper
es SERIAL, aumentará con el tiempo. Sin embargo, dudo que las consultas seleccionen el rango en él. Para completar, SQL será:
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);