MongoDB数据建模性能

时间:2019-01-17 16:39:18

标签: javascript mongodb performance nosql

我目前正在mongodb尝试找出在性能成本和冗余方面最好的方法,这是构建大文档数据模式的最好方法。我其余的->应用中的最终JSON可能是如何构造的。 现在内部不会使用太多数据,这就是为什么我将其绑定到单个文档中的原因。只有id会在其他集合中用作参考。 你们认为,最好以关系方式吐痰,通过多个集合将内容存储在可交付成果内部并使用引用或仅嵌入。 (因为NoSQL没有连接,尽管这种方式会加快速度)

当前在节点应用程序上使用猫鼬 架构:

projectSchema = new Schema({
name: {
    type: String,
    required: true,
    minlength: 3,
    maxlength: 50
},
companyId: {
    type: mongoose.Types.ObjectId,
    ref: 'companies',
    required: true
},
deleted: {
    type: Number,
    enum: [0, 1],
    default: 0
},
predictedStartDate: {
    type: Date,
    default: ""
},
predictedEndDate: {
    type: Date,
    default: ""
},
realStartDate: {
    type: Date,
    default: ""
},
realEndDate: {
    type: Date,
    default: ""
},
//not final version
riskRegister: [{
    name: String,
    wpId: {
        type: mongoose.Types.ObjectId,
        ref: 'projects.deliverables.workPackages.id',
        required: true
    },
    probability: String,
    impact: String,
    riskOwner: String,
    response: String,
    duration: String,
    trigger: String,
    status: String,
    plannedTimming: String
}],
deliverables: [{
    body: String,
    workPackages: [{
        body: String,
        activities: [{
            body: String,
            tasks: [{
               content: String,
               properties: [{
                   dependecies: Array,
                   risk: {
                       type: Number,
                       enum: [0,1],
                       required: true
                   },
                   estimatedTime: {
                       type: Number,
                       required: true
                   },
                   realTime: {
                      required: true,
                      default: 0,
                      type: Number 
                   },
                   responsible: {
                       id: {
                           type: Number,
                           default: -1
                       },
                       type: {
                           type: String,
                           enum: [0, 1], //0 - user, 1 - team
                           default: -1
                       }
                   },
                   materialCosts: {
                       type: Number,
                       default: 0
                   },
                   status: {
                       type: Number,
                       default: 0
                   },
                   approval: {
                       type: Number,
                       default: 0
                   },
                   startDate: {
                       type: Date,
                       default: ""
                   },
                   finishDate: {
                       type: Date,
                       default: ""
                   },
                   endDate: {
                       type: Date,
                       default: ""
                   },
                   userStartDate: {
                        type: Date,
                        default: ""
                   },
                   endStartDate: {
                        type: Date,
                        default: ""
                   },
                   taskNum: {
                       type: Number,
                       required: true
                   },
                   lessonsLearn: {
                    insertedAt: {
                        type: Date,
                        default: Date.now
                    },
                    creatorId: {
                        type: mongoose.Types.ObjectId,
                        ref: 'users',
                        required: true
                    },
                    situation: {
                        type: String,
                        required: true
                    },
                    solution: {
                        type: String,
                        required: true
                    },
                    attachments: Array
                   }
               }] 
            }]
        }]
    }]
}]

})

1 个答案:

答案 0 :(得分:1)

我要提出的唯一问题就是可交付成果。如果将来有用例对workPackage上的活动或任务执行某些CRUD操作,则mongodb位置运算符$不支持inner arrays,因此您将不得不提取所有可交付结果并在内存中进行迭代仅在更新可交付成果之后。 我的建议是仅支持对象第一级的数组。内部对象应在单独的集合(活动和任务)中进行模块化。在最新版本的mongodb中,您现在支持transactions,因此您可以在针对数据库的操作上实现ACID,因此可以通过原子方式来处理所有这些信息。