F1赛季数据库个人竞赛

时间:2019-01-20 14:07:50

标签: c# sql-server linq database-design

我正在制作一个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个字段,但是无论哪种方式,都需要存储大量数据。显然,我需要搜索每场比赛的总分,以得出车手和车队(车队)的成绩。

对于这种数据量,将没有“正确”的设计方法,但是在这里我缺少一种更整洁的方法吗?

1 个答案:

答案 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'