gpt4 book ai didi

mysql - MongoDB:为浏览器游戏中的模型设计提供 map /单位建议

转载 作者:可可西里 更新时间:2023-11-01 10:07:43 25 4
gpt4 key购买 nike

大约2~3天前我开始学习MongoDB,感觉很开心:)然而..我确实有一些问题..我已经做了一些研究,他们并没有澄清太多..我正在开发一个浏览器游戏,所有数据库都在MySQL中,但我决定迁移到MongoDB。但是,好吧,对于问题。

1) 在 MySQL 中,我曾经有一个 map 表,其中包含字段 *map_ndx*、columnrow terrain(terrain 是对地形表的外国引用)。基本上,每个 *map_ndx* 表示不同的 map ,rowcolumn 表示它们的坐标; terrain 表示像“树林”、“沙漠”,分类在另一张表上。现在,在 MongoDB 上,我有一个 map 集合,它有一个字段 *map_ndx*,并嵌入了几个 tiles。每个 tile 都有字段 colrow,并嵌入一个 terrain。首先,您认为这种设计对于一张 map 来说效率高吗?例如,我会做很多查询来搜索“ map z 上的图 block (x,y)”。其次,我应该在哪里放置索引(例如)?我是将它们放在 tile 集合中,还是放在 map 集合中(例如,使用“index 'tile.row'”)?我问这个是因为在 MySQL 上,当我查询“select * from maps where map_ndx=1 and row=1”时,我会立即得到答案。在 MongoDB 上,如果我要求“Map.where(:map_ndx => 1).first.tiles.where(:row=>1)”,它几乎需要一秒钟才能完成(obs.:RoR 的语法,我正在使用 mongoid)

2)在MySQL中,我曾经有一个*global_units*表,里面有几个单位的描述,他们的攻击,防御,成本等等。每个玩家都有一个* user_units*,它引用了 *global_units*,并告知玩家对于这个引用的 *global_unit* 拥有的单位数量。现在,在 MongoDB 上,我考虑将 *user_units* 嵌入到 user 集合中,这似乎是理想的选择。但是,我是否应该让 *user_units* 仅引用 *global_units*,或者最好将 *global_unit* 也嵌入到每个玩家的 *user_units* 集合中?问题是我必须在其他地方从 *global_units* 访问这些单位,例如当玩家要 build 它们时。因此,即使我将它们嵌入到 *user_units* 集合中,我也需要一个独占的非嵌入 *global_units* 集合,这样我就可以在其他地方访问它们的信息。最好的出路是什么?

我知道这些是非常具体的问题,但如果有人向我澄清这些问题,我会很高兴!提前致谢,费尔南多。

最佳答案

您在这里提出的问题是复杂的“嵌入与引用”问题。第一个问题是这里没有单一的正确答案,它是一系列的权衡。有时引用更好,有时嵌入更好。

这里有一个详细的答案 one example .

这里的一个重大基本问题围绕着“顶级”对象。这是我个人的经验法则:

  1. 如果一个对象仅在其父对象的上下文中有用,那么您通常会嵌入。
  2. 如果一个对象在没有其父对象的情况下有用,那么您通常会引用。

问题 #2,我想您已经在这里找到了答案:

  • user_units 仅在 user 上下文中有用。如果您要加载 user,为什么不同时加载 units
  • global_units 在没有 user_unit 上下文的情况下很有用,因此您可能需要引用。当然你有一个“全局查找”的单位,但你有多少?几百?几千?它们都适合内存吗?

所以用户会有类似的东西

{ _id: 'gates',
units: { footman: 10, cannon: 3, horse: 5 }
}

好像还可以,如果用户需要一个新男仆,查数据真的很麻烦吗?当然,如果您真的想自定义,您可以存储关于我的步兵的统计数据(如果他们不同的话)。

问题 #1:有点冒险。

mapstiles 有何关联?单个 map 是否包含许多 tiles?您是否愿意在单个 map 中构建 tiles 的哈希表?

这是我看到的:

{ _id: 'map1',
name: 'jungle',
height: 20,
width: 20
tiles: { "0_0": { type: 'jungle' },
"0_1": { type: 'jungle' },
...
"19_19": { type: 'beach' }
}
}

请注意,我不是在构建一个图 block 数组,而是在构建一个实际的哈希表。我将所有图 block 塞入一张 map 并将整个内容加载到内存中。当然,这是假设您想要 map 上的所有图 block 。

我知道您的查询只查看单行,但现在的问题是您多久需要一次单行?您通常不需要一 block 正方形的瓷砖吗?

关于mysql - MongoDB:为浏览器游戏中的模型设计提供 map /单位建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6630709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com