跨多个表使用相同的主键

Using the same primary keys across multiple tables

我刚开始使用 postgres 从头开始​​创建数据库。

对于注册网站的用户,这两个实体是 'user'(他们的详细信息)和 'user_pswrd'(用于存储用户密码 - 最终会被加密)。

我的问题是,我是否应该在两个表中创建相同的主键:

CREATE TABLE user (user_name VARCHAR PRIMARY KEY,
                   first_name VARCHAR,
                   surname VARCHAR,
                   email VARCHAR);

CREATE TABLE user_pswrd (user_name VARCHAR PRIMARY KEY,
                         pswrd VARCHAR)

或 'user' 中的主键,仅引用 'user_pswrd' 中的外键:

CREATE TABLE user (user_name VARCHAR PRIMARY KEY,
                   first_name VARCHAR,
                   surname VARCHAR,
                   email VARCHAR);

CREATE TABLE user_pswrd (pswrd VARCHAR,
                         FOREIGN KEY(user_name) REFERENCES user(user_name))  

如果其中 none 个正确,我们将不胜感激。

您有两个独立的 table。您应该有自动主键并使用它来连接它们:

CREATE TABLE users (
    user_id int generated always as identity primary key,  -- in older versions, "serial"
    user_name VARCHAR unique,
    first_name VARCHAR,
    surname VARCHAR,
    email VARCHAR
);

CREATE TABLE user_password (
    user_id int primary key,
    password varchar,
    foreign key (user_id) references users(user_id)
 );

备注:

  • 没有理由将密码存储在单独的 table 中,除非您有这样做的商业原因。这似乎是一对一的关系。
  • 您永远不应该在您的应用程序中存储明文密码。事实上,您的应用程序甚至不应该看到这样的密码。加密应该在客户端。
  • 我不喜欢table 保留 varchar 的长度,但 Postgres 支持。
  • 没有理由破坏 "password" 之类的名称。只需键入整个单词。在现代世界中,使用 "pswrd".
  • 没有任何优势