sql - 具有独特球员组合的团队的 PostgreSQL 表
问题描述
在 PostgreSQL 中,我构建了这些表:
player
每个玩家都有唯一编号的表格p_id
team
用t_id
作主键的表。player_team
记录哪些球员属于哪些球队的表格。
示例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
相同的玩家组合,每次玩时都可以自由选择不同的名称。
我对这种语言比较陌生,所以任何方向都值得赞赏。
解决方案
评论太长了。这里有一些替代方案。
首先,您可以按原样对数据使用触发器。只需检查当新玩家加入团队时,该组合不存在。当然,这可能非常具有挑战性。如果为每个插入的行检查触发器,则单个玩家的团队可能会阻止该玩家成为任何其他团队的第一个玩家。哎哟!
第二种方法是在表中存储每支球队的球员teams
列表。这可以使用触发器更新player_team
。并且该列表可以具有唯一约束。但是,这与第一个解决方案具有相同的“哎哟”。
第三种方法是省去player_team
表格,只将团队成员作为数组存储在teams
. 这种方法的优点是可以一次性添加所有玩家。这样,您无需担心关闭或延迟约束检查。
当然,第三种方法不会给您带来与索引相同的好处。但是,您可以将列表存储为允许索引的 jsonb 列。
推荐阅读
- deployment - 重新启动应用程序时出错:使用 cf 将应用程序部署到 bluemix 时启动失败
- iis - 服务器 2008 中一个文件夹的 IIS 安全登录弹出窗口
- java - java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade 到 javax.servlet.ServletRequest
- azure-devops - VSTS 报告功能
- android - 如何判断路由器是否支持多播?
- listview - 卡内 Flutter ListView
- java - AES CBC 算法如何检查密码转换密钥是否正确?
- node.js - Aerospike - 在嵌套对象中添加新的键/值对
- php - Symfony3.4 - POST_SUBMIT 事件的预填充字段
- php - 试图获取属性'POST /employee HTTP/1.1