我有一个包含Game
,Team
,Player
表的记分数据库架构。
一支球队有很多球员,每位球员只有一支球队。每个团队都玩很多游戏,每个游戏都有很多团队。在每个游戏中,玩家单独和作为一个团队获得一定数量的积分 - 这将映射到player_score
和team_score
。一个团队的游戏总分是该游戏的所有玩家player_score
和该游戏的团队team_score
的总和。
这是我的计划 -
GameTeam
表包含该游戏的团队team_score
,其外键为Game.id
和Team.id
。很多人。
GamePlayer
表包含该游戏的玩家player_score
,并且具有Game.id
和Player.id
的外键。很多人。
所以问题是GameTeam
和GamePlayer
没有关联,看起来应该是 - 因为玩家总是属于一个团队。我的解决方案是在GameTeam
和GamePlayer
之间添加一对多关系,如果我有游戏ID和团队ID,我可以搜索那些匹配的GameTeam
,迭代添加每个gameTeam.gamePlayers
的所有player_score
,最后添加team_score
,然后计算total_score
。
这有意义吗?我完全不在了吗?任何帮助表示感谢,谢谢。如果重要,我正在使用SQLAlchemy。
答案 0 :(得分:1)
您的设计存在的问题是您使用surrogate identifier作为表的主键,定义良好的主键将解决问题:
Team -> pk:team_id
Player -> pk:player_id
TeamPlayer -> pk:{team_id + player_id}
Game -> pk:game_id
GameTeam -> pk:{game_id + team_id}
GamePlayer -> pk:{game_id + GameTeam_pk + TeamPlayer_pk}
= {game_id + {game_id + team_id} + {team_id + player_id} }
对GamePlayer
进行检查约束有助于解决问题:
GamePlayer
{
Check game_id (FK of Game) = game_id (FK of GameTeam );
Check team_id (FK of GameTeam) = team_id (FK of TeamPlayer);
}
所以
player_score将是GamePlayer
的属性
team_score(可能)是具有特定team_id的GamePlayer.player_score
的和。
答案 1 :(得分:0)
确定您感兴趣的显然基本的应用程序关系。例如:
Team "[team_id] identifies a team"
Player "[player_id] identifies a player"
GameTeam "[game_id] identifies a game involving team [team_id]"
TeamPlayer "player [player_id] plays for team [team_id]"
GamePlayer "in game [game_id] player [player_id] scored [player_score]"
然后为每个这样的关系制作一张桌子。表保存其值参与其关系的行,即它们是如此相关。即它保存了满足关系的参数化语句(谓词)的行,即使其参数化语句成为真实语句(命题)。
现在由表运算符计算的表满足由相应逻辑运算符构建的关系。 INNER JOIN保存满足其操作数AND的AND的行。关系。对于UNION,OR。在哪里和在两个条件下。从具有谓词" ... [C] ..."的表中选择列C给出了关系"那里有一个C值,这样...... [C] ..."。
"链接"是无关紧要的。 A"链接"是一把外键。 FK与查询无关,除了告诉您如果INNER JOIN然后您只从源表的每一行获得目标表中的一行。如果没有"链接"你仍然可以INNER JOIN作为操作数的AND的关系'在关系中,您可能会从目标表中获取多行,与源表的每一行匹配。 (FK告诉您,如果源列有EXIST值,那么源关系那么目标列的EXIST值就是目标关系。)(这不是"关系"而是一个事实。)类似的,关于共享列和INNER JOIN,SQL总是在概念上最初生成INNER JOIN的交叉产品,其中有些行符合给定的条件。列和公共列之间的链接无关紧要。只需确定基表或查询表所代表的关系。
(" A p : q 关系"是发生的特定关系要 p : q 。在找出" it"之前,你不能谈论它的基数。)
然后,您必须确定足以表达与应用程序相关的所有内容的基本关系/表,即足以表达每个相关的查询关系/表。特别的选择是设计的全部意义。 (这将涉及规范化,其中包括用两个或更多个ANDed关系/表替换表格的关系/表格和......以及..."虽然没有&#39 ; t你问题或答案中的任何规范化。)