如何为关系构建数据库?数据

时间:2010-01-13 17:34:25

标签: mysql database database-design relational

我需要跟踪得分和他们得分的对象。以前,我使用平面文件数据库(这是一团糟)这样做:

03611100025
00001000000
21011000000
00003000000
00021000000
10001050000
00001402000
00001000100
00001013050
00001000100
00001000000

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

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

2 个答案:

答案 0 :(得分: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(蓝魔队)打了2队(红雀队),得分为7到8.其余数据相似。

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

因此,使用此架构,您将获得具有类似

的查询的特定团队的分数
SELECT * FROM Game g 
 INNER JOIN Team t on t.team1 = g.id

如果您需要,您还可以添加其他信息,例如游戏发生时(日期),以及任何其他信息,例如有关游戏或团队的其他统计信息。

答案 1 :(得分:1)

第一反应是正确的。如果将数据组织成关系,并为每个关系创建一个表,那么数据将更容易使用。您需要在关系数据库设计中学习的背景知识将为您提供更多相关信息。

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

虽然很容易从一个关系结构转移到一个交叉结构的结构,但是从另一个方面来说是非常困难的。对交叉制定的数据进行其他查询也很困难。一个例子可能是找到每个团队得分最高的分数。如果你把你的数据放在一个数据库中,迟早你会想要用它做多件事。