0

抱歉,如果标题不清楚。我对如何规划我的数据库模式有点困惑,因为我的数据库设计技能水平要求属于高级:) 我真的可以在这里使用一些帮助。无论如何,它来了......

我需要跟踪球队的比赛细节。为了简单起见,假设我需要跟踪比赛日期、结果和参加比赛的球队。现在,我如何设计我的表,这样我就可以确保返回所有相关数据,而不必保留相同匹配的多条记录。我不确定我是否解释清楚,所以下面是一个例子。

match_id    team1             team2    result
________    ________    ________     ________
1           Arsenal          Chelsea    5-3
2           Manchester Utd   Arsenal    1-0
3           Liverpool        Newcastle  2-0
4           Arsenal          Everton    1-0

从这些数据中,如果我搜索阿森纳比赛的 match_ids,我应该得到以下结果,1,2,4。

现在,在我所知道的基本设计中,我通常会在团队名称中搜索匹配的团队名称并返回结果。但是这里的团队名称可以在两个不同的列中,并且两者都可以相关。那么,这是我需要在设计级别上决定的事情,还是可以通过某种查询来完成的事情。

(注意:将团队存储为主场/客场不是我的要求的选项)。

4

5 回答 5

2

您可以只查询两列,这不是问题:

select match_id
from matches
where team1 = 'Arsenal' or team2 = 'Arsenal';

您也可以通过将团队放在单独的表中并在匹配表中只保留他们的 id 来规范化此模式,但这并没有太大变化,您仍然需要查询两列。阅读有关数据库规范化的信息,任何 SQL 书籍都涵盖了这一点)。

于 2012-04-20T22:05:38.377 回答
1

如果每场比赛总是有两支球队,那么我认为你在这里做得很好,当查询特定球队时,你会想要搜索一列或另一列 ( SELECT match_id FROM matches WHERE team1 = "?" OR team2 = "?")。

不过需要注意的是:我肯定会将分数分成两列:

match_id  team1           team2      score1  score2
________  ______________  _________  ______  ______
1         Arsenal         Chelsea    5       3
2         Manchester Utd  Arsenal    1       0
3         Liverpool       Newcastle  2       0
4         Arsenal         Everton    1       0

这样,您以后可以在需要时查询分数。(例如大胜 = SELECT match_id FROM matches WHERE ABS(score1 - score2) > 3;

如果每场比赛有可能拥有超过两支球队,那么您拥有的另一个选项应该更具可扩展性。如果是这种情况,那么您可能希望删除 match_id 上的唯一性约束并将团队/分数列从 2 删除为 1:

match_id    team            score
________    ________        ____
1           Arsenal         5
1           Chelsea         3
2           Manchester Utd  1
2           Arsenal         0
3           Liverpool       2
3           Newcastle       0
4           Arsenal         1
4           Everton         1       

当然,您肯定会接受 Sergio 的建议,将所有这些东西放在单独的表格中。“团队”可能会有不同的属性(家乡、教练姓名等),您不会想要复制这些数据。

于 2012-04-20T22:19:50.883 回答
0

对于明星,我不会存储时间名称,我认为如果您将时间存储在其他表和 linq 中然后通过 id 会更好。

然后您可以创建一个包含列 id、match id 和 team id 的表,然后在该表中搜索团队 id!

于 2012-04-20T22:12:26.377 回答
0

您可以使用此查询,它对您的程序没有问题:

从 YOUR_TABLE_NAME 中选择 YOUR_ID_FIELDS,其中 YOUR_FIELD_NAME(team1) = 'Arsenal' 或 YOUR_FIELD_NAME(team2) = 'Arsenal';

对于 exmale(切尔西),从 YOUR_TABLE_NAME 中选择 YOUR_ID_FIELDS,其中 YOUR_FIELD_NAME(team1) = 'Chelsea' 或 YOUR_FIELD_NAME(team2) = 'Chelsea';

于 2012-04-20T22:14:32.790 回答
0

这将为您提供您想要的结果,但也可能有更好的设计。

Select * 
from table 
where (team1 = 'ARSENAL' or Team2 = 'ARSENAL')

您可能想要分离出诸如 Team1Score Team2Score 之类的分数,否则您将无法轻松地用它们进行数学运算。

于 2012-04-20T22:06:27.340 回答