PostgreSQL 为另一个 Table 的所有行创建外键
PostgreSQL creating foreign key to all rows of another Table
我正在创建 PostgreSQL 数据库。
我有 2 tables - 用户和项目
table Users
包括:Id, Username, Password, and Project_ID (不确定是否需要)
- 主键 - Id
- 外键 - Project_id 作为 Projects 中的 ID Table
table Project
:ID、姓名、状态、截止日期
在这种情况下,我如何(如果可以)实现一对多关系?
因此,如果我进行 JOIN 查询以向我显示具有某些 ID 的 User 和他所有链接的 Projects?
或者在 Project table 中创建一个 User_ID 外键会更容易用户 table ID?
看起来真的是many-to-many关系,每个用户可能参与多个项目,每个项目可能涉及多个用户。如果是这样,那么您的设计中需要第三个 table 来表示该关系 - 这称为桥 table 或连接点 table.
示例 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
中您还可以指定用户在项目中的角色(假设用户在项目中只有一个角色)。
我正在创建 PostgreSQL 数据库。
我有 2 tables - 用户和项目
table
Users
包括:Id, Username, Password, and Project_ID (不确定是否需要)- 主键 - Id
- 外键 - Project_id 作为 Projects 中的 ID Table
table
Project
:ID、姓名、状态、截止日期
在这种情况下,我如何(如果可以)实现一对多关系?
因此,如果我进行 JOIN 查询以向我显示具有某些 ID 的 User 和他所有链接的 Projects?
或者在 Project table 中创建一个 User_ID 外键会更容易用户 table ID?
看起来真的是many-to-many关系,每个用户可能参与多个项目,每个项目可能涉及多个用户。如果是这样,那么您的设计中需要第三个 table 来表示该关系 - 这称为桥 table 或连接点 table.
示例 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
中您还可以指定用户在项目中的角色(假设用户在项目中只有一个角色)。