저는 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({})
.
나는 그것이 같은 것일 수 있다고 생각한다 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
컬렉션을 구독 하고이 컬렉션이 서버에 게시되고 전체 필드 집합을 반환하고 데이터를 쿼리하지 않습니다 (또는 사용자가 제어하지만).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다