Database design 如何为多种体育项目设计一个体育统计数据库?

Database design 如何为多种体育项目设计一个体育统计数据库?,database-design,Database Design,我正试图设计一个数据库来存储多种运动类型的运动员统计数据 在数据库中,你会有一堆玩家。每个球员都属于一个队,每个队都从事一项运动。以下是迄今为止我仅针对该部分的表格: 球员(球员ID、球队ID、名字、姓氏) 团队(团队ID、运动ID、团队名称) 运动(运动标识、运动名称) 现在我想存储玩家的统计数据。我遇到了一个问题,不同的运动员从事不同的运动,因此必须为每项运动存储不同类型的统计数据。例如,如果我储存曲棍球运动员和棒球运动员: 对于曲棍球运动员,我想储存进球和助攻 对于棒球运动员,我想储存击

我正试图设计一个数据库来存储多种运动类型的运动员统计数据

在数据库中,你会有一堆玩家。每个球员都属于一个队,每个队都从事一项运动。以下是迄今为止我仅针对该部分的表格:

球员(球员ID、球队ID、名字、姓氏)

团队(团队ID、运动ID、团队名称)

运动(运动标识、运动名称)

现在我想存储玩家的统计数据。我遇到了一个问题,不同的运动员从事不同的运动,因此必须为每项运动存储不同类型的统计数据。例如,如果我储存曲棍球运动员和棒球运动员:

  • 对于曲棍球运动员,我想储存进球和助攻

  • 对于棒球运动员,我想储存击球、本垒打和打点


有没有一种合适的方法可以使用一个数据库来执行类似的操作?我开始的方法是否正确?

正确的方法是制作多张桌子,每项运动可能有一张桌子

玩家(玩家ID、名字、姓氏)
团队(团队ID、运动ID、团队名称)
团队列表(团队ID、球员ID)
运动(运动标识、运动名称)
曲棍球统计数据(球员ID、球队ID、年份、进球、比赛成绩、助攻)
BaseBallStats(球员ID、球队ID、年份、BoringSport)


这也解决了交易、从哪支球队获得积分以及多项运动的问题。

您最初的设计还可以

您需要为游戏创建一个表。因此,您将有一个带有字段(游戏ID、运动ID、团队1 ID、团队2 ID)的游戏表,然后可能(玩的日期、输赢等)

然后我会为每项运动创建一个统计表。TBL_棒球统计(统计ID、比赛ID、球员ID、命中率、小时数、打点等)

然后你可以有一张曲棍球统计表。TBL_曲棍球统计表(统计ID、比赛ID、球员ID、进球、助攻等)


这将允许您按玩家、游戏、运动等调出统计数据。

另一种方法是使用带有统计ID列的单个表,标识该行中描述的统计数据。如果要保存的统计数据随时间变化,这可能会很好。只有在每个统计数据的基本形式相同的情况下,这才有效(对不起,我是英国人,不熟悉你提到的运动和统计数据),但是有多个表的次要变体(一个表中的所有百分比统计数据,另一个表中的所有简单计数统计数据,等等).

如果你想在不修改数据库的情况下动态创建新的运动项目,你必须创建足够智能的东西来概括任何类型的统计数据的存储。无论你选择什么,你都无法用一个表来实现这一点

因此,如果你有一个确定的不同运动的数量,我建议你为每个统计创建一个表

如果不是(你想通过他们的统计数据在未来创造新的体育项目),你应该寻找如何抽象出这样的东西。一些草稿:

  • 一项运动有很多统计数据
  • 一个统计有许多领域和一项运动
  • 字段有许多属性(类型、值等)

如果相同的轮廓出现在不同的统计数据中,您可以利用表继承。

您可以从XML团队创建的用于体育建模的rdbms模式中获得灵感。在该模式中,游戏和玩家统计数据存储在非规范化的表中,以及核心统计数据(如分数)与特定于运动的项目分开。模式相当复杂,但可以让您了解可能的实现方式

您必须注意,某些运动员的名字(名字和姓氏)相同,因此在定义主键时需要考虑这一点


对于棒球,有很多不同类型的统计数据-我会尝试通过至少添加平均/游戏/跑步/命中/AB/SB/2B/3B来满足竞争对手DBs的期望。还有投手统计数据-W/ERA/WHIP/SO。

多个运动项目有自己不同类型的规则,因此您可以使用基于文档的数据库(例如:MONGODB)因为它是灵活的,没有具体的栏目。

你绝对肯定一个球员只能为一个队打一项运动吗?-例如,一个球员不可能同时打曲棍球和棒球?如果是这样,你的桌子到目前为止在我看来还可以。如果这是家庭作业,那么这么说是个好主意。这并不意味着你不会得到帮助。是的,每个人都可以玩家从不玩一项以上的运动。我猜这是一种家庭作业,不是真的,这是我为某人制作的演示项目。+1-如果每项运动的统计数据集是静态的(每列一个统计数据),则可能是真的.我还添加了一种更好的球员分组方法。我觉得可以做更多的事情来跟踪球员交易,但目前OP有一些工作要做。谢谢,这在我看来很有意义。出于某种原因,我认为这会更复杂。+1特别是在将统计数据与特定比赛关联方面-很好点,假设它是必要的。谢谢你的帮助,我不关心个人游戏或游戏结果(团队赢或输)的统计数据。用户想要完成的几乎是+1