2010-03-26 43 views
3

我試圖解決複雜的事情(因爲它在我看來)。noSQL/SQL/RoR:試圖爲遊戲構建可擴展的收視表

我旁邊的實體:

  1. PLAYER(他們幾個人,與像 「約翰」, 「彼得」 等名稱)。每個都有唯一的ID。爲了簡單起見,我們認爲這是他們的名字。 (很少有人說,叫做「捉迷藏」,「跳躍和奔跑」等等)。相同 - 每個都有唯一的ID。爲了簡單起見,讓它成爲現在的名字。

  2. SCORE(它是數字)。

那麼,它是如何工作的。

每個玩家都可以玩多個遊戲。他在每場比賽中得到一些分數。

我需要建立評級表 - 而不是一個!表#1:所有遊戲中的最佳玩家(比如每個遊戲中的總分數)。表格#1:玩得最多的遊戲 表#2:所有遊戲中的最佳玩家(比如每個遊戲中的總分數)。表#3:每個遊戲最好的玩家(通過SCORE特別是那個遊戲)。

我可以馬上建立一些東西,但那不行。 我將擁有超過10,000名玩家;和15場比賽,這些比賽肯定會增長。 對於玩家來說,分數可以低至0,最高可達1,000,000(不確定此時是否可能更高)。所以我真的需要一些相關數據。

有什麼建議嗎?

我打算用SQL來做,但可能只是將它用於鍵值存儲;任何東西 - 任何想法都歡迎。

謝謝!

回答

5

我會說兩件事。

首先我回答你的問題。其次,我認爲你應該做的。

1.答:

SQL,它很容易開發和測試+生產一段時間。 用於玩家的表格,帶有INT或其他某個uniq值,不是字符串。 (我知道你說過它是一個樣本,但是爲了「長字」整數應該給你足夠的唯一ID's 同樣適用於Game。現在讓高分保持在一起的東西就是在兩者之間建立關係

得分(表關係):

[Player ID][Game_ID][Score] 

其中得分是數值......我不知道您的每場比賽的最高分,讓你找出什麼類型就足夠了。

現在,這應該很容易實現一開始,讓它工作,但不要讓每一個直接調用數據庫。

建立一個3-TIER架構。製作數據圖層和商業圖層,然後製作「遊戲」圖層。 所以每場比賽都要求有自己的「遊戲ID」之類的businesslayer:

PlayerSaveScore(int gameID, int playerID, int score) 

的Businesslayer然後檢查的「參數」是正確的大小,而且有效身份證件的,或許驗證了這個播放器實際已經在會話過去5分鐘等

驗證後,那麼Businesslayer卡列斯的「更新表」,如果記錄存在,其中數據層首先查找數據層。如果不是,那就插入它。

層設計 一旦你是「在線」(在空氣中)和遊戲變得流行,那麼你就可以開始「升級」,但你仍然可以得到一個「未來編擴展的解決方案」現在要去。請記住,每個遊戲都必須調用業務對象/圖層,而不是直接 - 永遠不要!

我一直在同「思想嚯這麼多次」但我一直陷入一個叫準備簡單的循環,而是變成現實的解決辦法那是快速啓動和運行幾乎從來沒有得到我。

所以先獲得100000名玩家!然後開始擔心,當它超出。

第2部分爲...如何...規模建議:

因此,這裏是我的原因爲建設「businesslayer/web服務」 ...... 的一切煩惱和所有最好的,您的速度問題現在可以很好地解決。

你可以很簡單地實現「緩存」。

您做出額外的表,如果你只有15場比賽,你不需要一臺PR。遊戲,但你決定。那隻能保持每場比賽的前100名。每次從玩家發佈新記錄時,都會在此「前100名」中進行選擇,並檢查發佈的值是否列入列表中。如果是這樣,那麼通過更新排名前100的表格並加速來達到這個目的。

構建Top 100的抽象爲靜態數據列表,例如。 XML或類似的靜態數據。根據您的平臺,您可以爲您選擇正確的「靜態格式」。

你甚至可以進一步提高速度。只需保持每場比賽前100名所需的最小值即可。這將是一個記錄公關。遊戲。

然後將玩家得分與遊戲的「最高分100分」進行比較......如果上面有,那麼你有一些「緩存/索引」來做,然後你稱之爲「巨型排序」:o)

明白了嗎?我知道它是一個很長的答案,但我想發佈一個「完整的」解決方案。

希望你將標誌着這是你的答案:O)

+0

嗯,謝謝,但(總是有「but」,不是嗎?): 1.我不想那樣構建。我不擔心成長。這是我的要求。我知道該期待什麼,並有我的理由。所以我只需要把這個看作是給定的;不是因爲我確信我是那些在一夜之間如此受歡迎的「特殊」人羣中的一員 - 但它只是它需要完成的方式,並且存在客觀要求,討論哪些問題真的超出了我的問題。抱歉。 2.您的解決方案中無需進行任何調整:經常和多次寫入;改變每個球員的位置。 不幸的是;-( – alexeypro 2010-03-26 04:31:18

+0

@alexeypro - 當有人給你寫這樣一個很長的答案,很詳細,有趣和正確的時候,即使你不想使用它,請至少給它豎起大拇指! - ) – 2010-03-26 19:59:55

+0

@Etamar L,謝謝。 – BerggreenDK 2010-04-09 02:10:25

0

我不明白爲什麼這不能用一個評分表和簡單的SQL查詢來解決:

(未經測試的僞SQL)

create table scores { 
    player_id as integer, 
    game_id as integer, 
    score as integer 
} 

播放次數最多的遊戲:SELECT count(*) AS c FROM scores GROUP BY game_id ORDER BY c DESC

最佳球員:SELECT sum(score) AS s FROM scores GROUP BY player_id ORDER BY s DESC

在給定的遊戲最佳球員:SELECT * FROM scores WHERE score=(SELECT max(score) FROM scores WHERE game_id=$given_game) LIMIT 1

如果您需要同時獲得所有比賽的最佳球員名單,你可以擴展,去年查詢了一點(這大概可以用連接優化,但它的對於我來說現在就認爲這件事太早了)。

從數據庫角度來講,你所談論的行數很少。如果你緩存查詢結果(例如,通過類似memcached的內容,或者在你的RoR應用程序中),那麼你幾乎不會碰到數據庫。