You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ngrx中处理复杂对象同时维护实体间的关联关系?

数据结构示例

方案说明

你当前的单reducer实现确实不合理,嵌套结构下的实体操作逻辑全部耦合在一个文件内,后续迭代、问题排查的成本会持续走高。
拆分不同实体的独立reducer不会丢失关联关系,采用范式化存储即可完美解决这个问题,具体实现逻辑如下:

  • 按实体类型拆分独立reducer,每个reducer仅存储同类型实体,采用{ [实体ID]: 实体详情 }的对象结构存储,比如分别创建projects、technologies、dataObjects三类reducer,各自处理对应实体的增删改逻辑。
  • 实体间的从属关系仅通过ID引用关联,不需要存储完整嵌套对象,比如project下关联的technology只存储technology的ID数组,technology下关联的dataObject也仅存储ID数组,不存在数据冗余。
  • 需要使用嵌套结构的关联数据时,通过选择器(例如Redux生态的reselect工具)按需将分散的实体数据组装为业务需要的嵌套结构,选择器自带结果缓存能力,不会产生额外的性能损耗。

示例对比

原嵌套存储结构:

{
  projects: [
    {
      id: "proj_001",
      name: "测试项目",
      technologies: [
        {
          id: "tech_001",
          name: "接口服务",
          dataObjects: [
            { id: "obj_001", name: "用户表" }
          ]
        }
      ]
    }
  ]
}

范式化拆分后的存储结构:

// projects reducer 存储内容
{
  proj_001: { id: "proj_001", name: "测试项目", techIds: ["tech_001"] }
}

// technologies reducer 存储内容
{
  tech_001: { id: "tech_001", name: "接口服务", dataObjIds: ["obj_001"] }
}

// dataObjects reducer 存储内容
{
  obj_001: { id: "obj_001", name: "用户表" }
}

该方案的优势十分明确:

  1. 各reducer逻辑独立,代码拆分清晰,不会出现单文件过度臃肿的问题,后续新增实体类型仅需新增对应reducer即可,扩展性极强
  2. 所有实体仅存一份源数据,更新时无需同步修改多处嵌套位置,天然保证关联关系一致性,不会出现数据不同步的问题
  3. 实体级的操作逻辑无需遍历深层嵌套结构,性能远高于直接修改嵌套state

内容的提问来源于stack exchange,提问作者TyCy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:39:01