0

我有一个应用程序,其中包含人员和有关他们的注释。注释是这样的,它们可以与许多人相关(例如,注释 1 将出现在人员 1 和人员 3 上)。

我正在使用 NGRX 将我的状态保存在内存中。

现在查看 ngrx 示例应用程序,您可以获得一个很好的书籍集合示例。在那里,他们使用一个状态来保存由 bookId 索引的对象数组(用于快速检索)。

当收藏中的项目(在我的例子中是笔记)可能与许多人相关时,如何做到这一点?

我首先使用人员的 uid 对对象数组进行索引:

export interface NoteCollection {
    [uid: string]: Note[];
}

考虑:

  • 随着时间的推移会有很多笔记,因此状态数据可能会相当大
  • 为每个被引用的人创建一个笔记对象似乎是一个相当糟糕的主意(数据冗余)
  • 笔记会经常被添加/编辑/删除,所以需要最新的数据
  • 以后会涉及到离线db
  • 将整个笔记存储在状态中需要为每个访问的人员页面提供一些 .filter() 函数。随着状态的增长,这可能会变得缓慢:
 export const getPersonNotes: any = createSelector(getNotes, 
    getSelectedPerson, (notes: any, selectedPersonId: string) => {
      return notes.filter((note: Note) => note.refUid === selectedId);
    });

替代方案

  • 每次您需要与人相关的笔记时,都不要通过调用 api 来将笔记存储在 state 中

有什么建议么?替代方案感觉很奇怪,因为当一半状态不在redux中时,为什么还要使用ngrx呢?

4

1 回答 1

0

您可以执行以下操作来消除 Note 冗余问题:

interface NoteCollection {
    [noteId: string]: Note[];
}

interface PersonCollection {
    [personId: string]: Person;
}

interface Person {
    noteIds: string[];  // an array of noteIds. 
}
于 2017-06-29T00:55:05.097 回答