我最近开始学习postgresql,在设置表之间的关系时遇到了一些问题。
我有 2 个表 - 用户和项目。每个项目都有它的创建者(用户),每个用户都有一个包含他的项目的数组。
create TABLE users(
id SERIAL PRIMARY KEY,
name VARCHAR(200) UNIQUE,
email VARCHAR(1000) UNIQUE,
password VARCHAR,
tags VARCHAR[],
about VARCHAR(2000),
socials VARCHAR[],
projects VARCHAR[], //array of projects
avatarurl VARCHAR,
)
create TABLE projects(
id SERIAL PRIMARY KEY,
title VARCHAR(200),
text VARCHAR(3000),
needs VARCHAR[],
socials VARCHAR[],
creator_id INTEGER FOREIGN KEY (creator_id) REFERENCES users(id),
)
我需要在创建新项目时,将其ID自动添加到用户项目数组中。如何才能最好地实现这一目标?
这是一种经典的多对多关系,需要第三个表,因为
user
可能有 0 个或多个 projects
,而 project
可能有 0 个或多个 users
CREATE TABLE user (
id SERIAL PRIMARY KEY
,name VARCHAR(255) NOT NULL
,...
);
CREATE TABLE project (
id SERIAL PRIMARY KEY
,name VARCHAR(255) NOT NULL
,...
,creator INT
,FOREIGN KEY (creator)
REFERENCES user (id)
ON DELETE SET NULL
ON UPDATE CASCADE
);
CREATE TABLE user_and_project (
user INT
,project INT
,PRIMARY KEY (user,project)
,FOREIGN KEY (user)
REFERENCES user (id)
ON DELETE CASCADE
ON UPDATE CASCADE
,FOREIGN KEY (project)
REFERENCES project (id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
事实证明,将外键存储在数组中并不是最好的主意;只需将外键留在用户创建的项目中,一切都可以变得更简单。
create TABLE users(
id SERIAL PRIMARY KEY,
name VARCHAR(200) UNIQUE,
email VARCHAR(1000) UNIQUE,
password VARCHAR,
tags VARCHAR[],
about VARCHAR(2000),
socials VARCHAR[],
avatarurl VARCHAR,
)
create TABLE projects(
id SERIAL PRIMARY KEY,
title VARCHAR(200),
text VARCHAR(3000),
needs VARCHAR[],
socials VARCHAR[],
creator_id INTEGER FOREIGN KEY (creator_id) REFERENCES users(id),
)
至于在表中查找的速度,据我了解,PostgresSCL已经解决了这个问题。