我是数据存储在棒球统计数据,并将这样做有三个表格:球员,battingStats,并pitchingStats.用于该目的的问题,每个玩家将击球的统计数据或投球的统计数据,但不是两个。

我将如何规范这种关系在3NF?

有帮助吗?

解决方案

PlayerId将是在两个BattingStats和PitchingStats表的外键

[并记得把一些时间维度(季节,年,等)中的统计信息表]

和顺便说一下,这是一个坏的假设:据我所知,投手允许蝙蝠,太

其他提示

你真的是所需要的不使用超过3个表。 规范化 通常意味着打破一个非归一化模式进入许多规范化的关系。

如果你可以拥有超过3个表格,您可能想要考虑以下(在 3NF):

Players:        ([player_id], name, date_of_birth, ...)
Batters:        ([batter_id], player_id)
Pitchers:       ([pitcher_id], player_id)
Batting_Stats:  ([batter_id, time_dimension], stat_1, stat_2, ...)
Pitching_Stats: ([pitcher_id, time_dimension], stat_1, stat_2, ...)

属性 [] 定义的主要关键,但是 代理键 可以使用,如果优先。的 player_id 属性在击球员和球场应该有一个 独特的约束, 和它也应该是一个 外键 玩家的关系。Batting_Stats和Pitching_Stats也应该有一个外国的关键打者和投分别。

但请注意,上述不实施这一可能只有一个糊或仅有一个投手。


更新:

一个方法我知道执行一个玩家只是一个糊或仅有一个投手,是通过这种模型:

Players:        ([player_id], name, date_of_birth, ...)
Roles:          ([role_id, role_type], player_id)
Batting_Stats:  ([role_id, role_type, time_dimension], stat_1, stat_2, ...)
Pitching_Stats: ([role_id, role_type, time_dimension], stat_1, stat_2, ...)

role_type 应该确定一个投手或糊。Batting_Stats和Pitching_Stats应具有复合外国的关键角色,使用 (role_id, role_type).独特的约束 player_id 在角色将确保一个玩家只能有一个和唯一的作用。最后添加 检查的制约 这样, Batting_Stats.role_type = 'Batter'Pitching_Stats.role_type = 'Pitcher'.这些检查约束,保证Batting_Stats总是描述一个糊,并注意一个投手。这同样适用于Pitching_Stats.

我知道我会从实践的角度实现这个(我创建了不相交表一个被联合视图,并把唯一索引上的玩家ID - 因此,他们只能出现在一个表)。

或者在球员表,记录什么类型的统计他们,然后包括在从统计表格的FK关系。

这些但无论哪种可能接近是不是你想要的金属。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top