我会尽量具体,但我对这个问题的概念化有困难。作为一个业余爱好,我试图设计一个NFL数据库,收集原始统计数据,并将其存储起来,以备将来对梦幻联盟进行评估分析。我想看到的一个主要问题是,某些球员/球队是否在与特定球队的比赛中表现出色,以及哪些防守可能会传球/跑动。我遇到的问题是试图设计时间表/事件表。我现在的模型如下。
TEAMS
TeamID, Team
SCHEDULE
ScheduleID, TeamID, OpponentID, Season, Week, Home_Away, PointsFor, PointsAgainst
在这个场景中,我将复制每一个游戏,但是当我使用teamaway和teamhome的事件表时,我发现我的查询无法运行,因为我必须同时查询awayteam和hometeam才能找到特定团队的事件。
一般来说,如果一个表与一个表之间有两个关系,那么即使在调度表中,我的查询也无法工作。
我还考虑过删除团队表,只为团队和对手字段存储ne、pit等,这样我就不必处理返回团队表的交叉关系。
我如何设计它,以便不运行teamid=opponentid和teamid的查询?
我在ms access做这个。
编辑
我遇到的问题是当我查询两个表时:team(teamid,team)和event(teamhomeid,teamawayid),这两个表在teamid-teamhomeid和teamid-teamwayid之间建立了关系,我在ms access中构建查询时遇到了问题。
SQL看起来像:
SELECT Teams.ID, Teams.Team, Event.HomeTeam
FROM Teams INNER JOIN (Event INNER JOIN Result ON Event.ID = Result.EventID)
ON (Teams.ID = Result.LosingTeamID) AND (Teams.ID = Result.WinningTeamID)
AND (Teams.Team = Event.AwayTeam) AND (Teams.Team = Event.HomeTeam);
它寻找的是既有失利球队又有获胜球队(不存在)的球队。
我想我可能已经解决了这个问题。我没有意识到数据库设计中的关系只是默认的,而且在查询生成器中,我可以更改生成特定查询的连接。我通过删除返回的sql语句的所有和部分发现了这一点,并且能够返回所有赢奖团队的名称。
最佳答案
这是一个有趣的概念,也是一个很好的实践。
首先,听起来你需要缩小你想要的数据的范围,这样你就知道该存储什么了。我是说,见鬼,把天气状况储存起来怎么样?
我会保留球队,但我也会增加城市(因为球队可以改变城市)。
我会保留gameid,hometeamid,awayteamid,scheduledate列的游戏(时间表)。
我会有另一个表结果列resultid,gameid,winningteamid,losinteamid,draw(y/n)。
数据可能看起来像
TeamID | TeamName | City
------------------------
1 | PATS | NE
------------------------
2 | PACKERS | GB
GameID | HomeTeamID | AwayTeamID | ScheduleDate | Preseason
-----------------------------------------------------------
1 | 1 | 2 | 1/1/2016 | N
ResultID | GameID | WinningTeamID | LosingTeamID | Draw
------------------------------------------------------------
1 | 1 | 1 | 2 | N
考虑到这一点,您可以很容易地为任何预定的比赛和日期提供任何w/l/d,您可以很容易地
SUM
一支球队获胜,他们在主场、客场、季前赛或常规赛期间的胜利,他们对某支球队的胜利,等等。我想如果你想得到真正的技术,你甚至可以创建一个季节表,存储季节ID,开始日期,结束日期。这将确保你百分之百地知道在哪个赛季(在哪个日期之间)进行了哪些比赛,从中你可以推断天气统计数据,是否有球员在那个时间段出局,等等。