我正在 Postgres 中构建一个表,如下所示
CREATE TABLE table (
"id" BIGSERIAL PRIMARY KEY,
"ext_id" INTEGER REFERENCES ext_table (ext_id),
"user_id" VARCHAR(100) NOT NULL,
"user_type" VARCHAR(100) NOT NULL,
"event_type" VARCHAR(100) NOT NULL,
"status" VARCHAR(100) NOT NULL,
"created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
"updated_at" TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
CONSTRAINT "check_valid_user_type" CHECK ("user_type" IN ('TYPE_A', 'TYPE_B')),
CONSTRAINT "check_valid_event_type" CHECK ("event_type" IN ('EVENT_A', 'EVENT_B', 'EVENT_C')),
CONSTRAINT "check_valid_notification_status" CHECK ("status" IN ('STATUS_A', 'STATUS_B', 'STATUS_C')),
CONSTRAINT "no_duplicates" UNIQUE (ext_id, user_id, user_type, event_type)
);
特别是,我主要关心的是与约束有关no_duplicates
,据我所知,该约束在幕后构建了一个 UNIQUE 索引。(如果我理解错误,请纠正我)。我想知道的是,在构建具有如此多列的此类索引时,我不知道最终的性能开销或缺点。
与任何其他索引一样,它会使数据修改速度变慢。但如果你需要维持这种约束,你就必须为此付出代价。在某种程度上,它就像主键。这也会减慢数据修改速度,但您仍然不会质疑它,因为每个表都需要一个主键。