向 table 添加特定约束

add specific constraints to table

我想创建一个名为 room_admins 的 table,它将包括聊天室的管理员,为此我在 room_admins 中创建了两个外键table 第一个将用于 room_id,第二个将用于 member_id。

我希望这很清楚,但我真正需要添加的是一个约束,以确保该成员实际上是房间中的成员。例如, 如果我通过了 room_id 1 和 member_id 1,则 SQL 必须确保 id 1 的成员确实是 id 1

房间中的成员

外键约束不能如你所愿,check constraints一般只能引用table中的列。您可以使用触发器强制执行它,但这会变得缓慢和复杂。

如果您想强制要求成员在给定的房间中,请为房间成员添加 table 并引用它。这不是一个简单的加入 table,而是可以包含有关该房间特定成员的其他信息,例如他们的昵称。

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 table 引用 room_memberships。

room_roles:
  room_membership_id not null references room_memberships(id)
  role not null
  unique(role, room_member_id)

我们如何确保角色有效?这可以通过检查约束来完成,但是当您添加角色时必须修改架构。同样,我们可以用一个新的 table 来解决这个问题。添加角色 table 并引用它。

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)