我正在制作一个C#/ SQL / LINQ网站表单来处理一级方程式中的单个赛季。棘手的部分似乎是为单场比赛设计表格,每个表格描述大约20名车手,与他们一起驾驶的车队(2名车手每个团队,不一定每个赛季都使用相同的车手)和比赛位置。
到目前为止,我有桌子
Driver (driverid(PK), firstname, lastname, teamid(FK)
Team (teamid(PK), teamname, engine)
Circuit (circuitid, circuitname, country)
为了存储比赛结果,我有一个比赛表
dbo.Race
raceId(PK)
date
circuitId(FK)
每个种族的表格,其中有20条记录,这些表格将链接到Race中的相应条目(类似于面向对象设计中的类列表的List),例如。
dbo.Australia2018
driverid(FK)
teamid(FK)
finalposition
finaltime
为每个种族创建一个新表的替代方法是在种族表中具有其他20个字段,但是无论哪种方式,都需要存储大量数据。显然,我需要搜索每场比赛的总分,以得出车手和车队(车队)的成绩。
对于这种数据量,将没有“正确”的设计方法,但是在这里我缺少一种更整洁的方法吗?
答案 0 :(得分:0)
这样的事情应该做您想要的。
您可以为每个驱动程序创建一个表,该表将保存有关该驱动程序的所有信息,并且还将为他们所属的团队提供一个外键。这将使您可以分别查询所有车手和车队。
CREATE TABLE Driver
(
Driver_ID INT IDENTITY(1,1) PRIMARY KEY,
Forename varchar(100),
Surname varchar(100),
Team_ID INT
)
您可以使用链接表将驱动程序链接到团队,以及他们的开始和结束的时间
CREATE TABLE Driver_Team
(
Driver_Team_ID INT IDENEITY(1,1) PRIMARY KEY,
Team_ID INT,
Driver_ID INT,
Start_date datetime,
End_date datetime
)
将为团队提供另一张桌子,所有团队信息都可在此处保存。
CREATE TABLE Teams
(
Team_ID INT IDENTITY(1,1) PRIMARY KEY,
Team_Name varchar(100)
)
ALTER TABLE Driver ADD CONSTRAINT FK_TeamID FOREIGN KEY (Team_ID) REFERENCES Teams (Team_ID)
电路或轨道的表格,您可以在其中放置有关轨道的所有信息
CREATE TABLE Circuit
(
Circuit_ID INT IDENTITY(1,1) PRIMARY KEY,
CircuitName varchar(200)
)
现在在比赛表中,您将拥有车手ID,车队ID和赛道ID,这些是其他表中的外键,那么您可以拥有所有其他比赛信息,例如比赛日期,最终位置和最终时间
CREATE TABLE Race
(
Race_ID INT IDENTITY(1,1) PRIMARY KEY,
Race_Date DATETIME,
Driver_ID INT,
Team_ID INT,
Circuit_ID INT,
FinalPosition TINYINT,
Final_Time DATETIME
)
ALTER TABLE Race ADD CONSTRAINT FK_Race_DriveID FOREIGN KEY (Race_ID) REFERENCES Driver(Race_ID);
ALTER TABLE Race ADD CONSTRAINT FK_Race_Team FOREIGN KEY (Team_ID) REFERENCES Teams(Team_ID);
ALTER TABLE Race ADD CONSTRAINT FK_Race_CircuitID FOREIGN KEY (Circuit_ID) REFERENCES Circuit(Circuit_ID);
一旦所有数据都放在表中,就可以使用类似的方法从数据库中选择数据。
SELECT
D.Forename,
D.Surname,
T.TeamName,
C.CircuitName,
R.FinalPosition,
R.Final_Time
FROM Race R
INNER JOIN Driver D ON
D.Driver_ID = R.Driver_ID
INNER JOIN Teams T ON
T.Team_ID = R.Team_ID
INNER JOIN Circuits C ON
C.Circuit_ID = R.Circuit_ID
WHERE C.CircuitName = 'Silverstone' AND D.Forename = 'Lewis'