Database design NBA比赛数据库 问题:

Database design NBA比赛数据库 问题:,database-design,relational-database,data-modeling,Database Design,Relational Database,Data Modeling,我想知道如何为NBA比赛设计一个关系数据库 StackOverflow中有几个类似的问题,但没有人给出令人满意的答案 显然,篮球迷对比赛数据很感兴趣,大量网站提供了这些统计数据。 还有篮球、足球等电子游戏。。。也应该维护类似的数据 是否有设计这些数据库的标准/推荐方法? 例子 我想到的解决方案如下: 团队与游戏 国家(国家代码主键,国家名称) 城市(国家pk fk、城市代码pk、城市名称) 团队(团队代码主键、团队名称、城市fk) 人(姓名主键、生日主键、身高、体重、家乡、城市) 雇佣(员

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

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

显然,篮球迷对比赛数据很感兴趣,大量网站提供了这些统计数据。
还有篮球、足球等电子游戏。。。也应该维护类似的数据

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

例子 我想到的解决方案如下:

团队与游戏 国家(国家代码主键,国家名称)

城市(国家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,分钟数,外场进球,外场进球失误,三分命中,三分未命中,罚球,罚球失误,防守边界,进攻边界,盖帽,…)

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

比赛中的事件(投篮、篮板、暂停、换人等)也是历史数据

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

由于派生数据导致更新异常,我们应该避免它们。然而,我发现很难完全避免派生数据

比如说

  • 游戏统计数据是衍生数据。为了避免它们,我们必须存储事件
  • 玩家玩游戏的分钟数是从事件(替换/超时/…)中得出的
  • 一些统计数据是相关的,营业额可以从Steal/Block/中推导出来
  • 对于游戏事件,游戏时间可以从一天中的时间和其他事件(替换/超时/…)中导出
  • 为了简单起见,我们是否应该折衷并存储派生数据?
    真正规范化的数据库是否包含派生数据


    编辑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从主键中删除,因为这是另一层保护,以防就业数据混乱,并且在游戏日期两支球队都雇用了一名球员)

    游戏

    游戏表的主键应该是游戏日期+主队