我开始学习一些NodeJS,以及如何在YouTube上从Academind制作REST API,并了解了什么是关系数据库和非关系数据库,等等。
使用MongoDB,写操作相当便宜,因此我想尽量减少读取次数。目前,我试图看看如何制作一个API,该API将用于与discord相似的应用,尽管这会很有趣。
这是制作架构的正确方法吗?
const mongoose = require('mongoose')
const userSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true, unique: true},
email: { type: String, required: true },
password: { type: String, required: true }, // TODO: Hashing, etc
guilds: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
channels: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
// Only the X most recent messages
messages: [{
_id: mongoose.Schema.Types.ObjectId,
message: {type: String, required: true},
user: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}
}]
}],
// Only an X amount of users
users: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}]
}]
})
module.exports = mongoose.model('User', userSchema)
然后是公会,
const mongoose = require('mongoose')
const guildSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
channels: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
// Only an X amount of messages
messages: [{
_id: mongoose.Schema.Types.ObjectId,
message: {type: String, required: true},
user: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}
}]
}],
// All the users
users: [{
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
}]
})
module.exports = mongoose.model('Guild', guildSchema)
渠道架构
const mongoose = require('mongoose')
const channelSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
guild: {
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
channels: [{
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true }
}],
// The users of the guild, or just the channel?
// Could add a users object outisde of the guild object
users: [{
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true }
}]
}
})
module.exports = mongoose.model('Channel', channelSchema)
最后是消息
const mongoose = require('mongoose')
const messageSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
user: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
},
message: {type: String, required: true},
channel: {
guild: {
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true}
// Store more data for each message?
}
}
})
module.exports = mongoose.model('Message', messageSchema)
我不确定这是否是非关系模式。如果不是,我将如何存储所需的数据?
也可以说,我与用户A B和C在行会Y的X通道上发布了一条消息,我将如何更新所有条目并添加一条消息?
到目前为止,我只使用了User.find({_ id:id})。exec()。then()。catch(),所以我不确定如何去更新它们。
提前谢谢!
答案 0 :(得分:0)
消息集合应独立存在,请勿将其嵌入任何集合中。嵌入将无限增长的数据不是一个好主意。
将最后5条消息存储到其他集合中的想法很难实现。
当必须更新行会,渠道,时,将所有集合中的嵌入到所有非正常数据中的数据归为 users 似乎是一个问题。 >公会用户
。您可以将渠道嵌入公会。渠道不会无限制地增长,应该是一个合理的数量,每个公会少于100个渠道,并且可能一直与它们所属的公会一起使用。如果没有,请考虑不要将渠道嵌入行会。
mongodb的功能是构建反映应用程序如何使用数据的架构。我建议从规范化数据开始。当创建,读取,更新,删除数据出现问题时,请对猫鼬模式进行适当的更改以解决该问题。从长远来看,过早的优化只会带来伤害。
一如既往,答案取决于细节。由于我不了解所有详细信息,因此我推荐MongoDB首席技术支持工程师William Zola撰写的三部分文章。 part 1 part 2 part 3