多对多关系中的 Junction table 索引
Junction table indexing in many-to-many relationship
假设我们有一个 PRODUCT
table、ORDER
table 和一个交汇点 table PRODUCT_ORDER
.
我使用以下脚本创建了一个连接 table:
CREATE TABLE public."PRODUCT_ORDER" (
product_id bigint NOT NULL,
order_id bigint NOT NULL,
CONSTRAINT "PRODUCT_ORDER_PK" PRIMARY KEY (product_id, order_id),
CONSTRAINT "FK_TO_PRODUCT" FOREIGN KEY (product_id)
REFERENCES public."PRODUCT" (id) ON DELETE CASCADE,
CONSTRAINT "FK_TO_ORDER" FOREIGN KEY (order_id)
REFERENCES public."ORDER" (id) ON DELETE CASCADE
);
还自动创建了 PK 的索引:
CREATE UNIQUE INDEX "PRODUCT_ORDER_PK" ON public."PRODUCT_ORDER" USING btree (product_id, order_id)
预计这些 table 几乎只有读取操作,我想智能地索引结点 table。
通常,我会另外手动为外键创建一个索引,例如对于 one-to-many
关系,像这样:
CREATE INDEX "index_name" ON schema_name."table_name" (fk_column_name);
我的问题是:除了PK-index之外,我还需要为外键创建两个索引吗:
CREATE INDEX "FK_TO_PRODUCT" ON public."PRODUCT_ORDER" (product_id);
CREATE INDEX "FK_TO_ORDER" ON public."PRODUCT_ORDER"(order_id);
还是说没必要,没意义,PK的指标就够了?
一般来说,我感兴趣的是如何intelligently/correctly为多对多关系的联结table建立索引?
如果您需要任何说明,请告诉我并提前致谢!
不,您不需要创建两个额外的密钥。您的主键索引将适用于第一个键 (product_id
) 以及键对。
您需要在 order_id
上增加一个索引。
假设我们有一个 PRODUCT
table、ORDER
table 和一个交汇点 table PRODUCT_ORDER
.
我使用以下脚本创建了一个连接 table:
CREATE TABLE public."PRODUCT_ORDER" (
product_id bigint NOT NULL,
order_id bigint NOT NULL,
CONSTRAINT "PRODUCT_ORDER_PK" PRIMARY KEY (product_id, order_id),
CONSTRAINT "FK_TO_PRODUCT" FOREIGN KEY (product_id)
REFERENCES public."PRODUCT" (id) ON DELETE CASCADE,
CONSTRAINT "FK_TO_ORDER" FOREIGN KEY (order_id)
REFERENCES public."ORDER" (id) ON DELETE CASCADE
);
还自动创建了 PK 的索引:
CREATE UNIQUE INDEX "PRODUCT_ORDER_PK" ON public."PRODUCT_ORDER" USING btree (product_id, order_id)
预计这些 table 几乎只有读取操作,我想智能地索引结点 table。
通常,我会另外手动为外键创建一个索引,例如对于 one-to-many
关系,像这样:
CREATE INDEX "index_name" ON schema_name."table_name" (fk_column_name);
我的问题是:除了PK-index之外,我还需要为外键创建两个索引吗:
CREATE INDEX "FK_TO_PRODUCT" ON public."PRODUCT_ORDER" (product_id);
CREATE INDEX "FK_TO_ORDER" ON public."PRODUCT_ORDER"(order_id);
还是说没必要,没意义,PK的指标就够了?
一般来说,我感兴趣的是如何intelligently/correctly为多对多关系的联结table建立索引?
如果您需要任何说明,请告诉我并提前致谢!
不,您不需要创建两个额外的密钥。您的主键索引将适用于第一个键 (product_id
) 以及键对。
您需要在 order_id
上增加一个索引。