当我有来自授权服务器的 UUID 时,是否需要使用自动生成的列作为主键?
Do I need to use a auto-generated column as primary key, when I have a UUID from authorization server?
我正在编写一个基于 OAuth2 结构的资源服务器。我有一个 table user
,我会将 JWT 响应的 sub
声明存储到 table 中作为其他 table 引用它的唯一键.我试图这样做是为了避免为每个传入请求检查数据库。
如果该密钥 (sso_id
) 已经是唯一的,我还需要一个自动生成的 id
密钥吗?省略该键是否有任何性能gain/loss?
DROP TABLE IF EXISTS "user";
CREATE TABLE "user" (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
sso_id VARCHAR(100) NOT NULL UNIQUE
);
不,您不需要生成不同的主键。主要必须满足 2 个要求,仅此而已。它不能为 null 或部分为 null,并且在 table 中必须是唯一的。只要满足这些要求,它就是有效的。有些人会争辩说您 应该 生成一个 PK(具有一定的有效性),但这是一个哲学论点,一个特定的要求。您实际上可以使用传递的值作为 PK,甚至可能是 FK。我在假设您的单点登录 (sso_id) 和传递的 jwt_id 是否相同之间左右为难。为什么将其定义为 100 个字符,这比要求的要大得多,但它们似乎也是合乎逻辑的。我会假设他们不是。我还假设可以参考原始 table。那么下面的内容就完全有效了。
create table "user" (
jwt_id uuid
, sso_id varchar(100) not null unique
, constraint user_pk
primary_key(jwt_id)
, constraint user_2_jwt_fk
foreign key (jwt_id)
references jwt(jwt_id)
);
我正在编写一个基于 OAuth2 结构的资源服务器。我有一个 table user
,我会将 JWT 响应的 sub
声明存储到 table 中作为其他 table 引用它的唯一键.我试图这样做是为了避免为每个传入请求检查数据库。
如果该密钥 (sso_id
) 已经是唯一的,我还需要一个自动生成的 id
密钥吗?省略该键是否有任何性能gain/loss?
DROP TABLE IF EXISTS "user";
CREATE TABLE "user" (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
sso_id VARCHAR(100) NOT NULL UNIQUE
);
不,您不需要生成不同的主键。主要必须满足 2 个要求,仅此而已。它不能为 null 或部分为 null,并且在 table 中必须是唯一的。只要满足这些要求,它就是有效的。有些人会争辩说您 应该 生成一个 PK(具有一定的有效性),但这是一个哲学论点,一个特定的要求。您实际上可以使用传递的值作为 PK,甚至可能是 FK。我在假设您的单点登录 (sso_id) 和传递的 jwt_id 是否相同之间左右为难。为什么将其定义为 100 个字符,这比要求的要大得多,但它们似乎也是合乎逻辑的。我会假设他们不是。我还假设可以参考原始 table。那么下面的内容就完全有效了。
create table "user" (
jwt_id uuid
, sso_id varchar(100) not null unique
, constraint user_pk
primary_key(jwt_id)
, constraint user_2_jwt_fk
foreign key (jwt_id)
references jwt(jwt_id)
);