我想知道如何设计NBA比赛的关系数据库。
有在StackOverflow上几个类似的问题,但没有人给出一个令人满意的答案。
Star Schema database for NBA/Basketball statistics
Database for Basketball teams/games/scores per season
显然,游戏数据是篮球迷有趣和吨的网站提供了这些统计信息。 此外,对于篮球,足球视频游戏,...应该也保持类似的数据。
是否有设计这些数据库的标准/推荐的方式?
即进入我脑海中的解决方案是这样的:
国家(国家代码PK,国家名称)
市(地PK FK,CityCode PK,CITYNAME)
小组(TeamCode PK,TeamName,市FK)
人(姓名PK,PK的生日,身高,体重,籍贯fkCity)
就业(员工PK fkPerson,JoiningDate PK,TeamCode FK2,DepartureDate,工资,JerseyNumber)
游戏(市PK FK-1,日期PK,HostTeam FK2,FK3 VisitingTeam)
的游戏玩家(游戏PK FK,玩家PK fkEmployee,位置)
射击(游戏PK FK-,TimeOfGame PK,玩家FK2,ShootingType,未接)
反弹(游戏PK FK-,TimeOfGame PK,玩家FK2,IsOffensive)
块(游戏PK FK-,TimeOfGame PK,拦截FK2,FK3阻止)
偷(游戏PK FK-,TimeOfGame PK,偷窃者FK2,FK3抄截)
其他游戏活动...
另一种方法是仅存储每个游戏的统计数据(派生数据)。
GameStats(游戏PK FK-1,玩家PK FK2,分,投篮命中,FieldGoalMissed,ThreePointMade,ThreePointMissed,FreeThrow,FreeThrowMissed,防守篮板,进攻篮板,盖帽,...)
我遇到了这个数据模型的一个困难是,玩家可以改变球队,改变球衣号码,所以我们需要存储的历史数据。
在一场比赛(拍摄,反弹,超时,换人,...)的事件是历史数据了。
我遇到的另一个困难是决定是否存储派生数据。
由于得到的数据会导致更新异常,我们应该避免。然而,我发现很难完全避免得出的数据。
例如
我们应当对简单的妥协和存储导出的数据? 是否真正规范化的数据库包含导出的数据?
为了说明中性场馆在没有队是主队,我们可以使用下面的设计。
体育场(市PK,PK名称,容量)
游戏(球场PK FK,日峰)
团队角色(团队角色PK)“主页”,“离开”,“中性”]
GameTeam(游戏PK FK,团队PK FK,TeamRole PK FK)
这是不可能给一个完整的答案不知道所有的细节,但我可以给你一些三分球,将让您的生活更轻松。
在你的描述,桌子国家,城市和球队似乎很好,但我不明白为什么你需要在人的表中的城市FK(除非它是出生在哪个城市,但随后的列名应该予以澄清)。
雇用
现在,关于就业表 - 我的建议是有一点不同: 首先,你需要决定是否要只保留在该表中的球员或球队的所有比赛相关的东西成员(如队教练)。 我会建议第二个选项,这意味着你需要不断的另一个表作业类型(即球员,教练,协助主教练等),并在就业表的FK它。
历史数据
而对于历史数据的问题 - 还有你要考虑的一些规则:例如,如果您的播放器是在球队目前所采用,他可能无法在其他球队在同一时间使用,但是,他可以是他的国家的国家队,而在常规的团队所采用的一部分。为了应对这一点,你必须创建的检查约束也许有些触发器形式的一些业务逻辑规则,以保持数据的完整性。 与强队应对变化是很容易的,因为你有球员对球队加入日期和离任日期 - 所有你需要的是确保有在常规的团队的任何球员就业之间没有重叠(记得国家队是例外)。
而玩家被用在团队的变化
为了应对这些变化的球衣号码,或任何数据,而玩家通过团队,我建议增加一个表,就业信息使用可能被改变,将被连接到工作表中,有一个开始日期和结束日期并保留所有,而玩家在一个团队使用可能改变的数据。同样,你将需要确保记录不重叠(日期明智的)每个就业ID。
现役球员
现役球员表应该每场比赛来计算的,所以它应该有游戏ID为FK。我建议简单地用游戏ID,teamId和playerId表,而主键是游戏ID + PlayerId(我已经离开了teamId出的主键,因为它的就业数据被弄乱了的情况下,另一个保护层和球员在两队都认为是就业的比赛日期)
游戏
游戏桌应该有比赛日期+主队+客队的主键。需要注意的是游戏可能举行中性场馆,所以你要测试游戏中的主队和客队在你的表中插入新的游戏数据前翻转。此外,您可能希望保留,将有一个FK城市和保持球场ID在游戏表,而不是城市ID体育场表。
比赛统计
你应该努力保持一个表来描述游戏中的所有事件。当然这个表应该有一个FK的游戏桌和FK的球队表。从你的问题我的理解是统计上的玩家等级进行的,因此你也想的FK保持到了球员表。 统计信息说明表和FK添加到该表在游戏的统计数据表。基本上,它应该是这样的:
StatisticsDetails(Detail_Id,DETAIL_NAME)
并应持有如shoot
,pass
,rebound
等数据
在您游戏的统计数据表中,您可能需要先登录,涉及多名球员的事件。有几个方法可以做到这一点,我建议保持尽可能简单:保持PlayerID1,PlayerId2,PlayerId3在表中,并有所有的人除了第一个空。