当我有来自授权服务器的 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) 
);