我正在尝试为战士和战斗制作数据库。 每场战斗都有两名战士和一些关于战斗本身的信息。 每个战士都有战斗记录和一些个人信息。 所以我想谈谈这两个架构。 我制作了这些模式,但不确定我是否正确使用Mongoose。这是正确的方法吗?
这是战斗机的架构。
var mongoose = require("mongoose");
var fighterSchema = new mongoose.Schema({
image: String,
firstName: String,
lastName: String,
nickName: String,
height: {
foot: Number,
inch: Number
},
weightClass: String,
reach: Number,
stance: String,
dob: Date,
country: String,
fights: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Fight"
}
]
})
module.exports = mongoose.model("Fighter", fighterSchema);
这是战斗模式。
var mongoose = require("mongoose");
var fightSchema = new mongoose.Schema({
fighters: [
{
fighter: {
type: mongoose.Schema.Types.ObjectId,
ref: "Fighter"
},
knockDown: Number,
significantStrikeLanded: Number,
significantStrikeThrow: Number,
takeDowns: Number,
takeDownAttempts: Number,
submissionAttempts: Number,
result: String
},
{
fighter: {
type: mongoose.Schema.Types.ObjectId,
ref: "Fighter"
},
knockDown: Number,
significantStrikeLanded: Number,
significantStrikeThrow: Number,
takeDowns: Number,
takeDownAttempts: Number,
submissionAttempts: Number,
result: String
}
],
info : {
noContest: Boolean,
weightClass: String,
method: String,
round: Number,
min: Number,
sec: Number,
timeFormat: {
rounds: Number,
min: Number,
},
referee: String,
details: String,
date: { type: Date, default: Date.now },
eventCategory: String,
}
})
module.exports = mongoose.model("Fight", fightSchema);
答案 0 :(得分:0)
如果您阅读关于关系的mongodb文档,您会发现在mongodb中他们说过,除非它非常重要并且存在大量冗余,您可以简单地将一个依赖文档嵌入到另一个中。
在你的情况下,每场战斗只有两个战士,所以你可以简单地在战斗文件中嵌入战斗机的细节
fight{
...
fighters:{fighter 1}, {fighter 2}
}
这一点都不错。
或者另一种简单的方法是在战斗模式中删除战士的参考,并简单地保持战斗机和战斗之间的一对多关系。
答案 1 :(得分:0)
评论部分很小,所以把它放在这里: -
好吧,让我举一个例子,看看这是否有意义。
战士集合
{
_id: fighter1,
name: xxxx,
age: 22,
skills :[a, b,c],
fightsParticipated:[fight1, fight3, fight10....]},
{
_id: fighter2,
name: yyyy,
age: 25,
skills :[ b,c,d],
fightsParticipated:[fight4, fight7, fight10....]
} ,
{.................}
战斗集合:
{
_id: fight10,
knockDown: Number,
significantStrikeLanded: Number,
significantStrikeThrow: Number,
takeDowns: Number,
takeDownAttempts: Number,
submissionAttempts: Number,
result: String
}
现在从上面的例子中我们可以看到战斗机1参加了战斗1,战斗3和战斗10和战斗机2在战斗4,战斗7和战斗10.所以两个战斗机在战斗10中相互战斗。
这里唯一的重复数据是你为每个战斗机存储的战斗ID,并没有太多的冗余。
同样在这种情况下,战斗10可以是只有两个战士的一部分,如果你在你的收集中有另外5个战士,那么10个战斗机将在他们的战斗参与名单中,因为只有两个战士之间的战斗。
让我知道这是否有意义。