垒球联赛的数据库建模
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_season
和 playoff
保留为不同的表是不明智的:它们可以很容易地合并为一个,通过添加某种标志来保留该信息。
编辑这就是我的意思:
注意有一个Season
表。
Player
属于 Team
在Season
。
无需复制任何内容。一个团队在数据库中只有 ONE 记录;玩家将只与 ONE 记录相关联。
我确实不设计了Playoff
表,因为我认为它不应该存在。如果 OP 不同意,请添加它。
这样您就可以跟踪所有季节,而无需复制整个数据库。我认为这也比使用year
列要好,后者没有意义,也不能轻易约束(就像外键一样)。
但是,请随意不同意。
【讨论】:
球员在本赛季不能更换球队。所以我认为在球员表中有一个年份列将使用 Team_id 将他们逐个赛季与他们的球队联系起来。 @Jeremy:我不认为你理解我。我的回答还基于这样一个事实,即球员的不能在赛季期间更换球队(如果可以的话,情况会复杂得多)。 @Jeremy - 他的意思是,您在Team
表中添加一年,每个团队每年都会获得一个新的 ID。然后您很容易知道谁为2010 Bears
和2011 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
【讨论】:
这并不能解决球员更换球队或队长每年更换球队的问题。以上是关于垒球联赛的数据库建模的主要内容,如果未能解决你的问题,请参考以下文章