你如何恢复正常的一对一或这其他关系?
-
21-09-2019 - |
题
我是数据存储在棒球统计数据,并将这样做有三个表格:球员,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关系。
这些但无论哪种可能接近是不是你想要的金属。