复合主键与多租户数据库系统中的唯一约束



我正在研究一个多租户系统,因此有一个organization表与大多数其他表都有关系。因此,对于我的大多数查询,我都会查询该表的tableId(主键(和已登录的organizationId。或者只是为了organizationId-获取所有客户记录。

为了提高性能,我想我可以对tableId+organizationId组合使用唯一的约束?但是,在这种情况下,将主键设置为tableId+organizationId组合的组合键会是更好的选择吗?

CREATE TABLE PKTABLE (
tid int,
id int,
PRIMARY KEY (tid, id)
);
CREATE TABLE FKTABLE (
tid int,
id int,
fk_id_del_set_null int,
fk_id_del_set_default int DEFAULT 0,
FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES PKTABLE ON DELETE SET NULL (fk_id_del_set_null),
FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default)
);
INSERT INTO PKTABLE
VALUES (1, 0),
(1, 1),
(1, 2);
INSERT INTO FKTABLE
VALUES (1, 1, 1, NULL),
(1, 2, NULL, 2);
DELETE FROM PKTABLE
WHERE id = 1
OR id = 2;
SELECT
*
FROM
FKTABLE
ORDER BY
id;

主键(tid,id(表示两列都不能为NULL
Unique(tid,id(表示接受(tid null,id null(、(tid not null,id null(、(tid null,id not null(。演示

除此之外,一切都一样。主键将创建索引,唯一的contsraint也将创建索引。参见手动

所以总的来说,如果您使用主键,您不需要关心这两列是否为null。在第15页(链接(中,在外键中您可以

FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES PKTABLE ON DELETE SET NULL (fk_id_del_set_null)

这意味着您的tenant_id将始终存在于所有与该tenant _id相关的表中。

最新更新