Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于季节的数据库模式/设计_Sql Server_Database Design - Fatal编程技术网

Sql server 基于季节的数据库模式/设计

Sql server 基于季节的数据库模式/设计,sql-server,database-design,Sql Server,Database Design,在引入季节概念之前,我有一个简单的体育注册系统方案: 球员注册成为球队的一员 球队注册成为俱乐部的一部分 一个队在一个分区比赛 一个组织会产生分歧 这种情况每季都会发生。所以我需要一种方法来记录每个赛季的情况。这里最好的方法是什么?我是否应该引入一个“季节”实体,并在上述所有实体之间建立多对多关系(如适用)?或者,是否有一种方法可以在每个季度“归档”所有内容的同时,还可以动态地提取所有基于季度的数据(用于报告或其他用途)?这种设计允许团队在不同的季度之间移动到不同的部门,而不必每年重新创建(虽然

在引入季节概念之前,我有一个简单的体育注册系统方案:

球员注册成为球队的一员

球队注册成为俱乐部的一部分

一个队在一个分区比赛

一个组织会产生分歧


这种情况每季都会发生。所以我需要一种方法来记录每个赛季的情况。这里最好的方法是什么?我是否应该引入一个“季节”实体,并在上述所有实体之间建立多对多关系(如适用)?或者,是否有一种方法可以在每个季度“归档”所有内容的同时,还可以动态地提取所有基于季度的数据(用于报告或其他用途)?

这种设计允许团队在不同的季度之间移动到不同的部门,而不必每年重新创建(虽然它不允许像温尼伯喷气式飞机移到凤凰城这样的事情,也不允许在历史赛季数据中保留他们的旧名字)

现在要跟踪季节:

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)
);

您还需要时间表、排名、球员统计等表格,但这应该是一个开始。

感谢您的回复。我这样做的方式就是在分区和赛季之间有一个多对多的表格。这就解决了所有问题。我仍然会将您的表格标记为一个答案,以防将来有人需要参考。这对您很有帮助我。我刚刚遇到了一个类似的情况,我有一个球员表(包含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)
);