流星数据库设计用于分层结构

时间:2015-12-11 05:25:24

标签: javascript mongodb meteor nosql

我是Meteor和Mongo的新手,我有一些基本的数据库设计问题。

让我们说我正在制作像Advance Wars这样的回合制战略游戏。我不确定如何构建我的数据。

我做了一个小演示,我在html中做了这个:

{{#each chars}}
  <div class='char' style={{get_style}}>
      ...
  </div>
{{/each}}

我在Template.body上定义了这个帮助器:

Template.body.helpers({
  chars: function() {
    return Characters.find({});
  },
  ...
})

当我一次只运行一个游戏时,这很好用。但是,当我同时运行多个游戏时,我不确定如何使这项工作成功。

我想一种方法就是拥有一个游戏集合。这些游戏中的每一个都引用了两个或更多玩家,每个玩家都可以拥有一个角色列表。每个角色可以有一个x和y位置。但后来我不确定用Characters.find({})取代{i}的查询。

我想它可能像Game.findOne({game_id: game_id}).players[player_id].characters。但我不确定那里的性能影响是什么。每次角色移动时,Meteor都会拉下整个游戏对象吗?我真的不明白流星正在做什么。

我想另一种需要进行微小改动的可能性就是做Characters.find({game_id: 123, player_id: 1})之类的事情。然后我会在一个大集合中拥有所有游戏中的所有角色。对于我来说,没有字符&#34;封装&#34;似乎有点奇怪。在一场比赛中,但也许这是要走的路。

实际上,既然我已经写出来了,似乎第二种选择更有意义。我想我会将所有其他内部游戏对象定义为单独的集合。这是一个很好的方法吗?

1 个答案:

答案 0 :(得分:1)

让我们假装您的收藏品存储看起来像

的项目
{
  _id: String,
  started: Date,
  players: [{
    _id: String,
    name: String,
    characters: [{
      _id: String,
      x: Number,
      y: Number
    }, {
      // ...
    }]
  }, {
    // ...
  }]
}

如果你有一个_id的游戏并且你需要获得所有玩家及其角色,那么你就可以了

let gameId = 'whatever';
const games = Games.find({
  _id: gameId
});

之后,在games中,你有一个游标可以让你迭代一个元素,一个你通过它的ID选择的游戏(这是设计上唯一的)。

然后,在您的模板中,您执行

<div class="games">
  {{#each games}}
    <h1>{{started}} — game's `started` scalar property.</h1>
    {{#each players}}
      <div class="player" id="{{_id}}">
        <h2 id="{{_id}}">{{name}} — player's name</h2>
        {{#each characters}}
          <h3 id="{{_id}}">{{x}}, {{y}} — coordinates of a character</h3>
        {{/each}}
      </div>
    {{/each}}
  {{/each}}
</div>

请注意_id如何尊重当前背景。

另一种方法是使用普通对象而不是光标,但只有在保证查询结果为单个元素的情况下才应使用它:

let gameId = 'whatever';
const game = Games.findOne({
  _id: gameId
});

模板看起来会有所不同。由于您只有一个普通对象,因此您无需迭代任何内容。因此,您可以访问此对象的属性,省略最顶层的上下文并将其替换为with块:

<div class="game">
  {{#with game}}
    <h1>{{started}} — game's `started` scalar property.</h1>
    {{#each players}}
      <div class="player" id="{{_id}}">
        <h2 id="{{_id}}">{{name}} — player's name</h2>
        {{#each characters}}
          <h3 id="{{_id}}">{{x}}, {{y}} — coordinates of a character</h3>
        {{/each}}
      </div>
    {{/each}}
  {{/with}}
</div>

请确保您的模板(或整个客户端)订阅了Games集合,并且此集合已在服务器上发布并返回整个字段集,并且不会查询数据(或它确实可以控制它。)