TimescaleDB中的Segment by需要使用外键id进行切分
Segment by in TimescaleDB requires foreign key id to be used for segmenting
我正在处理以下用例:
大量用户,每个用户都有自己独立的时间序列。时间序列中的每个测量都是使用具有一些伴随元数据的设备进行的。
为了为此创建一个 TimescaleDB 超表,我执行了以下操作:
CREATE TABLE devices (
id VARCHAR NOT NULL,
brand VARCHAR,
model VARCHAR,
serial_number VARCHAR,
mac VARCHAR,
firmware VARCHAR,
UNIQUE (id),
PRIMARY KEY (id)
);
CREATE TABLE measurements (
time TIMESTAMPTZ NOT NULL,
measurement_location VARCHAR,
measurement_value DOUBLE PRECISION NOT NULL,
device_id, VARCHAR NOT NULL,
customer_id VARCHAR NOT NULL,
FOREIGN KEY (device_id) REFERENCES devices (id)
);
SELECT create_hypertable('measurements', 'time');
ALTER TABLE measurements SET (
timescaledb.compress,
timescaledb.compress_segmentby='customer_id'
);
我想按客户 ID 进行细分 - 因为通常会查询用户的所有测量结果。
但是,当我这样做时,出现以下错误:
ERROR: column "device_id" must be used for segmenting
DETAIL: The foreign key constraint "measurements_device_id_fkey" cannot be enforced with the given compression configuration.
为什么我必须使用外键进行分段?还有其他更好的方法来完成我想在这里做的事情吗?
这里是时标工程师。压缩的限制之一是我们不能将外部表的删除级联到压缩的超表,除非它是非压缩列。按列分段以非压缩形式存储。这就是限制外键约束背后的原因。
我正在处理以下用例: 大量用户,每个用户都有自己独立的时间序列。时间序列中的每个测量都是使用具有一些伴随元数据的设备进行的。
为了为此创建一个 TimescaleDB 超表,我执行了以下操作:
CREATE TABLE devices (
id VARCHAR NOT NULL,
brand VARCHAR,
model VARCHAR,
serial_number VARCHAR,
mac VARCHAR,
firmware VARCHAR,
UNIQUE (id),
PRIMARY KEY (id)
);
CREATE TABLE measurements (
time TIMESTAMPTZ NOT NULL,
measurement_location VARCHAR,
measurement_value DOUBLE PRECISION NOT NULL,
device_id, VARCHAR NOT NULL,
customer_id VARCHAR NOT NULL,
FOREIGN KEY (device_id) REFERENCES devices (id)
);
SELECT create_hypertable('measurements', 'time');
ALTER TABLE measurements SET (
timescaledb.compress,
timescaledb.compress_segmentby='customer_id'
);
我想按客户 ID 进行细分 - 因为通常会查询用户的所有测量结果。
但是,当我这样做时,出现以下错误:
ERROR: column "device_id" must be used for segmenting
DETAIL: The foreign key constraint "measurements_device_id_fkey" cannot be enforced with the given compression configuration.
为什么我必须使用外键进行分段?还有其他更好的方法来完成我想在这里做的事情吗?
这里是时标工程师。压缩的限制之一是我们不能将外部表的删除级联到压缩的超表,除非它是非压缩列。按列分段以非压缩形式存储。这就是限制外键约束背后的原因。