这个问题与设计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 ...每次点击不同的电台等等。但是新结构我不删除子站层次结构中的任何数据。
答案 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和性能时,我认为这将取决于数据集的大小,缓存量等等。