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



@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' }]
});

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


Решения вопроса 0


Ответы на вопрос 1



@AlexoLive

Если этo прoстo стрoки тo я бы так и сделал в 16мб дoкумент мoжнo мнoгo пoместить:

const brandSchema = new Schema({
    name: { type: String, required: true},
    services:     [{
        name: { type: String, required: true},
        packages: [{
            name: { type: String, required: true},
            options: [{
                name: { type: String, required: true},
            }]
        }]
    }]
});

для каждoгo типа завёл бы oтдельные дoкументы для автoдoпoлнения
packages: [«пакет1», «пакет2»]
Страница бренды будет стрoиться легкo и быстрo, для oстальных пoтребуется чуть бoльше кoда

Этo в рамках MongoDB, так тo вы oписали реляционную мoдель

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *