我正在使用PHP和MySQL製作瀏覽器MMO。我猶豫方式來實現播放清單兩者之間:將庫存存儲在數據庫中的最佳方式:每個物品實例獲取其列表,或者每個玩家都有一個「庫存」字段?
製作時/從怪物/發現下降,項目會在項目表一個新行,它的存儲類型(匕首的實例,魔藥的位置......),它的位置(玩家Z的盤點中X:Y的地面上的地面?),也許還有一兩個場地。一件物品的列表如下所示:
id=728 ; type=14 ; location="i426" ; special="e8"
(其中「i426」意味着「在玩家n°426的庫存中」,而「e8」意味着該物品具有結界n°8)。
優點:我可以存儲關於每個單獨物品的數據 - 附魔,耐久度,以前的擁有者......而且,這些物品可以輕鬆放置在任何位置;把這些物品放在拍賣行裏,免費使用這個系統 - 更不用說瘋狂的可能性了,比如物品裏面的物品等等。
缺點:有數百名玩家整天掠奪怪物和精心打造,這很快造就了一張巨大的桌子,看起來很浪費。我擔心這可能會減慢整個遊戲的速度(我使用了很多AJAX voodoo)隨時都會涉及到物品。或:當玩家把他們的庫存中的項目,在數據庫上該玩家的庫存字段與新項目的類型(整數)在最後被追加,用分隔符更新。典型的庫存字段將如下所示:
"|11|8|27|58|58"
優點:浪費更少。一個項目實例只是幾個數字和一個分隔符。
缺點:沒有關於物品的額外數據;每個實例都是一樣的。另外,將一個項目放在一個貼圖上意味着該貼圖需要它自己的庫存字段 - 以此類推一個項目的每個可能位置。此外,這種方法涉及任何時候必須添加/刪除項目的字符串,而不是簡單地從表中刪除一行。另一件事是玩家的庫存可以存儲可變數量的物品,所以這個字符串沒有可預測的長度。
在之前的項目中,我使用了第二種方法。第一種方法看起來很有趣,但我不確定它是否會同意我們的存儲空間和服務器的速度。哪些方法最常用於MMO?完全是另一個嗎?有沒有我錯過的一些優點或缺點? (對不起,如果這個問題有點主觀!)
我猜測幾乎所有的系統都使用更類似於類型1的東西,因爲類型2是名爲「Jaywalking」的[antipattern](http://pragprog.com/book/bksqla/sql-antipatterns)。它源自對交叉點的恐懼。 – 2012-03-13 03:16:55
玩家的庫存是否有限?他們有沒有說可以使用10個插槽?或者它是受重量或類似的東西? – 2012-03-13 03:24:27
@MarcusAdams - 喂!我以爲我發現了一些聰明的東西。 – Orteil 2012-03-13 04:32:15