问题描述
我正在创建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
中,您还可以指定用户在项目中的角色(假设用户在项目中只有一个角色)。