如何使用Normalizr在Redux状态下展平多对多关系?

时间:2016-07-21 00:39:55

标签: reactjs redux normalizr

方案

我们有一个映射以下关系的数据库:

  • tag有许多campaigns
  • campaign有许多tags
  • campaignstags之间的关系由名为campaign_tag
  • 的关联实体表示
  • campaign_tag实体具有priority属性

问题

当我们的关联实体没有唯一的ID /值时,我们如何实现normalizr(或任何类似的库)来生成一个应用于关联实体的展平应用状态?

Notes / Misc Thoughts

我见过的其他例子只有原始实体被映射出来,看起来更适合一对多或一对一的关系。他们通常会生成如下的状态树:

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

我们的关联实体会进入entities组吗?我们应该只添加唯一ID吗?这似乎适得其反。是否适合平息这种关系?

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

方案:

  1. 您可以控制API:我会发送这样的对象:

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

    因此,这将易于管理并避免重复信息。使用redux connect挂载组件时,您可以创建一个选择器来填充广告系列代码,以添加到组件的属性中。

  2. 您无法控制API。在这种情况下,我需要知道从服务器获取什么类型的响应以便推荐。