Mysql 在此上下文中,使用复合主键而不是单个主键的优势是什么?

Mysql 在此上下文中,使用复合主键而不是单个主键的优势是什么?,mysql,cakephp,database-design,primary-key,composite-primary-key,Mysql,Cakephp,Database Design,Primary Key,Composite Primary Key,CakePHPV3现在能够支持复合主键。 《快速入门指南》中给出了一个示例 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 IN

CakePHPV3现在能够支持复合主键。

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

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)
);
《快速入门指南》提到您可能已经注意到bookmarks_tags表使用了复合主键。CakePHP几乎在任何地方都支持复合主键,**使构建多租户应用程序变得更容易**

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

简而言之:

InnoDB将自动将具有相同书签\u id的书签\u标记行以物理方式聚集在一起,使某些查询1非常快,因为DBMS不必跳转到整个表来收集所有相关行

在这种情况下,不需要代理键自动递增int,也不需要为其基础指数支付额外的价格。要更深入地讨论自然键和代理键,请查看

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

1例如:查找给定书签的标记。由于您也有{tag\u id,bookmark\u id}的索引,相反的查询:查找给定标记的书签也会很快。

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

您引用的CakePHP文档中的注释的意义在于,他们希望您通过向每个表的主键添加类似于org_id的内容,将多个组织的租户数据分隔在一组表中


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

如果我们确实从书签标签中选择*,则排序将基于列书签\u idfirst表书签\u标签字段。

最好在某些地方使用复合主键,而不是在任何地方。正如您所看到的,我们不需要任何其他主键,如果组合起来,这两个键本身都可以用作主键,因此最好在这里使用复合主键。几乎在任何地方都支持复合主键,从而更容易构建多租户应用程序。应该阅读使构建关系数据库成为可能。租不租。关系键是复合键,就这么简单。如果没有关系键,就没有关系数据库、关系完整性、能力或速度。。。您有一个记录归档系统。@user768421这通常是一个性能问题,但在某些情况下也可能是正确的必要条件-请参阅第二个链接中的菱形依赖项。即使在这种情况下,您也必须使用复合键,以避免对同一书签多次使用同一标记。唯一的问题是您是否还需要一个代理密钥-在这种情况下,它似乎没有答案。@user768421并且您似乎很幸运地使用了一个不会强迫您使用代理密钥的工具,因此,您可以使用任何更适合于每个特定情况的键设计。代理键标记wiki非常困惑a代理项不是键,它只是一个代理项它不符合*RM中键的定义,并且它没有键的任何属性b您需要它在任何表的层次结构中实现基本的关系完整性,不仅仅是钻石形状的!!!c复合键的主要优点是完整性d在关系范式中没有超级键这种东西,它是诽谤者捏造的。@Branko Dimitrijevic。a所有这些都不能在评论中回答。请提出一个新问题。RM是在线的b我已经写了很多次了,只有谷歌。显然你相信主观的真理。我珍视客观真理。前一场辩论。“对后者来说,没有什么可争论的。”布兰科·迪米特里耶维奇。你正在失去我。你说你同意,但你做的恰恰相反。我重复一遍,我不辩论,我站在证据上。辩论30年前已经结束的问题的人站在否认证据的立场上。我没有私人定义,我对工程定义很满意。RM指的是E F Codd博士的关系模型,而不是其他作者写的垃圾。也许是聊天。