No-SQL数据库组合/计数数据

时间:2015-12-04 06:25:51

标签: mongodb mongoose nosql

我正在开发我的第一个没有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
    }
}

1 个答案:

答案 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”字段。