为规模设计ngrx商店

时间:2017-02-07 12:17:21

标签: javascript angular redux rxjs ngrx

这个问题与设计ngrx商店有关。

我有一种车站和变电站。当变电站在主屏幕中展开时,我会显示其变电站,并且一次只能扩展一个电站。

所以想到我让我的应用状态如

export interface AppState {
  public stations: { [id: string] : Station };
  public selectedStation: string;
  public substations: { [id: string] : SubStation };
}

所以基本上每次改变选定的工作站时,子系统都会通过加载操作重置indexeddb中的数据。 但是我要求将变电站移动到另一个站,这需要加载目标站的变电站;现在更容易做的是添加

public targetSubstations: { [id: string] : SubStation };

但这似乎不正确,似乎不能很好地扩展,如果我需要加载4组变电站怎么办?然后我会继续添加targetSubstations1...4吗?

所以我想到的另一种选择是

type SubstationHierarchy = {
  [stationId: string]: {
    [substationId: string]: Substation
  }
}
public substations: SubstationHierarchy;

这似乎可以很好地扩展,但我关注的是,当我们不需要一次加载每个站的所有变电站时,这将在用户每次扩展新站时完成。因此,层次结构只会增长而不会缩小。

请记住,我没有对ngrx商店可以使用多少内存进行任何适当的压力测试,并且正在开发移动设备,这是设计商店时最推荐的方法。

修改

因此我们使用pouchdb将数据异步同步到indexeddb,您可以将其视为websocket到indexeddb连接。

对于INITIAL要求 One Station有许多变电站。 用户只能在MAIN屏幕中一次查看一个Station(及其子站)

基于此我构建了我的AppState

export interface AppState {
  public stations: { [id: string] : Station };
  public selectedStation: string;
  public substations: { [id: string] : SubStation };
}

每次更改selectedStation时,我也会更改THAT站的子站。这适用于大多数情况。

问题出现在用户加载一个单独的屏幕(不是主屏幕,比如一个模态)时,他可以将变电站从selectedStation移动到目标电台。

所以我可以将我的appstate更改为

export interface AppState {
  public stations: { [id: string] : Station };
  public selectedStation: string;
  public substations: { [id: string] : SubStation };
  public targetStation: string;
  public targetSubstations: { [id: string] : SubStation };
}

现在如果我需要允许变电站复制到两个单独的目标,这将需要我做一些事情

export interface AppState {
  public stations: { [id: string] : Station };
  public selectedStation: string;
  public substations: { [id: string] : SubStation };
  public target1Station: string;
  public target1Substations: { [id: string] : SubStation };
  public target2Station: string;
  public target2Substations: { [id: string] : SubStation };
}

我想到的一个选项是像这样构建substations

type SubstationHierarchy = {
  [stationId: string]: {
    [substationId: string]: Substation
  }
}

export interface AppState {
  public stations: { [id: string] : Station };
  public selectedStation: string;
  public substations: SubstationHierarchy;
}

我现在可以为多个工作站存储多个变电站。唯一的问题是我正在为移动开发,并且具有target1,target2的PREVIOUS方法将导致更少的内存占用,因为我更换变电站,target1Substations ...每次点击不同的电台等等。但是新结构我不删除子站层次结构中的任何数据。

1 个答案:

答案 0 :(得分:0)

我为您拥有相关数据的方案所做的是将其规范化。如果有帮助的话,你可以使用像normalizr这样的库,但基本上你是在试图压缩数据,然后在你需要时将它与选择器一起拉回来。

我会做类似的事情:

export interface AppState {
  public stations: { [id: string] : Station }; // all stations
  public selectedStation: string;
  public substations: { [id: string] : SubStation }; // all substations
}

车站在哪里:

export class Station {
   id: string;
   ...
   subStationIds?: string[];
}

然后,当您需要加载工作站时,您将使用选择器将工作站与其子工作相结合,此时如果不在那里,则加载商店中的子工作站。

当谈到indexeddb和性能时,我认为这将取决于数据集的大小,缓存量等等。