2013-02-19 42 views
0

我正試圖確定我的數據庫的最佳組織。我有一個用戶表,每個人都有一列current_game。 (每個用戶在任何特定時間只能屬於一個遊戲。)有一個遊戲桌,每個特定遊戲都有一個唯一的ID。用戶,遊戲,歷史關係的數據庫模式

我可以用這種方式執行我所有的查詢/操作。但是,我想保留每個用戶以前的遊戲記錄,以便他們可以訪問其歷史數據和統計信息。

由於比賽只持續了這麼久 - 周說 - 因爲不是所有的用戶將始終積極參與比賽,這是我正在考慮的模式:

usersusers_inactivegamesgames_old,game_events,game_events_old

我的顧慮是2:首先,兩個用戶表會出現登錄和註冊問題嗎?其次,我是否必須爲每個用戶遊戲關係保留一列兩排membership表格(因此每個用戶遊戲關係中有8個用戶在過去的5場比賽中表示membership表中有40行),還是有更簡單,更優雅的方式?

回答

1

我的建議是引入一個布爾列來指示實體是否處於活動狀態。例如,我將在「遊戲」表格中使用game_active(布爾列),而不是「games_old」表格,而不是「遊戲」和「games_old」表格。在商業邏輯中,你將不得不將新遊戲標記爲活躍遊戲和舊遊戲。

同樣的邏輯也適用於其他表。

約束的樣子,

PRIMARY KEY (`user_id`, `game_id`), 
INDEX `idx_user_id` (`user_id`), 
INDEX `idx_game_id` (`game_id`), 
CONSTRAINT `fk_users_user_game` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON UPDATE NO ACTION ON DELETE NO ACTION, 
CONSTRAINT `fk_games_user_game` FOREIGN KEY (`game_id`) REFERENCES `games` (`game_id`) ON UPDATE NO ACTION ON DELETE NO ACTION 
+0

「會員」問題呢? – David 2013-02-19 18:43:33

+0

對不起,我錯過了那部分。據我所知,是的,你必須有一個兩列的用戶 - 遊戲關係表,因爲這是一個多對多的關係。 – Slowcoder 2013-02-19 18:54:54

+0

然後用「user_id」和「game_id」創建一個複合主鍵。 – Slowcoder 2013-02-19 19:00:30

-1

也許GameHistory

UserId | GameId 

1  | 563  

我想象中的開始和結束日期將被存儲在遊戲桌。您仍然可以將當前遊戲ID存儲在用戶表中,或者在GameHistory表中創建一個稱爲當前遊戲的位域。

+0

會員問題呢? – David 2013-02-19 18:46:52

1

我會從users表中刪除current_game列,並添加一個新表,將用戶與遊戲連接在一起,並附帶開始和結束時間戳。沿着線的東西:

CREATE TABLE user_games (
    user_id INT, 
    game_id INT, 
    start TIMESTAMP NOT NULL, 
    end TIMESTAMP 
); 

對於目前的遊戲中,您將設置end爲NULL。當用戶切換到不同的遊戲時,更新end併爲新遊戲添加一個新行。

爲了查詢當前遊戲,只需加入表格即可,條件是end爲NULL。要查詢歷史遊戲,請確保時間戳在startend之間。