Database design NBA比赛数据库 问题:
我想知道如何为NBA比赛设计一个关系数据库 StackOverflow中有几个类似的问题,但没有人给出令人满意的答案 显然,篮球迷对比赛数据很感兴趣,大量网站提供了这些统计数据。Database design NBA比赛数据库 问题:,database-design,relational-database,data-modeling,Database Design,Relational Database,Data Modeling,我想知道如何为NBA比赛设计一个关系数据库 StackOverflow中有几个类似的问题,但没有人给出令人满意的答案 显然,篮球迷对比赛数据很感兴趣,大量网站提供了这些统计数据。 还有篮球、足球等电子游戏。。。也应该维护类似的数据 是否有设计这些数据库的标准/推荐方法? 例子 我想到的解决方案如下: 团队与游戏 国家(国家代码主键,国家名称) 城市(国家pk fk、城市代码pk、城市名称) 团队(团队代码主键、团队名称、城市fk) 人(姓名主键、生日主键、身高、体重、家乡、城市) 雇佣(员
还有篮球、足球等电子游戏。。。也应该维护类似的数据 是否有设计这些数据库的标准/推荐方法? 例子 我想到的解决方案如下: 团队与游戏 国家(国家代码主键,国家名称) 城市(国家pk fk、城市代码pk、城市名称) 团队(团队代码主键、团队名称、城市fk) 人(姓名主键、生日主键、身高、体重、家乡、城市) 雇佣(员工主键fkPerson、加入日期主键、团队代码fk2、离职日期、工资、球衣编号) 游戏(城市pk fk1,日期pk,主队fk2,访问队fk3) 玩家(游戏pk fk、玩家pk fk、员工、职位) 比赛项目 射击(游戏pk fk1,游戏pk时间,玩家fk2,射击类型,未命中) 反弹(游戏pk fk1,游戏pk时间,玩家fk2,Isofensive) 封杀(游戏pk fk1,游戏时间pk,封杀者fk2,封杀者fk3) 偷盗(游戏pk fk1,游戏时间pk,偷盗者fk2,偷盗者fk3) 其他游戏事件… 另一种方法是只存储每场比赛的统计数据(派生数据) 游戏统计数据(游戏主键fk1,玩家主键fk2,分钟数,外场进球,外场进球失误,三分命中,三分未命中,罚球,罚球失误,防守边界,进攻边界,盖帽,…) 历史数据 我在这个数据模型中遇到的一个困难是球员可以改变球队,改变球衣号码,所以我们需要存储历史数据 比赛中的事件(投篮、篮板、暂停、换人等)也是历史数据 派生数据 我遇到的另一个困难是决定是否存储派生数据 由于派生数据导致更新异常,我们应该避免它们。然而,我发现很难完全避免派生数据 比如说
真正规范化的数据库是否包含派生数据
编辑1-中立体育场 考虑到没有球队是主队的中立体育场,我们可以使用以下设计 体育场(城市主键、名称主键、容量) 比赛(体育场pk fk,日期pk) 团队角色(团队角色主键)[“主场”、“客场”、“中立”]
GameTeam(游戏pk fk、团队pk fk、团队角色pk fk)不知道所有细节就不可能给出完整的答案,但我可以给你一些建议,让你的生活更轻松 在您的描述中,表Country、City和Team看起来不错,但我不明白为什么您需要在Person的表中使用City fk(除非是City of birth,但是列名应该说明这一点) 就业 现在,关于就业表,我的建议有点不同:
首先,您需要决定是否只保留该表中的球员或所有与比赛相关的团队成员(如球队教练)。
我建议使用第二种方法,这意味着您需要为工作类型(即球员、教练、助理教练等)保留另一个表,并在就业表中添加一个fk 历史数据 至于历史数据问题——你需要考虑一些规则:例如,如果你的球员目前受雇于一支球队,他可能不能同时受雇于另一支球队,但是,他可以在受雇于一支常规球队的同时成为他的国家队的一员。为了解决这个问题,您必须以检查约束的形式创建一些业务逻辑规则,或者创建一些触发器来保持数据完整性。
应对球队的变化非常容易,因为你有球员的加入日期和离开日期——你所需要的只是确保在常规球队中任何球员的雇佣之间没有重叠(请记住,国家队是一个例外) 当球员受雇于团队时发生变化 为了应对球衣号码的变化,或者球员受雇于球队时可能发生变化的任何数据,我建议添加一个就业详情表,该表将连接到就业表,有开始日期和结束日期,并保留球员受雇于球队时可能发生变化的所有数据。同样,您需要确保每个就业id的记录不会重叠(日期) 活跃玩家 活动玩家表应按游戏计算,因此其游戏id应为fk。我建议使用一个包含gameId、teamId和playerId的简单表格,而主键是gameId+playerId(我将teamId从主键中删除,因为这是另一层保护,以防就业数据混乱,并且在游戏日期两支球队都雇用了一名球员) 游戏 游戏表的主键应该是游戏日期+主队