MongoDB производительность моделирования данных - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я пытаюсь выяснить на mongodb, что является лучшим способом с точки зрения затрат на производительность и избыточности, лучшим способом построения схемы данных большого документа. Окончательный JSON из моего отдыха -> приложение, скорее всего, будет иметь структуру. Теперь внутренне данные не будут использоваться так много для многих, поэтому я связал их в один документ. Только идентификатор будет использоваться в качестве ссылки в других коллекциях. Вы, ребята, думаете, что лучше сплевать как реляционный способ, с несколькими коллекциями, чтобы хранить контент внутри результата и использовать ссылку или просто встраивать. (поскольку NoSQL не имеет соединений с i, хотя этот путь ускорится)

Ток с использованием мангусты в приложении узла Схема:

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 голосов
/ 17 января 2019

Единственное беспокойство, которое я хотел бы затронуть, касалось результатов. Если в будущем будет вариант использования для выполнения какой-либо операции CRUD в отношении действий или задач в workPackage, оператор позиции mongodb $ не поддерживает внутренние массивы , поэтому вы будете вынуждены извлечь все результаты и в памяти перебирать все и только после обновления результатов. Мое предложение было бы поддерживать только массивы на первом уровне объекта. Внутренние объекты должны быть запланированы в отдельном наборе (действия и задачи). В последних версиях mongodb у вас теперь есть поддержка транзакций , поэтому вы можете использовать ACID в своих операциях с базой данных, чтобы манипулировать всей этой информацией можно было атомарным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...