2012-03-13 71 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

相关问题