2010-10-15 121 views
1

我正在設計一個帶有三個表的數據庫:用戶,遊戲和(可能)註冊表。我想表示用戶可以在零個或多個遊戲中註冊。數據庫設計問題(或問題)

我使用表寄存器在遊戲中註冊用戶。

我還需要在遊戲中存儲用戶的分數。

我的問題是:

我可以在表中添加一個名爲score的列嗎?這是一個好的設計嗎?

謝謝。

回答

2

什麼你所描述的是一個多一對多的關係,使用寄存器作爲交叉引用表:

USER 
UserID 

GAME 
GameID 

REGISTER 
UserID 
GameID 
Score 
[+ registration info] 

聽起來很不錯,但如果無論是遊戲相關的或登記相關的信息變得更復雜的你最終可能會把它分成兩部分。

編輯補充:通常你最終會想保存遊戲歷史(「平均分」,「最近5場比賽」,「最快時間」等)。那麼你有REGISTERGAME_HISTORY表之間的一對多關係。

此外,我同意所謂的「註冊」表的答案,如果它包含非註冊信息將會引起混淆。

+0

感謝您的回答。我在數據庫設計方面很新。閱讀你的答案我還有一個問題:如果我要添加更多信息,爲什麼還要拆分表格?我怎樣才能將它分成兩部分? – VansFannel 2010-10-15 13:54:51

1

您可以將用戶標識和遊戲ID與評分一起放入註冊表中。這將允許你有一個用戶註冊了很多遊戲,每個遊戲都有一個分數。如果我正確理解你的問題,我認爲這可能會做你想做的。

0

我想象一下,你要使用註冊表來避免遊戲和用戶之間的多對多關係。如果你想在特定的遊戲中保持特定用戶的分數,我認爲這是一個很好的解決方案。

3

是的,這是一個好設計。但你應該改變命名。

user: 
    userid 
    username 

game: 
    gameid 
    name 

usergame: 
    userid 
    gameid 
    score 
+1

這是很好的建議,因爲註冊(或在這個解決方案中的用戶遊戲)是爲了解決遊戲和用戶之間的多對多連接。 – mlusiak 2010-10-15 13:46:03

+2

我認爲這個命名非常重要。我強烈建議'usergame'(或者,在我看來,更好的是'user_game')通過'register'。 「註冊」這個名稱(因爲它是一個名詞)甚至比「註冊」更好。 – 2010-10-15 16:15:46

0

如果它是跟蹤用戶評分在不同的遊戲表:當然,你可以有柱。但也許稱它爲'分數'呢? (除非你需要其他一些信息,那麼也許你應該使用第四個表)

0

我認爲你應該考慮創建一個「關係」表。

UserId | GameId | Score 

UserIdGameId將主鍵以及各自爲外源的UserGame表,分別。

0

這可能是一個合適的設計,只要每個註冊表最多隻能有一個分數。如果寄存器可能沒有分數,那麼這將對應於值NULL。如果這可能是表格中很大一部分行數,那麼另一張保存分數的表格可能是合適的。

在我製作的一個應用程序中,我遇到了類似的情況,並且因爲我想添加「高分表」功能(在分數列上需要查詢ORDER BY),所以我最終得到了很多索引我的「註冊」表(不止一個只是爲了這個目的,因爲我必須爲不同類型的遊戲設定不同的索引)。最後,我爲分數製作了一張新表,儘管大多數寄存器都有相關的分數,以便使這些索引的維護更少。

0

如果你的數據庫的目的是分析,那麼你還可以這樣考慮:

請記住,你會做一個外部聯接,除非您在遊戲桌上一排「沒有註冊的遊戲'並將其作爲usergame表中的默認值。您可以刪除第一次註冊時的「未註冊」...並在最後一次註冊被刪除時將其添加回去。

這將使您的報告內部聯接和查找所有用戶沒有註冊是簡單明瞭的。