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

 三年零七U个月的感情 发布于 2023-02-06 15:49

我最近开始使用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,
        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
});

小智.. 11

Mongoose的设计方式使您可以相对轻松地对表进行关系建模,并根据ref您在模式中定义的关系数据填充关系数据.问题是你需要小心填充.如果您填充太多或嵌套您的人口,您将遇到性能瓶颈.

你的做法Edit 1是正确的大幅但是你通常不希望来填充远程ref基于一个Number或设置_id一个模型的一种Number,因为蒙戈使用它自己的哈希机制来管理_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内部冲突的东西.祝好运!

1 个回答
  • Mongoose的设计方式使您可以相对轻松地对表进行关系建模,并根据ref您在模式中定义的关系数据填充关系数据.问题是你需要小心填充.如果您填充太多或嵌套您的人口,您将遇到性能瓶颈.

    你的做法Edit 1是正确的大幅但是你通常不希望来填充远程ref基于一个Number或设置_id一个模型的一种Number,因为蒙戈使用它自己的哈希机制来管理_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内部冲突的东西.祝好运!

    2023-02-06 15:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有