如何在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: "用户表" } }
该方案的优势十分明确:
- 各reducer逻辑独立,代码拆分清晰,不会出现单文件过度臃肿的问题,后续新增实体类型仅需新增对应reducer即可,扩展性极强
- 所有实体仅存一份源数据,更新时无需同步修改多处嵌套位置,天然保证关联关系一致性,不会出现数据不同步的问题
- 实体级的操作逻辑无需遍历深层嵌套结构,性能远高于直接修改嵌套state
内容的提问来源于stack exchange,提问作者TyCy
相关产品推荐
相关产品推荐

