向 PostgreSQL 中的表添加外键数组

问题描述 投票:0回答:2

我刚刚开始学习 PostgreSQL,在用户表和项目之间建立关系时遇到困难。

我有两张桌子:

users
projects
。每个项目都有一个创建者(用户),每个用户都有一个数组,其中包含他访问的项目。

建表查询:

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添加到用户的项目数组中。解决这个问题的最佳方法是什么?

感谢您的帮助!

sql postgresql foreign-keys
2个回答
0
投票

这是一种经典的多对多关系,需要第三个表,因为

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
);

0
投票

事实证明,将外键存储在数组中并不是最好的主意;只需将外键留在用户创建的项目中,一切都可以变得更简单。

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),
)

至于表中查找的速度,据我了解,PostgreSQL已经解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.