Tidak perlu membuat batasan unik pada dimensi waktu. Ini berfungsi:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
Perhatikan bahwa kunci utama pada id
dihapus.
TimescaleDB mengharuskan setiap batasan unik atau kunci utama menyertakan dimensi waktu. Ini mirip dengan pembatasan PostgreSQL di partisi deklaratif untuk memasukkan kunci partisi ke dalam batasan unik:
TimescaleDB juga memberlakukan keunikan di setiap potongan secara individual. Mempertahankan keunikan di seluruh potongan dapat memengaruhi kinerja penyerapan secara dramatis.
Pendekatan paling umum untuk memperbaiki masalah dengan kunci utama adalah membuat kunci komposit dan memasukkan dimensi waktu seperti yang diusulkan dalam pertanyaan. Jika indeks pada dimensi waktu tidak diperlukan (tidak ada kueri yang diharapkan hanya pada waktu), maka indeks pada dimensi waktu dapat dihindari:
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);
Dimungkinkan juga untuk menggunakan kolom bilangan bulat sebagai dimensi waktu. Penting bahwa kolom tersebut memiliki properti dimensi waktu:nilainya meningkat dari waktu ke waktu, yang penting untuk kinerja penyisipan, dan kueri akan memilih rentang waktu, yang sangat penting untuk kinerja kueri pada database besar. Kasus umum adalah untuk menyimpan zaman unix.
Sejak id
di event_hyper
adalah SERIAL, itu akan meningkat seiring waktu. Namun, saya ragu kueri akan memilih rentang di atasnya. Untuk kelengkapan SQL akan menjadi:
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);