Монго БД дизайн с вложенным документом - PullRequest
0 голосов
/ 29 декабря 2018

Я хотел бы получить совет по передовому опыту в отношении разработки схемы 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 сотни).

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