首页 > 解决方案 > 具有独特球员组合的团队的 PostgreSQL 表

问题描述

在 PostgreSQL 中,我构建了这些表:

示例player_team如下所示。001 队有 3 名成员(200,300,400),002 队有 2 名成员(200,888),003 队有 3 名成员(999、666、333)。

  player_team
  t_id | p_id | 
 ------+------+    
   001 | 200  | 
   001 | 300  | 
   001 | 400  | 
   002 | 200  | 
   002 | 888  | 
   003 | 999  | 
   003 | 666  | 
   003 | 333  | 

在我的场景中,会有大量的球员,他们可以组建任意多的球队。唯一的限制是每个成员组合只能出现一次。因此,由 组成的团队(200, 300, 400)将始终具有 t_id 001。这是必需的,因此我可以跟踪同一组成员在一段时间内的表现,以及某些成员相互交互的频率。

这个约束如何在 SQL 中实现?我的传入数据将是表格,其中每一行是一个球员,一列team name表示他们一起比赛时属于哪个球队。我不能简单地使用team name相同的玩家组合,每次玩时都可以自由选择不同的名称。

我对这种语言比较陌生,所以任何方向都值得赞赏。

标签: sqlpostgresql

解决方案


评论太长了。这里有一些替代方案。

首先,您可以按原样对数据使用触发器。只需检查当新玩家加入团队时,该组合不存在。当然,这可能非常具有挑战性。如果为每个插入的行检查触发器,则单个玩家的团队可能会阻止该玩家成为任何其他团队的第一个玩家。哎哟!

第二种方法是在表中存储每支球队的球员teams列表。这可以使用触发器更新player_team。并且该列表可以具有唯一约束。但是,这与第一个解决方案具有相同的“哎哟”。

第三种方法是省去player_team表格,只将团队成员作为数组存储在teams. 这种方法的优点是可以一次性添加所有玩家。这样,您无需担心关闭或延迟约束检查。

当然,第三种方法不会给您带来与索引相同的好处。但是,您可以将列表存储为允许索引的 jsonb 列。


推荐阅读