【问题标题】:sports league database design体育联盟数据库设计
【发布时间】:2011-03-01 07:05:39
【问题描述】:

我正在开发一个数据库来存储体育联盟的统计数据。 我想展示几个表格:

  • 表明球队在当前和上一场比赛中的位置的联赛表
  • 显示球队在锦标赛每场比赛中的位置的表格

我有一个匹配表:

  • 比赛(IdMatch、IdTeam1、IdTeam2、GoalsTeam1、GoalsTeam2)

有了这张表,我可以根据球队参加的比赛计算每支球队的总分。但是每次我想显示排名表时,我都必须计算积分。

我也有一个问题来计算最近 10 场比赛中球队的位置,因为我必须进行 10 次查询。

将每场比赛的联赛表存储在数据库表中是另一种方法,但每次我更改已经进行的比赛时,我都必须从那里重新计算每场比赛...

有没有更好的方法来解决这个问题?

谢谢

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    问题在于(例如)球队在最近 10 场比赛中的位置或排​​名是派生数据。因此,将其存储在表中是重复的,而且完全没有必要,它会在没有的情况下创建 Update Anomaly。当然,像往常一样,每当您创建副本时,您就会遇到使它们保持最新并相互同步的后果,而解决这些问题的方法永远不会合理。因此,一开始就不要创建重复项,二则不会产生后果,三则不会产生编码的半解。

    只需为从真实源表派生的所有结果集(您认为是“表”)创建视图。这包括任何排名或职位列表;在任何情况下(赛程、冠军、联赛、国家)。

    在 SQL 中获得排名或位置很容易。但是代码取决于您拥有的 SQL(或非 SQL)的风格。有些风格不能处理子查询,而是提供了一个 RANK() 函数。如果你指定你有哪个 SQL,我可以提供细节。

    【讨论】:

      【解决方案2】:

      我假设游戏每天或每周发生一次。

      如果是这样,您可以在更新匹配后运行触发器或批处理操作,并将这些结果存储在汇总表中。

      这样每场比赛只计算一次。

      【讨论】:

      • 好吧,没关系。比赛可以随时更新。从比赛表计算联赛表不是问题。问题是当我想计算一支球队在最后 10 场比赛中的位置时。这就是我想在一个表中存储每个夹具的联赛表的原因
      猜你喜欢
      • 2013-08-24
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多