【发布时间】:2021-01-15 22:28:53
【问题描述】:
我想创建一个名为 room_admins 的表,其中将包含聊天室的管理员,为此我在 room_admins 表中创建了两个外键,第一个用于 room_id,第二个用于为member_id。
我希望这很清楚,但我真正需要添加的是一个约束,以确保该成员实际上是房间中的成员。例如, 如果我通过了 room_id 1 和 member_id 1,SQL 必须确保 id 1 的成员确实是房间中 id 为 1 的成员
【问题讨论】:
我想创建一个名为 room_admins 的表,其中将包含聊天室的管理员,为此我在 room_admins 表中创建了两个外键,第一个用于 room_id,第二个用于为member_id。
我希望这很清楚,但我真正需要添加的是一个约束,以确保该成员实际上是房间中的成员。例如, 如果我通过了 room_id 1 和 member_id 1,SQL 必须确保 id 1 的成员确实是房间中 id 为 1 的成员
【问题讨论】:
外键约束不能如你所愿,check constraints一般只能引用表中的列。您可以使用触发器强制执行它,但这会变得缓慢且复杂。
如果您想强制成员在给定的房间中,请添加一个房间成员表并引用它。这不是一个简单的连接表,它可以包含有关该成员特定于该房间的其他信息,例如他们的昵称。
room_memberships:
id primary key
nickname
room_id not null references rooms(id)
member_id not null references members(id)
-- one membership per member and room
unique(room_id, member_id)
此时您可以简单地向 room_memberships 添加一个管理员标志。
如果一个成员可以在一个房间中担任多个角色,请使用一个 room_roles 表来引用 room_memberships。
room_roles:
room_membership_id not null references room_memberships(id)
role not null
unique(role, room_member_id)
我们如何确保角色有效?这可以通过检查约束来完成,但是在添加角色时必须修改架构。同样,我们可以用一个新表来解决这个问题。添加角色表并引用它。
room_roles:
room_membership_id not null references room_memberships(id)
role_id not null references roles(id)
unique(role_id, room_member_id)
roles:
id primary key
name not null
unique(name)
【讨论】: