Không cần tạo ràng buộc duy nhất về thứ nguyên thời gian. Điều này hoạt động:
CREATE TABLE event (
id serial,
ts timestamp with time zone NOT NULL,
details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');
Lưu ý rằng khóa chính trên id
bị xóa.
TimescaleDB yêu cầu rằng bất kỳ ràng buộc duy nhất hoặc khóa chính nào đều bao gồm thứ nguyên thời gian. Điều này tương tự như giới hạn của PostgreSQL trong phân vùng khai báo để đưa khóa phân vùng vào ràng buộc duy nhất:
TimescaleDB cũng thực thi tính duy nhất trong từng đoạn riêng lẻ. Việc duy trì tính duy nhất trên các phần có thể ảnh hưởng đáng kể đến hiệu suất nhập.
Cách tiếp cận phổ biến nhất để khắc phục sự cố với khóa chính là tạo một khóa tổng hợp và bao gồm thứ nguyên thời gian như được đề xuất trong câu hỏi. Nếu chỉ mục trên thứ nguyên thời gian là không cần thiết (không có truy vấn chỉ về thời gian được mong đợi), thì có thể tránh chỉ mục trên thứ nguyên thời gian:
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);
Cũng có thể sử dụng cột số nguyên làm thứ nguyên thời gian. Điều quan trọng là cột đó phải có thuộc tính thứ nguyên thời gian:giá trị tăng dần theo thời gian, điều này quan trọng đối với hiệu suất chèn và các truy vấn sẽ chọn một phạm vi thời gian, điều này rất quan trọng đối với hiệu suất truy vấn trên cơ sở dữ liệu lớn. Trường hợp phổ biến là lưu trữ kỷ nguyên unix.
Kể từ id
trong event_hyper
là SERIAL, nó sẽ tăng dần theo thời gian. Tuy nhiên, tôi nghi ngờ các truy vấn sẽ chọn phạm vi trên đó. Để hoàn chỉnh, SQL sẽ là:
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);