какое решение лучше всего подходит для работы с базой данных MongoDB NoSQL

#angular #typescript #mongodb

Вопрос:

У меня есть две идеи, но я не знаю, какое из них является лучшим решением. ПЕРВЫЙ Сценарий:

РЕДАКТИРОВАТЬ: размер ингредиентов может составлять 2000/3000 предметов

одна структура данных, подобная этой:

 export const ingredients = [
    {
        id       : '8f011ac5-b71c-4cd7-a317-857dcd7d85e0',
        title    : 'Strawberry',
        content  : 'Strawberry',
        allergens: ['20b9-44d9-f47c92e5-917f-9ff4ad25df00'],
        image    : 'assets/images/cards/fragola.jpg',
        labels   : ['e2f749f5-41ed-49d0-a92a-1c83d879e371'],
        status   : 'public',
        owner    : 'admin',
        favorites : false,
        createdAt: moment().hour(10).minute(19).subtract(98, 'day').toISOString(),
        updatedAt: null
    },
    {
        id       : 'ced0a1ce-051d-41a3-b080-e2161e4ae621',
        title    : 'Choccolate Mix',
        content  : 'Choccolate Mix',
        allergens: ['20b9-44d9-f47c92e5-917f-9ff4ad25df00'],
        image    : '',
        labels   : [
            'bbc73458-940b-421c-8d5f-8dcd23a9b0d6',
            'b1cde9ee-e54d-4142-ad8b-cf55dafc9528'
        ],
        status   : 'public',
        owner    : 'admin',
        favorites : false,
        createdAt: moment().hour(15).minute(37).subtract(80, 'day').toISOString(),
        updatedAt: null
    },
 


 export const allergens = [
    {
        id   : '20b9-44d9-f47c92e5-917f-9ff4ad25df00',
        name: 'Dairy',
        status: true,
        image: 'assets/icons/allergens/00_ic_allergen_DairyProducts.svg'
    },
    {
        id   : '20b9-44d9-f47c92e5-917f-9ff4ad25df01',
        name: 'Egg',
        status: true,
        image: 'assets/icons/allergens/01_ic_allergen_Egg.svg'
    },
 


где в массиве ингредиентов указан только идентификатор аллергена ингредиента

ВТОРОЙ Сценарий:

 export const ingredients = [
    {
        id       : '8f011ac5-b71c-4cd7-a317-857dcd7d85e0',
        title    : 'Strawberry',
        content  : 'Strawberry',
        allergens: allergens: [
        {gluten:                {checked: false,
            image: 'assets/icons/allergens/02_ic_allergen_Gluten.svg'
            types: [
                {wheat:         {checked: false}},
                {spelt:         {checked: false}},
                {khorasan:      {checked: false}},
                {rye:           {checked: false}},
                {barley:        {checked: false}},
                {oats:          {checked: false}},
        ]}},
        {shellfish:             {checked: false, image: 'assets/icons/allergens/11_ic_allergen_Crustaceans.svg'}},
        {eggs:                  {checked: false, image: 'assets/icons/allergens/01_ic_allergen_Egg.svg'}},
        {fish:                  {checked: false, image: 'assets/icons/allergens/13_ic_allergen_Fish.svg'}},
        {peanut:                {checked: false, image: 'assets/icons/allergens/05_ic_allergen_Peanuts.svg'}},
        {soyabeans:             {checked: false, image: 'assets/icons/allergens/04_ic_allergen_Soy.svg'}},
        {milk:                  {checked: false, image: 'assets/icons/allergens/00_ic_allergen_DairyProducts.svg'}},
        {nuts:                  {checked: false,
            image: 'assets/icons/allergens/03_ic_allergen_PeelFruits.svg'
            types: [
                {almond:        {checked: false}},
                {hazelnuts:     {checked: false}},
                {walnuts:       {checked: false}},
                {cashewnuts:    {checked: false}},
                {pecans:        {checked: false}},
                {brazilnuts:    {checked: false}},
                {macadamianuts: {checked: false}},
                {pistachios:    {checked: false}}
        ]}},
        {celery:                {checked: false, image: 'assets/icons/allergens/10_ic_allergen_Celery.svg'}},
        {mustard:               {checked: false, image: 'assets/icons/allergens/09_ic_allergen_Mustard.svg'}},
        {sesame:                {checked: false, image: 'assets/icons/allergens/08_ic_allergen_SesameGrains.svg'}},
        {sulfites:              {checked: false, image: 'assets/icons/allergens/06_ic_allergen_Sulphites.svg'}},
        {lupini:                {checked: false, image: 'assets/icons/allergens/07_ic_allergen_Lupins.svg'}},
        {clams:                 {checked: false, image: 'assets/icons/allergens/12_ic_allergen_Mollusks.svg'}}
    ],
        image    : 'assets/images/cards/fragola.jpg',
        labels   : ['e2f749f5-41ed-49d0-a92a-1c83d879e371'],
        status   : 'public',
        owner    : 'admin',
        favorites : false,
        createdAt: moment().hour(10).minute(19).subtract(98, 'day').toISOString(),
        updatedAt: null
    },
 

для каждого ингредиента у меня есть полная структура аллергена ингредиента.
Я создаю одно приложение в Angular с серверной частью в узле с подключением REST API, но в будущем я хотел бы переписать серверную часть с помощью API GraphQL.
Спасибо за ваши предложения.

Комментарии:

1. каков размер allergens полей ?

2. Я редактирую свой вопрос, размер ингредиентов может составлять 2000/3000 наименований, поэтому для каждого ингредиента может быть 2/3/4 аллергена максимум, как правило

3. получение полного объекта ингредиента с аллергеном в объекте , если весь аллерген будет в ингредиенте для сбора данных, я думаю, что производительность выше, чем у объекта отношения, но если вы хотите переключиться на GraphQL для разработки схемы, я думаю, что реляционная проще

4. по своей интуиции я бы выбрал первое решение