在引入赛季概念之前,我有一个简单的体育注册系统架构:
玩家注册为团队的一员
团队注册为俱乐部的一部分
一支球队在一个分区比赛
组织创建部门
每个季节都会发生这种情况。所以我需要一种方法来跟踪每个赛季的所有这些。这里最好的方法是什么?我应该引入“季节”实体并在上述所有实体之间建立多对多关系吗?或者有没有一种方法可以“存档”每个赛季的所有内容,但也能够即时提取所有基于赛季的数据(用于报告等等)?
在引入赛季概念之前,我有一个简单的体育注册系统架构:
玩家注册为团队的一员
团队注册为俱乐部的一部分
一支球队在一个分区比赛
组织创建部门
每个季节都会发生这种情况。所以我需要一种方法来跟踪每个赛季的所有这些。这里最好的方法是什么?我应该引入“季节”实体并在上述所有实体之间建立多对多关系吗?或者有没有一种方法可以“存档”每个赛季的所有内容,但也能够即时提取所有基于赛季的数据(用于报告等等)?
这种设计允许球队从一个赛季到另一个赛季转移到不同的部门,而不必每年都重新创建(尽管它不允许像温尼伯喷气机队搬到凤凰城并在他们的历史赛季中保留他们的旧名字统计)。
CREATE TABLE dbo.Organizations
(
OrgID INT PRIMARY KEY,
Name NVARCHAR(255) NOT NULL UNIQUE
-- , ... other columns
);
CREATE TABLE dbo.Divisions
(
DivisionID INT PRIMARY KEY,
Name NVARCHAR(255) NOT NULL,
OrgID INT NOT NULL FOREIGN KEY REFERENCES dbo.Organizations(OrgID)
-- , ... other columns
-- UNIQUE might be (Name) or (OrgID, Name)
);
CREATE TABLE dbo.Clubs
(
ClubID INT PRIMARY KEY,
Name NVARCHAR(255) NOT NULL UNIQUE,
-- , ... other columns
);
CREATE TABLE dbo.Teams
(
TeamID INT PRIMARY KEY,
Name NVARCHAR(255) NOT NULL,
ClubID INT NOT NULL FOREIGN KEY REFERENCES dbo.Clubs(ClubID)
-- , ... other columns
);
现在要跟踪季节:
CREATE TABLE dbo.Seasons
(
SeasonID INT PRIMARY KEY,
StartDate DATE NOT NULL,
EndDate DATE,
Name NVARCHAR(255) NOT NULL -- e.g. '1997-98' for seasons that cross Jan 1
-- , ... other columns
);
CREATE TABLE dbo.SeasonTeams
(
SeasonID INT FOREIGN KEY REFERENCES dbo.Seasons(SeasonID),
DivisionID INT FOREIGN KEY REFERENCES dbo.Divisions(DivisionID),
TeamID INT FOREIGN KEY REFERENCES dbo.Teams(TeamID),
PRIMARY KEY (SeasonID, DivisionID, TeamID)
);
您可能需要约束或触发器来防止团队在任何给定年份属于多个部门。
现在,您还需要表示给定赛季/球队的名单。
CREATE TABLE dbo.Players
(
PlayerID INT PRIMARY KEY,
Name NVARCHAR(255) NOT NULL,
-- , ... other columns
);
CREATE TABLE dbo.TeamRoster
(
PlayerID INT NOT NULL FOREIGN KEY REFERENCES dbo.Players(PlayerID),
TeamID INT NOT NULL,
SeasonID INT NOT NULL,
DivisionID INT NOT NULL,
FOREIGN KEY (TeamID, SeasonID, DivisionID) REFERENCES
dbo.SeasonTeams (TeamID, SeasonID, DivisionID)
);
您还需要用于时间表、排名、球员统计数据等的表格……但这应该是一个开始。