[英]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.