我正在开发我的第一个没有SQL数据库的项目(带有mongoose ORM的mongoDB),并且在设计数据结构时遇到了一些麻烦。让我们说我正在开发一个应用程序,用于跟踪我的办公室桌上足球游戏桌的游戏结果和玩家统计数据。该游戏由4名球员组成,每名球员都是A或B,可以采取进攻或防守的姿势。所以我有这种存储数据的结构
游戏收藏:
Schema({
id: String,
side_a: {
offense: {type: Schema.Types.ObjectId, ref: 'Player'},
defence: {type: Schema.Types.ObjectId, ref: 'Player'},
score: Number
},
side_b: {
offense: {type: Schema.Types.ObjectId, ref: 'Player'},
defence: {type: Schema.Types.ObjectId, ref: 'Player'},
score: Number
}
winner: String, // side_a || side_b
date: {type: Date, default: Date.now}
})
球员收藏:
Schema({
id: String,
firstName: String,
lastName: String
})
所以我的问题是如何将这些集合中的数据组合起来是正确的(或者是可能的),所以我将拥有以下JSON结构:
{
"player_id": "123"
"firstName": "Test",
"lastName": "Test",
"games_played": 280,
"side_a": {
"total_win": 100,
"defence_win": 80,
"offense_win": 20
},
"side_b": {
"total_win": 84,
"defence_win": 64,
"offense_win": 20
}
}
答案 0 :(得分:1)
这取决于。您可以通过多种方式处理它:
1)聚合
这种方法涉及您必须以编程方式包含字段“firstName”和“lastName”,因为mongodb不允许连接集合。
2)在玩家收藏中嵌入统计数据
玩家数据结构:
Schema({
id: String,
firstName: String,
lastName: String,
games_played: Number,
side_a: {
total_win: Number,
defence_win: Number,
offense_win: Number
},
side_b: {
total_win: Number,
defence_win: Number,
offense_win: Number
}
})
缺点:使用这种方法,您必须在玩家每次玩游戏时更新您的Player系列。
<强>结论强>
如果您希望快速查询统计信息,请使用第二种方法,但请记住,此方法需要手动维护计算字段。
另一方面,如果使用合适的索引,则可以获得良好的性能。这种情况下的问题是您必须以编程方式包含“firstName”和“lastName”字段。