在这种情况下使用复合主键而不是单个主键有什么好处?

What is the advantage of using composite primary key instead of single primary key in this context?

Cakephp v3 现在可以支持复合主键。 http://book.cakephp.org/3.0/en/quickstart.html

快速入门指南中给出了一个示例;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE bookmarks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(50),
    description TEXT,
    url TEXT,
    created DATETIME,
    modified DATETIME,
    FOREIGN KEY user_key (user_id) REFERENCES users(id)
);

CREATE TABLE tags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    created DATETIME,
    modified DATETIME,
    UNIQUE KEY (title)
);

CREATE TABLE bookmarks_tags (
    bookmark_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (bookmark_id, tag_id),
    INDEX tag_idx (tag_id, bookmark_id),
    FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
    FOREIGN KEY bookmark_key(bookmark_id) REFERENCES bookmarks(id)
);

快速入门指南提到 "You may have noticed that the bookmarks_tags table used a composite primary key. CakePHP supports composite primary keys almost everywhere, **making it easier to build multi-tenanted applications**."

多租户应用程序是什么意思?在这种情况下,为什么使用复合主键比使用单个主键更好?

简而言之:clustering.

InnoDB 将自动集群(物理组合在一起)bookmarks_tags 具有相同 bookmark_id 的行,使某些查询1 非常快,因为 DBMS 不必须 "jump" 遍历 table 才能收集所有相关行。

在这种情况下不需要代理键(自动递增 int),也不需要您为其基础索引支付的额外价格。有关自然键与代理键的更深入讨论,请查看 here.

虽然我不熟悉 Cakephp v3,但我猜它们只是意味着您可以在所有 table 的键前加上一个租户 ID,并且由于集群而在性能方面付出很少的代价.


1 如:"find tags of given bookmark"。并且由于您在 {tag_id, bookmark_id} 上也有索引,相反的查询:"find bookmarks of given tag" 也会很快。

多租户 将多个不同组织的数据保存在同一个数据库中,但其数据在逻辑上彼此分离。对于有许多客户使用同一个应用程序的系统提供商来说,这是一种常用方法。

您引用的 CakePHP 文档中评论的重要性在于,他们希望您通过添加类似 [=10] 的内容在一组 table 中隔离多个组织(租户)的数据=] 到每个 table 的主键。

当然,在单用户系统的上下文中使用复合主键还有其他原因,但显然 CakePHP 在添加此功能时考虑了多租户支持。

如果我们select * from bookmarks_tags,那么排序 将根据table bookmarks_tags 的第bookmarks_id(first field) 列进行排序。