【问题标题】:add specific constraints to table向表中添加特定约束
【发布时间】: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 的成员

【问题讨论】:

    标签: sql knex.js


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 2017-09-04
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2017-04-26
      相关资源
      最近更新 更多