我最近开始在我的新 node.js 应用程序中使用 mongoDB 和 mongoose。在我努力适应 mongoDB/noSQL 思维方式之前只使用过关系数据库,例如非规范化和缺乏外键关系。我有这个关系数据库设计:
**Users Table**
user_id
username
email
password
**Games Table**
game_id
game_name
**Lobbies Table**
lobby_id
game_id
lobby_name
**Scores Table**
user_id
game_id
score
所以,每个大厅属于一个游戏,多个大厅可以属于同一个游戏。用户对不同的游戏也有不同的分数。到目前为止,对于我的用户架构,我有以下内容:
var UserSchema = new mongoose.Schema({
username: {
type: String,
index: true,
required: true,
unique: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
}
});
所以我的问题是,我将如何将关系设计构建到 mongoDB/mongoose 模式中?谢谢!
编辑 1
我现在尝试创建所有模式,但我不知道这是否是正确的方法。
var UserSchema = new mongoose.Schema({
_id: Number,
username: {
type: String,
index: true,
required: true,
unique: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
scores: [{ type: Schema.Types.ObjectId, ref: 'Score' }]
});
var GameSchema = new mongoose.Schema({
_id: Number,
name: String
});
var LobbySchema = new mongoose.Schema({
_id: Number,
_game: { type: Number, ref: 'Game' },
name: String
});
var ScoreSchema = new mongoose.Schema({
_user : { type: Number, ref: 'User' },
_game : { type: Number, ref: 'Game' },
score: Number
});
最佳答案
Mongoose 的设计方式使您可以相对轻松地对表进行关系建模,并根据您在架构中定义的 ref
填充关系数据。问题是你需要小心填充。如果您填充太多或嵌套您的人口,您将遇到性能瓶颈。
您在 Edit 1
中的方法在很大程度上是正确的,但是您通常不希望根据 Number
填充远程 ref
或设置模型的 _id
到 Number
因为 mongo 使用它自己的散列机制来管理 _id
,这通常是一个 ObjectId
与 _id
隐含。示例如下图:
var ScoreSchema = new mongoose.Schema({
user : { type: Schema.Types.ObjectId, ref: 'User' },
game : { type: Schema.Types.ObjectId, ref: 'Game' },
score: Number
});
如果出于某种原因您需要为记录维护一个数字 id,请考虑将其称为 uid
或不会与 mongo/mongoose 内部结构冲突的名称。祝你好运!
关于javascript - 关系数据库设计到 mongoDB/mongoose 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924616/