跨多个表使用相同的主键
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".
没有任何优势
我刚开始使用 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". 没有任何优势