我最近开始使用mongoDB和mongoose作为我的新node.js应用程序.在我努力适应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,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,score: Number });
解决方法
Mongoose的设计方式使您可以相对轻松地对表进行关系建模,并根据您在模式中定义的引用来填充关系数据.问题是你需要小心填充.如果您填充太多或嵌套您的人口,您将遇到性能瓶颈.
您在Edit 1中的方法基本上是正确的,但是您通常不希望基于Number填充远程ref或将模型的_id设置为Number,因为mongo使用它自己的散列机制来管理_id,这通常是隐含了_id的ObjectId.示例如下所示:
var scoreSchema = new mongoose.Schema({ user : { type: Schema.Types.ObjectId,game : { type: Schema.Types.ObjectId,score: Number });
如果由于某种原因你需要为你的记录保留一个数字id,可以考虑将其称为uid或者与mongo / mongoose内部不冲突的东西.祝好运!