Я хотел бы получить совет по передовому опыту в отношении разработки схемы MongoDB.Я создаю менеджера проекта.Я хочу, чтобы пользователи могли создавать задачи, и эта задача была связана с фазой проекта.Я имею в виду 2 дизайна с плюсами и минусами:
Первый дизайн:
const ProjectSchema: new Schema ({
...
phases: [{
phase_id: String,
name: String,
status: String,
startDate: Date,
endDate: Date,
tasks: [{
task_id: String,
title: String,
description: String,
completed: { type: Boolean, default: 'false' },
...
}],
}]
...
});
Здесь преимущество в том, что у меня есть задачи за фазу, поэтому, если вы хотите, чтобы все задачи выполнялисьФаза запроса займет меньше времени, так как мне не придется фильтровать каждый раз, когда я хочу задачи определенной фазы.Однако, если мне нужно запросить все задачи проекта, мне нужно пройти все этапы, а затем получить задачи, которые выполняют 2 запроса.
Другой дизайн:
const ProjectScema: new Schema ({
...
phases: [{
phase_id: String,
name: String,
status: String,
startDate: Date,
endDate: Date,
...
}],
tasks: [{
task_id: String,
title: String,
description: String,
completed: { type: Boolean, default: 'false' },
phase: { id: mongoose.Types.ObjectId, name: String },
...
}],
...
});
В этом случае легче получить все задачи, которые назначены в проекте, но если я хочу, чтобы все задачи были выполнены на одном этапе, мне придется отфильтровать массив задач.
В обоих случаях, еслиУ меня есть последовательное количество задач, запросы могут быть медленными.Есть ли лучший дизайн, который я могу использовать?
Другим решением было бы иметь задачи в другой коллекции и ссылки на задачи в фазах:
const TaskSchema: new Schema({
task_id: String
title: String,
description: String,
startDate: Date,
endDate: Date,
project_id: String,
phase_id: String,
...
});
TaskSchema.index({ task_id: 1 });
TaskSchema.index({ project_id: 1 });
const Task = mongoose.model('Task', TaskSchema);
И в проектеshcema:
const ProjectScema: new Schema ({
project_id: String,
...
phases: [{
phase_id: String,
name: String,
status: String,
startDate: Date,
endDate: Date,
tasks: [{
type: Schema.Types.ObjectId,
ref: 'Task'
}],
...
}]
...
});
Таким образом, я могу запросить все задачи проекта благодаря индексу или получить все задачи фазы благодаря заполнению.Я не знаю, какое решение лучше всего использовать, зная, что я буду читать и писать задачи и фазы довольно часто, и что возможно иметь большое количество фаз и задач (1-2 сотни).