この設計により、チームはシーズンごとに異なる部門に移動できますが、毎年再作成する必要はありません(ただし、ウィニペグジェットがフェニックスに移動し、古い名前を歴史的なシーズンに維持することはできません)統計)。
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)
);
スケジュール、順位、プレーヤーの統計などのテーブルも必要になりますが、それが出発点になるはずです。