2016-11-27 114 views
1

我正在創建幻想足球遊戲,我有一個關於如何設計我的數據庫的問題。我很難設計一種在聯賽之間分享球員的方式,並且仍然將其規範化。SQL - 規範化問題

有一張桌子,上面有所有可能的足球運動員稱爲球員,包含球隊信息的表格稱爲球隊,包含用戶信息的表格稱爲用戶,包含聯盟信息的表格和保留所有其他表格的表格編號叫做Rosters。

基本上有一個聯盟,擁有一定數量的球員,一旦選秀開始球員獲得成爲球隊,如果他們屬於一個球隊,他們不能再起草。我遇到的問題是,與多個聯賽分享這些球員。目前我有一個布爾值設置給玩家,如果他們可用或不。直到另一個聯盟嘗試起草該選手爲止,這種情況會奏效,因爲他們已被設置爲不可用。

我的問題是我該如何讓玩家在數據庫中可用/不可用,以便不同的聯賽有相同的球員選擇?有沒有更好的方式來建立這個數據庫?

名冊

CREATE TABLE Rosters ( 
RostersID INT NOT NULL AUTO_INCREMENT , 
LeagueID INT NOT, 
TeamID INT NOT NULL , 
PlayerID INT NOT NULL , 
UserID INT NOT NULL , 
PRIMARY KEY (RostersID) 
) 

聯賽

CREATE TABLE Leagues ( 
LeagueID INT NOT NULL AUTO_INCREMENT , 
LeagueName VARCHAR(35) NOT NULL , 
PRIMARY KEY (LeagueID) 
) 

CREATE TABLE Teams (
TeamID INT NOT NULL AUTO_INCREMENT , 
TeamName VARCHAR(35) NOT NULL , 
StateCode CHAR(3) NOT NULL , 
Ranking INT NOT NULL DEFAULT '0', 
PRIMARY KEY (TeamID) 
) 

用戶

CREATE TABLE Users (
UserID INT NOT NULL AUTO_INCREMENT , 
UserName VARCHAR(45) NOT NULL , 
Email VARCHAR(55) NOT NULL , 
Password VARCHAR(45) NOT NULL , 
PRIMARY KEY (UserID) 
) 

玩家

CREATE TABLE Players ( 
PlayerID INT NOT NULL AUTO_INCREMENT , 
LastName VARCHAR(50) NULL , 
FirstName VARCHAR(50) NULL , 
Postion VARCHAR NULL , 
Available BOOLEAN NOT NULL DEFAULT FALSE , 
PRIMARY KEY (PlayerID) 
) 
+1

查詢「使玩家在數據庫中不可用,使不同的聯賽可以起草相同的球員。」不計算。 – Strawberry

+0

不同的聯賽有相同的球員選擇。 – John

回答

1

這不是一個真正的數據庫級別的問題,這是一個應用程序邏輯的任務。您可以在數據庫級別執行的操作是在leagueid, playerid字段的roster表中放置多列唯一約束。這會阻止你的應用程序將同一個玩家分配給同一聯盟兩次。擺脫available字段。

的聯賽中可用的玩家可以通過在花名冊表左側的接合部球員表中列出:

select p.playerid 
from players p 
left join rosters r on p.playerid=r.playerid and r.leagueid=... 
where r.playerid is null 
1

你可以進入或許命名LeaguePlayer一個單獨的表的球員和聯賽進行之間的關係並移動現有的標誌出現。然後修改ROSTER表來引用LeaguePlayer而不是Player。

如果您然後限制數據庫,以便名冊表上的LeaguePlayerId是唯一的。然後在兩個參考列上爲LeaguePlayer創建一個唯一的約束。這將防止聯賽內的重複,同時允許不同的聯賽包含同一名球員。

(可選)您可以刪除可用標誌,並推斷出他們的LeaguePlayerId可用的球員不在名單表中。

下面的示例代碼。

CREATE TABLE Rosters ( 
RostersID INT NOT NULL AUTO_INCREMENT , 
LeagueID INT NOT, 
TeamID INT NOT NULL , 
LeaguePlayerID INT NOT NULL , 
UserID INT NOT NULL , 
UNIQUE(LeaguePlayerID), 
PRIMARY KEY (RostersID) 
) 

CREATE TABLE LeaguePlayer (
LeaguePlayerID INT NOT NULL AUTO_INCRMENT, 
LeagueId INT NOT NULL, 
PlayerId INT NOT NULL, 
Available BOOLEAN NOT NULL DEFAULT FALSE, 
UNIQUE(LeagueId,PlayerId), 
PRIMARY KEY (LeaguePlayerID) 
) 
+0

我實際上最終做了你的diea和Shadows的混合解決方案,在那裏我分解了一些數據庫並擺脫了Roster表。感謝您的建議。 – John

0

有「一對多」的關係,也有「多比多」的關係。你必須決定球隊:球員是1:多還是多:多。你有設計Roster與各種許多:可能的關係。

相反,Player表應該有一個列team_id,從而表明它是1:多關係(1個團隊:許多玩家)。

由於您正在討論隊選隊員,因此您可能想要指示玩家沒有被選中,team_idNULL

+0

所以Team應該有PlayerID,我應該從名冊中刪除PlayerID。我是否也應該從Roser中刪除UserID並將其放入團隊和/或聯盟? – John

+0

這是否意味着我應該把球隊列入陣容並將球隊ID放入聯盟內,因爲每個聯盟只有一支球隊? – John

+0

我認爲你需要重新開始模式的設計。 –

1

通過您的表格結構,您可以創建一個表格LeaguePlayer,其中包含playerID和leagueID以及合適的外鍵和複合主鍵。 當草案彙集玩家你叫喜歡

SELECT p.playerID FROM player p LEFT JOIN LeagePlayer lp ON p.playerID 
= lp.playerID WHERE lp.leagueID = current_league