我应该使用单独的 collection 还是嵌入我知道不会用于所有模型的字段。 MongoDB
Should I use separate collection or embed fields that I know won't be used for all models. MongoDB
背景:
我正在计划一款具有 3 种类型 post 的应用,用于 n 场比赛; Single-posts、team-posts、coach-posts。现在我不确定 post 的单个 type 的最佳架构。
某种类型的 post 共享几个基本属性,例如:user_id、评论、状态等。但是与游戏相关的字段将是唯一的。
这是我正在考虑的两种可能性:
1。每个游戏分开collection:
如您所见,playerposts 类型需要每个游戏的不同字段,但具有相似的结构。
// game1_playerposts
{
_id: ObjectId(),
user_id: ObjectId(),
game: ObjectId(),
comments: [{
user_id: ObjectId(),
comment: String,
score: Number
}],
rank: {
name: String,
abbr: String,
img: String
},
roles: [String],
gamemode: [String]
}
// game2_playerposts
{
_id: ObjectId(),
user_id: ObjectId(),
game: ObjectId(),
comments: [{
user_id: ObjectId(),
comment: String,
score: Number
}],
level: {
name: String,
abbr: String,
img: String
},
champions: [String],
factions: [{
name: String,
abbr: String,
img: String
}]
}
2。一个 collection 适用于所有游戏:
这样我只需要一个collection,并且总是只使用我需要的字段,其余的将保持为空。
{
_id : ObjectId(),
user_id : ObjectId(),
game1 : {
game: ObjectId(),
rank: {
name: String,
abbr: String,
img: String
},
roles: [String],
gamemodes: [String]
},
game2 : {
game: ObjectId(),
level: {
name: String,
abbr: String,
img: String
},
champions: [String],
factions: {
name: String,
abbr: String,
img: String
}
},
game_n {
...
},
comments : [{
user_id: ObjectId(),
comment: String,
score: Number
}],
}
哪个更好?
以下哪个选项更适合?性能很重要,但我也希望在我们决定在未来添加对另一款游戏的支持时能够简单地添加到 Schema 中。
MongoDB 是无模式的。
我不明白为什么你必须有你知道不会被使用的字段。为什么不为每个单独的玩家 post 创建一个单独的文档,并且该文档将具有与 post 类型相关的架构?
您可以在一个 collection 文件中包含您在“每个游戏collection 下作为示例的两个文件”header.
我没有使用过 Mongoose,但如果使用它会消除 MongoDB 无模式的好处,我认为它不会像现在这样流行,所以我认为有一种方法让它工作。
背景:
我正在计划一款具有 3 种类型 post 的应用,用于 n 场比赛; Single-posts、team-posts、coach-posts。现在我不确定 post 的单个 type 的最佳架构。
某种类型的 post 共享几个基本属性,例如:user_id、评论、状态等。但是与游戏相关的字段将是唯一的。
这是我正在考虑的两种可能性:
1。每个游戏分开collection:
如您所见,playerposts 类型需要每个游戏的不同字段,但具有相似的结构。
// game1_playerposts
{
_id: ObjectId(),
user_id: ObjectId(),
game: ObjectId(),
comments: [{
user_id: ObjectId(),
comment: String,
score: Number
}],
rank: {
name: String,
abbr: String,
img: String
},
roles: [String],
gamemode: [String]
}
// game2_playerposts
{
_id: ObjectId(),
user_id: ObjectId(),
game: ObjectId(),
comments: [{
user_id: ObjectId(),
comment: String,
score: Number
}],
level: {
name: String,
abbr: String,
img: String
},
champions: [String],
factions: [{
name: String,
abbr: String,
img: String
}]
}
2。一个 collection 适用于所有游戏:
这样我只需要一个collection,并且总是只使用我需要的字段,其余的将保持为空。
{
_id : ObjectId(),
user_id : ObjectId(),
game1 : {
game: ObjectId(),
rank: {
name: String,
abbr: String,
img: String
},
roles: [String],
gamemodes: [String]
},
game2 : {
game: ObjectId(),
level: {
name: String,
abbr: String,
img: String
},
champions: [String],
factions: {
name: String,
abbr: String,
img: String
}
},
game_n {
...
},
comments : [{
user_id: ObjectId(),
comment: String,
score: Number
}],
}
哪个更好?
以下哪个选项更适合?性能很重要,但我也希望在我们决定在未来添加对另一款游戏的支持时能够简单地添加到 Schema 中。
MongoDB 是无模式的。
我不明白为什么你必须有你知道不会被使用的字段。为什么不为每个单独的玩家 post 创建一个单独的文档,并且该文档将具有与 post 类型相关的架构?
您可以在一个 collection 文件中包含您在“每个游戏collection 下作为示例的两个文件”header.
我没有使用过 Mongoose,但如果使用它会消除 MongoDB 无模式的好处,我认为它不会像现在这样流行,所以我认为有一种方法让它工作。