基于季节的数据库架构/设计

时间:2012-06-05 00:45:03

标签: sql-server database-design

我有一个简单的体育登记系统架构,直到介绍一个赛季的概念:

玩家注册为团队的一部分

团队注册为俱乐部的一部分

一个团队在一个部门中扮演

组织创建分部

每个季节都会发生这种情况。所以我需要一种方法来记录每一季的所有这些。这里最好的方法是什么?我是否应该引入“季节”实体并在适用的上述所有实体之间建立多对多的关系?或者有没有办法在每个季节“归档”所有内容,但也能够动态提取所有基于季节的数据(报告和不报告)?

1 个答案:

答案 0 :(得分:2)

这种设计允许团队从一个季节到另一个季节移动到不同的部门,而不必每年重新创建(尽管它不允许像温尼伯喷气机队搬到凤凰城这样的东西并保留他们的旧名称他们的历史赛季统计数据。)

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

你还需要时间表,积分榜,球员统计等等表......但这应该是一个开始。