Il n'est pas nécessaire de créer une contrainte unique sur la dimension temporelle. Cela fonctionne :
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
Notez que la clé primaire sur id
est supprimé.
TimescaleDB exige que toute contrainte unique ou clé primaire inclue la dimension temporelle. Ceci est similaire à la limitation de PostgreSQL dans le partitionnement déclaratif pour inclure la clé de partition dans la contrainte unique :
TimescaleDB applique également l'unicité de chaque bloc individuellement. Le maintien de l'unicité entre les blocs peut affecter considérablement les performances d'ingestion.
L'approche la plus courante pour résoudre le problème avec la clé primaire, il faut créer une clé composite et inclure la dimension temporelle comme proposé dans la question. Si l'index sur la dimension temporelle n'est pas nécessaire (aucune requête uniquement sur le temps n'est attendue), alors l'index sur la dimension temporelle peut être évité :
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);
Il est également possible d'utiliser une colonne d'entiers comme dimension temporelle. Il est important qu'une telle colonne ait des propriétés de dimension temporelle :la valeur augmente avec le temps, ce qui est important pour les performances d'insertion, et les requêtes sélectionneront une plage de temps, ce qui est essentiel pour les performances des requêtes sur une grande base de données. Le cas courant est le stockage de l'époque unix.
Depuis id
dans event_hyper
est SERIAL, il augmentera avec le temps. Cependant, je doute que les requêtes sélectionnent la plage dessus. Pour être complet, SQL sera :
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);