在哪里处理标准化数据?

时间:2019-03-19 12:08:56

标签: reactjs firebase redux

在我的数据库中,存储树结构的最有效方法是将子级作为键,并且将其作为父级值:

database: {
  "cars": "objects",
  "objects": false,
  "electronics": "objects",
  "Honda": "cars",
  "BMW": "cars,
  "Samsung": "electronics",
  "Apple": "electronics"
}

数据库可以包含数千个孩子。

但是我需要以相反的方式使用它们,所以:

reversed: {
  "objects": ["electronics", "cars"],
  "electronics": ["Samsung", "Apple"],
  "Samsung": [],
  "Apple": [],
  "cars": ["Honda", "BMW"],
  "Honda": [],
  "BMW": []
}

列表中的每个元素都将是一个JSX元素,并将呈现自身,因为它是递归的子元素(例如state.elements具有上述结构)。

const mapStateToProps = (state, ownProps) => {
  const children = state.elements[ownProps.id];

  return { children };
}

如果我将规范化的数据存储在redux中,并在mapStateToProps中进行处理,如果我们有成千上万的元素,它将在mapStateToProps中进行数千次处理,即使使用选择器,我也认为效率不高。

我们可以得到已经以相反方式处理的响应,但这会导致问题。如果我们要更改元素的父级,则需要获取当前父级,过滤其子级以排除目标元素,然后将其推入新的父级。

在规范化的结构中,我们只需要引用子代ID,并将其值设置为新的父代。因此,在规范化结构中修改数据要容易得多,但是在反向结构中修改数据要好得多。

(我认为)有三种方法:

  • 将两个结构都存储在redux中(reducer反转)
  • 将规范化的结构存储在redux中,并在mapStateToProps中将其反转
  • 存储刚刚反转的数据,并在更改后将其转换回规范化

这三种方法都有优点和缺点,但是最有效的方法是什么?

PS:我正在使用Firebase作为数据库,并且有子事件侦听器,在该子侦听器中分配了数据。

0 个答案:

没有答案