首页 > 解决方案 > REST API 主键设计 MySQL

问题描述

我们正在构建一个新的 REST API,并且有一些关于主键和幂等键的决定。我们的 API 有很多用户,用户只能查找属于他们的对象。请求经过身份验证,因此我们知道userId与给定请求相关联。

关注的属性:

假设有一个Cars带有端点的假设表GET .../cars/{id},我们将以此为基础进行讨论。

选项

选项 1 - 使用 userId 和 idempotencyKey 的组合作为主键

CREATE TABLE Cars (
 userId VARCHAR(255) NOT NULL,
 idempotencyKey VARCHAR(255) NOT NULL,
 description VARCHAR(255),
 PRIMARY KEY (userId, idempotencyKey),
 INDEX user_index (userId)
);

项目查找: GET .../cars/{idempotencyKey}

想法:


选项 2 - 使用 userId + idempotencyKey 的哈希作为主键

CREATE TABLE Cars (
 id VARCHAR(255) NOT NULL,
 userId VARCHAR(255) NOT NULL,
 idempotencyKey VARCHAR(255) NOT NULL,
 description VARCHAR(255),
 PRIMARY KEY (id),
 INDEX user_index (userId)
);

插入时我们会计算id = hash(userId + idempotencyKey).

项目查找: GET .../cars/{id}

想法:


选项 3 - 生成 uuid 主键

CREATE TABLE Cars (
 id VARCHAR(255) NOT NULL,
 userId VARCHAR(255) NOT NULL,
 idempotencyKey VARCHAR(255) NOT NULL,
 description VARCHAR(255),
 PRIMARY KEY (id),
 INDEX user_index (userId),
 CONSTRAINT unique_by_user UNIQUE (userId, idempotencyKey)
);

插入时我们会设置id = UUID.randomUUID().

项目查找: GET .../cars/{id}

想法:


选项 4 - 从未向用户公开的自动递增主键

CREATE TABLE Cars (
 id INT NOT NULL AUTO_INCREMENT,
 userId VARCHAR(255) NOT NULL,
 idempotencyKey VARCHAR(255) NOT NULL,
 description VARCHAR(255),
 PRIMARY KEY (id),
 INDEX user_index (userId),
 CONSTRAINT unique_by_user UNIQUE (userId, idempotencyKey)
);

有几种方法可以进行查找。查找可以完全基于 idempotencyKey,即: GET .../cars/{idempotencyKey}

或者,我们可以自动生成一个 referenceId uuid,它将被索引并用于查找。

想法:


寻求有关采取何种方法的建议。围绕性能和规模的考虑非常重要。

谢谢!

标签: mysqlrestprimary-keycomposite-primary-keyprimary-key-design

解决方案


推荐阅读