簡體   English   中英

流水數據庫的層次結構設計

[英]Meteor database design for hierarchical structure

我是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({});
  },
  ...
})

當我一次只運行一個游戲時,這很好用。 但是當我同時運行多個游戲時,我不確定如何使它正常工作。

我想做到這一點的一種方法是擁有一個Games系列。 這些游戲中的每一個都引用兩個或多個玩家,並且每個玩家都可以具有角色列表。 每個字符可以具有x和y位置。 但是然后我不確定用什么查詢替換Characters.find({})

我猜可能是Game.findOne({game_id: game_id}).players[player_id].characters 但是我不確定性能會帶來什么影響。 每當角色移動時,Meteor會拉下整個游戲對象嗎? 我不太了解Meteor在幕后所做的事情。

我猜可能需要進行最小限度更改的另一種可能性是執行Characters.find({game_id: 123, player_id: 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集合,並且此集合已發布在服務器上並返回整個字段集,並且不查詢數據(或查詢但可以控制數據) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM