此嵌套子文档模式是否会影响性能?

问题描述:

我正在构建一个基于回合的基于浏览器的RPG,并构建了一个数据模型如下所示。当一个玩家参与战斗时,读写都将执行“灵魂”和“物品”子文档(数组),并进一步读取“技能”和“角色”子文档。我想每个阵列1-30子文档之间sporn每个此嵌套子文档模式是否会影响性能?

我试图包含单个集合性能几乎所有的逻辑,但我与嵌套走得太远了?

我听说使用嵌套阵列时,想拿到这个数据模型是否可行的若干意见的MongoDB/MeteorJS运动表现不佳?

email: '[email protected]' 
    password: 'f321' 
    profile: 
     character: 
     _id: 'c001' 
     location: 'Isenheim' 
     name: 'Ugyr' 
     race: 'human' 
     level: 1 
     experience: 1 
     maxHealth: 10 
     curHealth: 10 
     curAp: 10 
     maxAp: 10 
     flagged: false 
     gold: 0 
     souls: [ 
      _id: 'S001' 
      name: 'Hound' 
      race: 'beast' 
      cost: 5 
      active: false 
      maxHealth: 5 
      curHealth: 5 
      maxAp: 6 
      curAp: 6 
      skills: [ 
      name: 'Bite' 
      damage: 1 
      cost: 2 
      , 
      name: 'Shred' 
      damage: 2 
      cost: 4 
      effects: 
       name: 'Bleeding' 
       duration: 2 
       type: 'subtractive' 
       stats: ['curHealth'] 
       value: 1 
      ] 
     ] 
     skills: [ 
      name: 'Slash' 
      type: 'direct' 
      damage: 2 
      cost: 2 
     , 
      name: 'Pierce' 
      type: 'direct' 
      damage: 3 
      cost: 3 
     , 
      name: 'Throwing Knives' 
      type: 'direct' 
      damage: 1 
      cost: 1 
     ] 
     items: 
      equiped: 
      weapon: 
       name: 'Rusty Knife' 
       attack: 2 
      shield: null 

      inventory: [ 
      name: 'Potion' 
      type: 'consumable' 
      effects: 
       type: 'additive' 
       stats: ['curHealth', 'curAp'] 
       value: 3 
      amount: 500 
      , 
      name: 'Minor Soul Stone' 
      type: 'consumable' 
      amount: 500 
      effects: [ 
       type: 'additive' 
       stats: ['curAp'] 
       value: 2 
      , 
       type: 'subtractive' 
       stats: ['curHealth'] 
       value: 1 
      ] 
      , 
      name: 'Health Potion' 
      type: 'consumable' 
      amount: 100 
      effects: [ 
       type: 'additive' 
       stackable: false 
       stats: ['curHealth'] 
       value: 1 
       duration: 2 
      ] 
      ] 
      conditions: [ 

      ] 

是的,你嵌套太过分了。

流星DDP只发送第一级属性的更改/差异。因此,要souls & items任何更改都将等同于整个profile被再次发送。

我会建议打破character到一个单独的集合,以及soulsitems

然后,在所有这些denormalise userId和一次性发布它们,例如:

Meteor.publish("my-characters",function(){ 
    if (this.userId == null){ 
    return; 
    } 
    return [ 
    characters.find({"userId": this.userId}), 
    characterSouls.find({"userId": this.userId}), 
    characterItems.find({"userId": this.userId}) 
    ]; 
}); 

这将可能给出版光标方面的最佳性能&数据上了线。

另外,不要忘记指数userId

characters._ensureIndex({userId: 1}); 
characterSouls._ensureIndex({userId: 1}); 
characterItems._ensureIndex({userId: 1}); 
+0

感谢您的答复,虐待能够正常化的项目集合,因为它应该只在最大约500文件,但每个角色可以有在1-20个独特的灵魂之间,所以这意味着灵魂收集会非常大,并且在加入文档时可能会导致性能问题? – Tarlen 2014-08-31 09:28:28

+0

你什么时候需要加入?如果您添加'userId'字段(按照示例),那么您可以发布而不使用任何联接。如果你担心客户端性能,20应该是最小的 – 2014-08-31 09:41:07

+0

啊我很困惑,我的坏,但你认为这个数据模型可以扩展到可能支持1000+并发用户,约500个请求/秒被发送到服务器? – Tarlen 2014-08-31 09:49:15