2012-03-13 74 views
2

我正在使用PHP和MySQL製作瀏覽器MMO。我猶豫方式來實現播放清單兩者之間:將庫存存儲在數據庫中的最佳方式:每個物品實例獲取其列表,或者每個玩家都有一個「庫存」字段?

  1. 製作時/從怪物/發現下降,項目會在項目表一個新行,它的存儲類型(匕首的實例,魔藥的位置......),它的位置(玩家Z的盤點中X:Y的地面上的地面?),也許還有一兩個場地。一件物品的列表如下所示:
    id=728 ; type=14 ; location="i426" ; special="e8"
    (其中「i426」意味着「在玩家n°426的庫存中」,而「e8」意味着該物品具有結界n°8)。
    優點:我可以存儲關於每個單獨物品的數據 - 附魔,耐久度,以前的擁有者......而且,這些物品可以輕鬆放置在任何位置;把這些物品放在拍賣行裏,免費使用這個系統 - 更不用說瘋狂的可能性了,比如物品裏面的物品等等。
    缺點:有數百名玩家整天掠奪怪物和精心打造,這很快造就了一張巨大的桌子,看起來很浪費。我擔心這可能會減慢整個遊戲的速度(我使用了很多AJAX voodoo)隨時都會涉及到物品。

  2. 或:當玩家把他們的庫存中的項目,在數據庫上該玩家的庫存字段與新項目的類型(整數)在最後被追加,用分隔符更新。典型的庫存字段將如下所示:"|11|8|27|58|58"
    優點:浪費更少。一個項目實例只是幾個數字和一個分隔符。
    缺點:沒有關於物品的額外數據;每個實例都是一樣的。另外,將一個項目放在一個貼圖上意味着該貼圖需要它自己的庫存字段 - 以此類推一個項目的每個可能位置。此外,這種方法涉及任何時候必須添加/刪除項目的字符串,而不是簡單地從表中刪除一行。另一件事是玩家的庫存可以存儲可變數量的物品,所以這個字符串沒有可預測的長度。

在之前的項目中,我使用了第二種方法。第一種方法看起來很有趣,但我不確定它是否會同意我們的存儲空間和服務器的速度。哪些方法最常用於MMO?完全是另一個嗎?有沒有我錯過的一些優點或缺點? (對不起,如果這個問題有點主觀!)

+2

我猜測幾乎所有的系統都使用更類似於類型1的東西,因爲類型2是名爲「Jaywalking」的[antipattern](http://pragprog.com/book/bksqla/sql-antipatterns)。它源自對交叉點的恐懼。 – 2012-03-13 03:16:55

+0

玩家的庫存是否有限?他們有沒有說可以使用10個插槽?或者它是受重量或類似的東西? – 2012-03-13 03:24:27

+0

@MarcusAdams - 喂!我以爲我發現了一些聰明的東西。 – Orteil 2012-03-13 04:32:15

回答

3

你最好的設計是方法1的一個版本:每個項目都有自己的行,你把所有必要的信息在那裏。不要擔心優化問題 - 稍後當您看到用戶使用系統的方式以及瓶頸所在的位置時,您就有時間了。

現在,您想要設計易於編程和乾淨,明確的狀態描述。您需要爲每個「類型」項目設置一個主項目表,並在其中保存關於該項目以及如何使用項目的信息。然後,在創建(或實例化)時,您在items表中放置了一行,並描述了該項目實例的具體情況。移動時,您可以更新位置信息。這不是浪費,因爲您只需存儲一次,並且在正確的地方只需要管理該項目所需的信息。

通過在表格上放置正確的索引,您可以輕鬆快速地管理數百萬個索引。

+1

那麼這是決定,那就是我將使用! – Orteil 2012-03-14 19:45:16

相關問題