javascript - 关系数据库设计到 mongoDB/mongoose 设计

标签 javascript node.js mongodb database-design mongoose

我最近开始在我的新 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 或设置模型的 _idNumber 因为 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/

相关文章:

javascript - 在 Javascript 中生成 React/Express 路由

node.js - 如何在 GraphQL 中包含突变请求元数据?

java - mongo 驱动程序 api 中使用的 Document、BasicDBObject、BsonDocument 之间的实际区别是什么

json - Mongoose.js getter 在 Find() 上膨胀子文档?

javascript - 在 JavaScript 中以预定义的不规则间隔调用函数

javascript - 如何使用左/上重新定位相对DIV?

node.js - ERR_CONNECTION_RESET : Error When i try to upload large files using node. js/multer ,部署在 elastic beanstalk -nginx 服务器

php - 如何在 Windows 7 上安装 PHP 7 的 MongoDB 驱动程序?

javascript - new super.constructor 是 JavaScript 中的有效表达式吗?

javascript - 将带有函数的 Javascript 对象转换为字符串