垒球联赛的数据库建模

Posted

技术标签:

【中文标题】垒球联赛的数据库建模【英文标题】:Database Modeling of a Softball League 【发布时间】:2011-03-14 19:09:18 【问题描述】:

我正在为一个用于垒球联盟网站的数据库建模。我在 DB 建模方面没有那么丰富的经验,而且我很难回答有关未来的问题。

现在我有以下表格:

玩家表(player_id、姓名、性别、电子邮件、team_id)

球队表(team_id、姓名、队长[player_id]、标志、wins_Regular_season、loss_regular_season)

regular_season 表(game_id, week, date, home[team_id], away[team_id], home_score, away_score, rain_date)

季后赛表(pgame_id、日期、home[team_id]、away[team_id]、home_score、away_score、winnerTo[pgame_id]、loserTo[pgame_id])

为了使数据在不同季节保持不变,但也有一种简单的方法来访问数据,我应该:

A) 在表中包含一个年份列,然后按年份过滤我的查询? B)每年创建新表? C) 做一些更有意义但我想不到的事情。

【问题讨论】:

您不需要团队表中的赢/输 - 您可能会在此处出现完整性问题,并且您已经在 regular_season 表和 playoff 表中记录了赢/输。 所以当显示排名页面时,我会查询常规赛季表中的球队参加的比赛以及得分是多少,然后从中计算出输赢记录?每次加载该页面时似乎都需要做很多工作。 @Jeremy - 如果您只需要赢/输的计数,那么它只是一个较长的 WHERE 子句,类似于WHERE (home = XX AND Home_Score > away_Score) OR (away = xx AND away_score > home_score) @JNK - 我什至没有想到这一点。谢谢你,这真的很漂亮。 @Jeremy - 将这些数据放在两个地方的危险在于您没有在其中一个地方更新它。当您在teams 表中记录了 5 胜 3 负但regular_season 表显示 4 胜 4 负时,您是否在regular_season 表中记错了一场,或者在teams 表中输入错误或两者都有? 【参考方案1】:

这种设计不仅对未来不利。 过去也是错误的。你没有以正确的方式保存历史。

让我们假设一名球员更换球队:这将如何适应这个设计?应该很容易得到那种信息……

最好的方法(恕我直言)也将季节表示为一个实体,一个具体的表格。然后,您应该在每个关系中复制此信息。例如,这意味着一名球员不仅仅属于一支球队:他在特定赛季属于一支球队,并且可能在赛季变化时属于另一支球队。

OTOH,我认为将 regular_seasonplayoff 保留为不同的表是不明智的:它们可以很容易地合并为一个,通过添加某种标志来保留该信息。

编辑这就是我的意思:

注意有一个Season 表。 Player 属于 TeamSeason无需复制任何内容。一个团队在数据库中只有 ONE 记录;玩家将只与 ONE 记录相关联。 我确实设计了Playoff 表,因为我认为它不应该存在。如果 OP 不同意,请添加它。

这样您就可以跟踪所有季节,而无需复制整个数据库。我认为这也比使用year 列要好,后者没有意义,也不能轻易约束(就像外键一样)。

但是,请随意不同意。

【讨论】:

球员在本赛季不能更换球队。所以我认为在球员表中有一个年份列将使用 Team_id 将他们逐个赛季与他们的球队联系起来。 @Jeremy:我不认为你理解我。我的回答还基于这样一个事实,即球员的不能在赛季期间更换球队(如果可以的话,情况会复杂得多)。 @Jeremy - 他的意思是,您在Team 表中添加一年,每个团队每年都会获得一个新的 ID。然后您很容易知道谁为2010 Bears2011 Bears 演奏,因为它们是唯一的实体/记录。 @rsenna @JNK - 这是有道理的,在我们讨论过在不同的表格中添加年份之后,我打算这样做。 @JNK:不,我不是这么说...我会发布一张图表,以便人们能够理解(并且也许别再给我投反对票了)。【参考方案2】:

标准方法是在表格中添加年份列。这样,您可以通过选择查询或视图轻松调用过去。 SQL Server 对此有很好的支持。我已经处理了另一条路线的清理工作,经过几年的数据积累,它并不漂亮。

【讨论】:

【参考方案3】:

我会选择选项 A,并在赛季表和季后赛表中有一个年份列。

【讨论】:

他在球员和球队表中也需要它,因为球员可以更换球队,球队也可以更换队长。 啊,所以每年你都会为每个玩家提供另一个条目?这对于保持每个赛季的球员数据非常有效。 因此,由于我们有 2 个赛季,我可以在每个表中创建一个列,类似于 2011 年夏季的“2011S”和 2011 年秋季的“2011F”......但我担心的是,在 5或 6 季后,数据库将开始处理大量数据。假设有 16 支球队,每支球队有 16 名球员,每支球队打 15 场比赛,并且每年有一个季后赛,这 16 支球队中的每支球队都以双败的方式播种。那是 16 支球队参赛,16 名球员参赛,以及每个赛季超过 100 场比赛。我会在 DB 上遇到空间问题吗? 您可能会惊讶于表中需要有多少记录才能看到真正的性能影响。【参考方案4】:

您已经有一个日期列,您可以使用它来查找年份

SELECT * FROM regular_season WHERE YEAR(date) = 2011

【讨论】:

这并不能解决球员更换球队或队长每年更换球队的问题。

以上是关于垒球联赛的数据库建模的主要内容,如果未能解决你的问题,请参考以下文章

数据建模:维度建模

数据建模:维度建模

数据仓库建模

数据仓库维度建模法案例

第二篇:数据仓库与数据集市建模

数据仓库和数据集市建模体系化总结