此嵌套子文档模式是否会影响性能?
问题描述:
我正在构建一个基于回合的基于浏览器的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
到一个单独的集合,以及souls
和items
。
然后,在所有这些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});
感谢您的答复,虐待能够正常化的项目集合,因为它应该只在最大约500文件,但每个角色可以有在1-20个独特的灵魂之间,所以这意味着灵魂收集会非常大,并且在加入文档时可能会导致性能问题? – Tarlen 2014-08-31 09:28:28
你什么时候需要加入?如果您添加'userId'字段(按照示例),那么您可以发布而不使用任何联接。如果你担心客户端性能,20应该是最小的 – 2014-08-31 09:41:07
啊我很困惑,我的坏,但你认为这个数据模型可以扩展到可能支持1000+并发用户,约500个请求/秒被发送到服务器? – Tarlen 2014-08-31 09:49:15