我正在做一个练习来学习数据库设计。这是一支梦幻足球队。我有这个初始表,users
和teams
。一个团队可以有多个用户,一个用户可以加入并属于一个团队。
USERS
PK id
FK team_id -> TEAMS.id
username
TEAMS
PK id
name
但如果用户不想加入另一个团队,我也想允许他们创建自己的团队。如果我在teams
表中添加了owner_id
呢?
TEAMS
PK id
FK owner_id -> USERS.id
name
我觉得这样做不对。最好的方法是什么?
在users
中可以有一个标志,指示用户是否拥有他们所属的团队,并有一个部分唯一索引来限制该标志在一个团队中只设置一次。
CREATE TABLE teams
(id serial,
owner_id integer,
PRIMARY KEY (id));
CREATE TABLE users
(id serial,
team_id integer
NOT NULL,
is_owner boolean
NOT NULL
DEFAULT FALSE,
PRIMARY KEY (id),
FOREIGN KEY (team_id)
REFERENCES teams
(id));
CREATE UNIQUE INDEX users_team_id_is_owner
ON users
(team_id)
WHERE is_owner;
db<gt;fiddle
索引只包括满足WHERE
子句的行,因此所有行都将标志is_owner
设置为true
。在该行的子集内,team_id
必须是唯一的,这意味着不可能有任何两行具有相同的team_id
和is_owner
设置为true
。
要确保用户必须是团队成员,请将team_id
设置为NOT NULL
。
不过,在该模式中可能存在没有所有者的团队。但正如我理解你的问题,那没关系。