PostgreSQL为另一个表的所有行创建外键

问题描述

我正在创建PostgreSQL数据库。
我有2个表格-用户和项目

  • Users包括:ID,用户名,密码和Project_ID(不确定是否需要)

    • 主键-ID
    • 外键-在项目
    • 中作为ID的Project_id
  • Project:ID,名称,状态,最后期限

在这种情况下,我(如果可以)如何实现一对多关系?

因此,如果我进行联接查询以向我显示具有特定 ID 用户及其所有链接的项目

还是在 Project 表中创建与 Users 表ID相关的 User_ID 外键会更容易?

解决方法

看起来您之间确实存在多对多关系,每个用户可能参与多个项目,而每个项目可能涉及多个用户。如果是这样,则您需要在设计中使用第三个表来表示这种关系-这称为桥表或联结表。

样本DDL:

create table users (
    id int primary key,username text
);

create table projects (
    id int primary key,name text,status text,deadline date
);

create table user_projects (
    id int primary key,user_id int references users(id),project_id int references projects(id),unique (user_id,project_id)
);

现在说您想列出所有用户用户以及他们参与的所有项目:

select u.*,p.*
from users u
inner join user_projects up on up.user_id = u.id
inner join projects p on p.id = up.project_id
order by u.id,p.id
,

如果您的用户只是项目成员,则单个项目可能包含多个用户,并且一个用户可能是多个项目的成员。在这种情况下,@ GMB提供了正确的答案。

但是正确的答案也取决于您的业务:如果每个项目都只有一个经理,则可以在项目中定义一个manager_id,这样每个项目都链接到1个经理,而一个经理(=用户)可以是多个项目的经理

user_project中,您还可以指定用户在项目中的角色(假设用户在项目中只有一个角色)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...