1

我需要跟踪得分以及得分的对象。以前,我使用一个看起来像这样的平面文件数据库(那是一团糟)来做到这一点:

03611100025
00001000000
21011000000
00003000000
00021000000
10001050000
00001402000
00001000100
00001013050
00001000100
00001000000

每个团队都有一行和一列,我猜整个事情变成了一个图表。现在我也可以这样做,MySQL 也是如此,但它会变得臃肿,并且会迫使每一行有一个荒谬的列数。

我觉得我必须错过一些其他更简单的方法来做到这一点。有人可以帮忙吗?

4

2 回答 2

5

有 2 个表,Team 和 Game,其中 Team 有一个团队名称和一个团队 ID,而游戏有 2 个团队 ID(团队 1 和团队 2)和比赛的得分。然后,您在 Game 和 Team 表之间有外键(为了完整性)。这将以最小的模式和非常简单的结构反映谁演奏了谁以及得分是多少。

Team
|-------------------------|
| Primary (int)| id       |
|         (chr)| name     |
|-------------------------|

Game
|-------------------------|
| Primary (int)| team1    |
| Primary (int)| team2    |
|         (int)| score1   |
|         (int)| score2   |
|-------------------------|

因此,一些示例数据如下所示:

Team
|------------------|
| id | name        |
|------------------|
|  1 | Blue Devils |
|  2 | Cardinals   |
|  3 | Fish        |
|  4 | Lemmings    |
|------------------|

Game
|---------------------------------|
| team1 | team2 | score1 | score2 |
|---------------------------------|
|     1 |     2 |      7 |      8 |
|     1 |     4 |      2 |     25 |
|     2 |     3 |      8 |      2 |
|     3 |     4 |     17 |     18 |
|---------------------------------|

该数据表明球队 1(蓝魔)以 7 比 8 的比分对阵球队 2(红雀)。其余数据类似。

如果您不需要跟踪团队名称,则可以不填写该字段,但这通常是有用的信息。

因此,使用此模式,您将获得特定团队的分数,查询如下

SELECT * FROM Game g 
 INNER JOIN Team t on t.team1 = g.id

如果需要,您还可以添加其他信息,例如比赛发生的时间(日期),以及任何其他信息,例如有关比赛或球队的其他统计数据。

于 2010-01-13T17:35:42.517 回答
1

第一个回答是正确的。如果您将数据组织成关系,并为每个关系创建一个表,则数据将更容易处理。您需要在关系数据库设计中进行的背景知识学习将教会您更多有关此的知识。

如果您使用响应中的团队和游戏结构,您仍然可以将该结构转换为您在问题中想象的那种结构。此过程称为“交叉制表”或“透视”,教程中有详细记录。

虽然从关系结构转移到交叉表结构很容易,但要另辟蹊径却非常困难。针对交叉表数据编写其他查询也很困难。一个例子可能是找到每支球队得分的最高分。如果您将数据放入数据库中,您迟早会想要用它做不止一件事。

于 2010-01-14T13:28:05.697 回答