@nazar-lynovetsky

Как правильно связать «лестничный» набор данных?

Есть следующий набор данных:
1. Бренд (Бренды предоставляющие сервисы. Один бренд может иметь много сервисов.)
2. Сервисы (Сервисы представляющиеся брендами. Один сервис может принадлежать к нескольким брендам. Один сервис может иметь несколько пакетов услуг.)
3. Пакеты (Пакеты услуг входящие в сервис. Один пакет может принадлежать нескольким сервисам. Каждый пакет может иметь много Опций.)
4. Опции (Опции входящие в пакет услуг. Одна опция может принадлежать нескольким Пакетам.)
То есть ситуация такая:
1. Бренд - Сервис (один ко многим)
2. Сервис - Пакеты (многие ко многим)
3. Пакеты - Опции (многие ко многим)
В приложении есть страница "Бренда", на которой нужно построить полную цепочку связей сверху в низ:
1. Инфо о бренде
2. Какие сервисы содержит этот бренд
3. Какие пакеты содержат сервисы у этого бренда
4. Какие опции содержат пакеты, которые содержат сервисы этого бренда.
И наоборот, есть страница "Опции", которая должна описывать всю лестницу связей с низу вверх:
1. Какие пакеты содержат эту опцию
2. Какие сервисы содержат пакеты, содержащие эту опцию.
3. Какие бренды содержат сервисы у которых есть пакеты с этой опцией.
То есть лестничная структура связей:
Бренд -> Сервисы -> Пакеты -> Опции;
Планирую использовать ссылки на Модели таким образом:
const brandSchema = new Schema({
    name:         { type: String, required: true},
    services:     [{ type: mongoose.Types.ObjectId, ref: 'Service' }]
});

const serviceSchema = new Schema({
    name:         { type: String, required: true},
    brands:       [{ type: mongoose.Types.ObjectId, ref: 'Brand' }],
    packages:   [{ type: mongoose.Types.ObjectId, ref: 'Package' }]
});

const packageSchema = new Schema({
    name:         { type: String, required: true},
    services:     [{ type: mongoose.Types.ObjectId, ref: 'Service' }],
    options:      [{ type: mongoose.Types.ObjectId, ref: 'Option' }]
});

const optionSchema = new Schema({
    name:         { type: String, required: true},
    packages:   [{ type: mongoose.Types.ObjectId, ref: 'Package' }]
});

То есть вытащить ближайшие (соседние) связи. Например, по ссылкам в Модели "Пакета" можно найти к каким сервисам он принадлежит и какие "Опции" имеет этот пакет. Если явно указать ссылки на эти типы в модели Пакета:
const packageSchema = new Schema({
    name:         { type: String, required: true},
    services:     [{ type: mongoose.Types.ObjectId, ref: 'Service' }],
    options:      [{ type: mongoose.Types.ObjectId, ref: 'Option' }]
});

Как узнать: "К какому бренду принадлежит конкретная опция?" То есть, как последняя абстракция данных в цепочках соотносится с первой? БРЕНД --> ПАКЕТ или ПАКЕТ --> БРЕНД Как хранить эти связи? Есть операторы для этих целей Или нужно на клиенте реализовывать эту логику Геттерами из своего локального состояния?
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы