这种规范化是否正确? (由多对一连接的两个多对子)

时间:2014-11-26 05:54:05

标签: sql database database-design sqlalchemy database-normalization

我有一个包含GameTeamPlayer表的记分数据库架构。

一支球队有很多球员,每位球员只有一支球队。每个团队都玩很多游戏,每个游戏都有很多团队。在每个游戏中,玩家单独和作为一个团队获得一定数量的积分 - 这将映射到player_scoreteam_score。一个团队的游戏总分是该游戏的所有玩家player_score和该游戏的团队team_score的总和。

这是我的计划 -

GameTeam表包含该游戏的团队team_score,其外键为Game.idTeam.id。很多人。

GamePlayer表包含该游戏的玩家player_score,并且具有Game.idPlayer.id的外键。很多人。

所以问题是GameTeamGamePlayer没有关联,看起来应该是 - 因为玩家总是属于一个团队。我的解决方案是在GameTeamGamePlayer之间添加一对多关系,如果我有游戏ID和团队ID,我可以搜索那些匹配的GameTeam,迭代添加每个gameTeam.gamePlayers的所有player_score,最后添加team_score,然后计算total_score

这有意义吗?我完全不在了吗?任何帮助表示感谢,谢谢。如果重要,我正在使用SQLAlchemy。

2 个答案:

答案 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你问题或答案中的任何规范化。)