Как сгладить отношения "многие ко многим" в состоянии Redux с помощью Normalizr?

сценарий

У нас есть база данных, которая отображает следующие отношения:

  • tag имеет много campaigns
  • campaign имеет много tags
  • Отношение между campaigns а также tags представлена ​​ассоциативной сущностью, называемой campaign_tag
  • campaign_tag сущность имеет priority атрибут

Вопрос

Как мы можем реализовать normalizr (или любую подобную библиотеку) для генерации сплющенного состояния приложения, которое учитывает наши ассоциативные объекты, когда наши ассоциативные объекты не имеют уникальных идентификаторов / значений?

Примечания / Разные мысли

В других примерах, которые я видел, были сопоставлены только исходные объекты, и они лучше подходят для отношений один-ко-многим или один-к-одному. Они обычно производят дерево состояний, такое как это:

{
  entities: {
    campaigns: {
      '1': { id: 1, name: 'Ace', tags: [1, 2, 3] },
      ...
    },
    tags: {
      '1': { id: 1, name: 'Example Tag', campaigns: [1, 2, 3] },
      ...
    }
  },
  ...
}

Будут ли наши ассоциативные образования entities группа? Должны ли мы просто добавить уникальные идентификаторы? Это кажется контрпродуктивным. Уместно ли даже выравнивать такие отношения?

Любая помощь приветствуется, спасибо.

1 ответ

Сценарии:

  1. Вы управляете API: я буду отправлять такие объекты:

    campaigns: [{
      id: <id>,
      name: <name>,
    }],
    tags: [{ id: <id>, name: <name> }],
    campaign_tags: [{campaign_id, tag_id, priority}]
    

    Так что этим будет легко управлять и избежать дублирования информации. Когда вы монтируете свой компонент с помощью redux connect, вы можете создать селектор, чтобы заполнить теги вашей кампании, чтобы добавить в свойства вашего компонента.

  2. Вы не контролируете API. В этом случае мне нужно знать, какой тип ответа вы получаете от сервера, чтобы что-то порекомендовать.

Другие вопросы по тегам