Путаница NGRX в том, как реализовать массив массивов

Я действительно новичок в NGRX и управлении состоянием. Я успешно реализовал свой первый ключ состояния, используя сущность и селекторы. Он загружает все с фасадом и эффектом в состояние с ключом containers. Хотя я пытаюсь понять, как управлять массивом внутри этого первого загруженного массива объектов, у которых есть дополнительный массив. Должен ли это быть новый ключ состояния projections или я могу управлять им из первого загруженного массива.

У меня есть два разных запроса graphql для тестирования. Один возвращает только контейнеры без projections, а другой с projections.

export const selectContainersLoaded = createSelector(
  getFeatureState,
  state => state.loaded
)

export const loadContainersSuccess = createAction(
  '[Container] Load Containers Success',
  props<{ payload: Container[] }>()
);

//without
{
  containers: {
    ids: [
      '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    ],
    entities: {
      '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx': {
        __typename: 'Container',
        id: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
        name: 'Black Chevy',
        description: 'Some testing description',
        projections: {
          __typename: 'ModelProjectionConnection',
          nextToken: null
        },
      }
    },
    loaded: true
  }
}

//with
{
  containers: {
    ids: [
      '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    ],
    entities: {
      '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx': {
        __typename: 'Container',
        id: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
        name: 'Black Chevy',
        description: 'Some testing description',
        projections: {
          __typename: 'ModelProjectionConnection',
          items: [
            {
              __typename: 'Projection',
              id: '0000002-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
              containerId: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
              name: 'testing projection'
            },
            {
              __typename: 'Projection',
              id: '0000003-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
              containerId: '0000001-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
              name: 'another testing projection'
            }
          ]
        }
      }
    },
    loaded: true
  }
}

Из того, что я думаю, я читаю, так это то, что состояние должно быть сглажено и имитировать структуру базы данных, поэтому projections является отдельной таблицей, тогда это будет означать другой ключ состояния для projections. Но тут я в замешательстве. Если бы я хотел перечислить в представлении все контейнеры и под ними все проекции, как мне это соотнести? Я поиграл с идеей, что, возможно, проекции не должны быть отдельной таблицей через именованное соединение и просто массивом в контейнерах. Я также рассматривал использование селекторов внутри селекторов, но еще не понял этого. Что мне здесь не хватает? Я хочу иметь возможность самостоятельно обновлять проекцию, а контейнеру не обязательно иметь проекцию. Возможно, это слишком сложно с двумя разными таблицами, и было бы лучше использовать вспомогательные функции сущности для управления массивом внутри объекта. Но это просто заставляет меня задаться вопросом, как в более широком сценарии можно было бы добиться чего-то подобного.

state => {
  containers,
  projections
}

Если у вас есть примеры кода отношений «один ко многим» и, возможно, отношений «многие ко многим», которые сопоставляются с состоянием, было бы здорово. Я пытался посмотреть другие проекты кода на github, но я не нашел то, что, по моему мнению, ищу, даже если я не знаю или не понимаю, что я ищу.


person lumberjacked    schedule 29.08.2020    source источник