Nba录像cc:NBA游戏数据库(nba database)

关于Nba录像cc的问题,在nba database中经常遇到, 问题

问题

我想知道如何为 NBA 游戏设计一个关系数据库

StackOverflow 中有几个类似的问题,但没有人给出令人满意的答案。

Star Schema database for NBA/Basketball statistics Database for Basketball teams/games/scores per season Database Design NBA

显然,游戏数据对篮球迷来说很有趣,大量网站提供了这些统计数据。
此外,篮球,足球等视频游戏也应保持类似的数据。

是否有标准 / 推荐的方法来设计这些数据库?

实例

进入我的脑海的解决方案看起来像:

团队和游戏

国家 / 地区(CountryCodepk,CountryName)

城市(Countrypk fk,CityCodepk,CityName)

团队TeamCodepk 、 TeamName 、 City fk)

(姓名pk,生日pk,身高,体重,HomeTown fkCity)

就业员工pk fkPerson,加入日期pk,团队代码 fk2,出发日期,薪水,球衣号码)

游戏(Citypk fk1,Datepk,HostTeam fk2,VisitingTeam fk3)

游戏玩家游戏pk fk,玩家pk fkEmployee,位置)

游戏事件

射击游戏pk fk1,TimeOfGamepk,玩家 fk2,射击类型,未命中)

反弹(Gamepk fk1,TimeOfGamepk,Player fk2,IsOffensive)

阻止游戏pk fk1,TimeOfGamepk,阻止 fk2,阻止 fk3)

游戏pk fk1,TimeOfGamepk,者 fk2, fk3)

其他游戏事件...

另一种方法是仅存储每个游戏的统计信息(派生数据)。

GameStats(Gamepk fk1,Playerpk fk2,Minutes,FieldGoal Missed,ThreePointMade,ThreePointMissed,FreeThrow,FreeThrowMissed,DefensiveRebounds,OffensiveRe

历史数据

我在这个数据模型中遇到的一个困难是,球员可以改变球队,改变球衣号码,所以我们需要存储历史数据。

游戏中的事件(射击,反弹,超时,替代...)也是历史数据。

派生数据

我遇到的另一个困难是决定是否存储派生数据。

由于派生数据会导致更新异常,因此我们应该避免它们。但是,我发现很难完全避免派生数据。

例如

游戏统计数据是派生的数据。为了避免它们,我们必须存储事件。

玩家玩游戏的分钟数来自事件(替代 / 超时 /...)。

一些统计数据是相关的,营业额可从窃取 / 阻止 /...

对于游戏事件,游戏时间可以从一天中的时间和其他事件(替换 / 超时 /...)得出。

为了简单起见,我们应该做出妥协并存储派生数据吗?
真正规范化的数据库是否包含派生数据?

编辑 1-中立体育场

为了说明没有团队是主队的中立体育场,我们可以使用以下设计。

体育场城市pk,名称pk,容量)

Game(Stadiumpk fk,Datepk)

团队角色(团队角色pk) ['Home','Away','Neutral']

游戏团队(游戏pk fk,团队pk fk,团队角色pk fk)

3

不可能在不知道所有细节的情况下给出完整的答案,但是我可以给你一些指点,让你的生活变得更轻松。

在你的描述中,表国家,城市和团队似乎很好,但我不明白为什么你需要在人的表中的城市 fk(除非它是出生的城市,但列名应该清楚)。

Employment

现在,关于就业表-我的建议有点不同:
首先,您需要决定是否只保留球员或团队中所有与游戏相关的成员(例如团队教练)。
我建议使用第二个选项,这意味着您需要为工作类型(即球员,教练,辅助教练等)保留另一个表,并在就业表中对其进行 fk。

历史数据

至于历史数据问题-您需要考虑一些规则:例如,如果您的球员当前受雇于一个团队,则他可能无法同时受雇于另一个团队,但是,他可以在受雇于常规团队时成为其国家 / 地区国家队的一员。为了解决这个问题,您必须以检查约束的形式创建一些业务逻辑规则,并且可能需要一些触发器来确保所有球员的离职日期都很容易更改。

球员受雇于团队时的变化

为了应对球衣号码的变化,或者在球员受雇于球队时可能会更改的任何数据,我建议添加一个就业详细信息表,该表将连接到就业表,有一个开始日期和结束日期,并保留在球员受雇于球队时可能会更改的所有数据。

活跃玩家

活跃玩家表应按游戏计算,因此它应该将游戏 ID 作为 fk。我建议使用 gameId,teamId 和 playerId 的简单表,而主键是 gameId + PlayerId(我已经将 teamId 排除在主键之外,因为它是另一层保护,以防就业数据混乱,并且在游戏日期,两个团队中都考虑雇用一名球员)

Games

游戏表应具有游戏日期 + 主队 + 客队的主键。请注意,游戏可能会在中立的体育场举行,因此您需要测试主队和客队翻转的游戏,然后再在表中插入新的游戏数据。此外,您可能希望保留一个体育场表,该表将有一个 fk 到城市,并将体育场 ID 保留在游戏表中,而不是城市 ID。

游戏统计

你应该努力保留一个表来描述游戏中的所有事件。这个表当然应该有一个 fk 到游戏表和一个 fk 到团队表。从你的问题我理解统计是在玩家级别上完成的,所以你也想在玩家表中保留一个 fk。
在游戏统计表中添加一个用于统计详细信息描述的表和一个 fk 到该表。基本上,它应该是这样的:

StatisticsDetails(Detail_Id,Detail_Name)
,并应保存shootpassrebound等数据。

在您的游戏统计表中,您可能需要记录涉及多个玩家的事件。有几种方法可以做到这一点,我建议保持尽可能简单:将 PlayerID1,PlayerId2,PlayerId3 保留在表中,并且除了第一个之外,所有这些都可以为空。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(303)
创建和管理数据库:使用SQL从BigQuery数据库创建和存储数据集
上一篇
数据结构试题:索引数据结构和顺序数据结构之间的区别
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(18条)