wow有數千個任務,每個玩家的任務進度都不同,所以資料庫需要記錄每個玩家的任務進度,難道是給每個玩家分配數千個欄位嗎??

請問如何設計這種超多欄位的資料庫呢?比如說,我想設計一個學生考試成績的資料庫,記錄每個學生在每次考試中的每道題是否做對,那豈不是要成千上萬個欄位了嗎,有沒有更好的設計方法呢?拜謝!謝謝大家的回答。我可能沒說清楚,像魔獸世界這樣的遊戲,總共有幾千個任務。玩家做完某個任務後,就不能再重複做了,因此肯定是記錄玩家的所有任務的完成狀態。比如說有1000個任務,1000個玩家,是不是必須要1000*1000的表來記錄任務狀態?


任務有任務的資料庫A,人物有人物的資料庫B。進行中的任務,可以有個進行中任務資料庫,進行中任務資料庫同時跟人物和人物有關係C。C只要保存A和B對應的id就行了。這是關係型資料庫的基礎啊。
關鍵字: 第三範式
這個問題有點兒意思,我先mark一下,等過幾天有空再來答,如果我還記得的話。。。
有點意思。但是為啥要上千個欄位呢?這是資料庫設計的基本功呀,弄個明細表就搞定的事情。

魔獸世界每個角色同時可以接的任務是有上限的。任務觸發的條件數應該有個上限,對每個條件單獨存完成進度就可以。

欄位可以這樣來設計

玩家表示

任務表示

任務類型接收時間超時時間等其他與觸發無關的欄位條件數條件1參數1進度1

條件2

參數2

進度2

。。。。。

重複N次(不會太多)個人感覺類似這樣,用戶登錄的時候把這些讀到內存裡面,用戶完成任務時或下線時數據寫回去,數據量也不大,感覺可行。
基於你的問題,資料庫表應該長這樣:表1:玩家(player),PK 為 play_id表2:任務(task),PK為task_id表3:玩家任務關係表,PK為player_id和task_id兩列,這表還有一列叫「任務進度」。
基本的,玩家表,key是玩家id

任務表,聯合主鍵,玩家id,任務id,然後一個state,一個progress,

找到玩家a所有任務,去任務表拿玩家id找一下,就得到了
目前我所接觸的大部分遊戲(單機,支持mod製作)中,關於用戶個人參數的設置都不是以資料庫的形式來存儲,而是以xml文件的形式來存儲,不太清楚網遊中存儲的形式,但是應該也不會用資料庫來做吧。關係型資料庫對於類似任務完成與否(任務完成情況)這種簡單的事物顯得太過於複雜了,增加個任務還得改資料庫不是蛋疼麼。不如直接記錄每個用戶對應的xml文件,然後讀取就好了

就算真的用資料庫記錄,也不是很大的量。用一個超長字元串的單欄位存儲即可。

魔獸世界有不到一千萬玩家。假定每個玩家需要記錄的項目是八萬個任務,那麼每個位記錄一個只需要一萬個位元組,一千萬個玩家也僅僅需要100G的空間。即便使用位元組記錄而不是用位記錄,800G的空間就夠了。

但是數據中心的存儲量都是以TB甚至PB計的,幾百G的東西根本就不是事兒。


推薦閱讀:
相關文章