在这种情况下使用复合主键而不是单个主键有什么好处?
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)
列进行排序。
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)
列进行排序。