使用Angular在Firestore中建模关系数据

时间:2019-03-30 18:50:56

标签: angular typescript google-cloud-firestore entity-relationship

我知道这个主题有很多问题,但是其他问题似乎无法回答我的特定案例。

我具有以下结构:

每个通过FireAuth的用户都拥有一个崇拜。该邪教拥有更多的数据,例如他的邪教正在向哪个神敬拜,以及当前的动作已存储。 因此,我的Firestore收藏集如下所示:

用户

  • uid

  • 栽培种

  • ...

崇拜

  • 栽培种

  • 上帝

  • actionid

  • ...

  • 上帝

  • 关注者

动作(这些实际上是正在发生的动作)

  • actionid

  • preActionid

  • 攻击者(发起者的品种)

  • defenderid(发起者的品种)

  • 完成(布尔值,它检查此操作是否已完成)

  • ...

PreActions (这些是给出的操作,用户可以选择 其中之一)

  • preActionid

  • ...

对我来说,最大的问题是将所有这些链接在一起。例如,我需要能够检查用户崇拜正在执行的当前动作。我的想法是,要检查邪教的actionid是否不为空,请使用该变量并在当前操作中搜索特定的actionid,将其检索并显示。我将如何去做这样的连锁店?

我的服务和Firestore设置类似于本教程中的描述,因为我决定丢弃大部分当前代码并使其干净: https://www.toptal.com/angular/state-management-in-angular-using-firebase 我想这将使文本能够长期提供此处描述的所有泛型和继承,因此,如果您可以对其中进行简短的介绍,我将很高兴。

对于以不同形状显示数据的任何提示,我也将感到高兴,因为由于我的SQL习惯,我倾向于使其与数据之间具有高度的关联性。

谢谢您的帮助。

我尝试通过Frontend过滤当前操作,最终使Observable陷入混乱,我尝试通过backwhere过滤查询的where子句,由于缺少所有ID,该查询未能成功同时。

编辑:所以我决定可以添加一些代码:

  export abstract class FirestoreService<T> {
  protected abstract basePath: string;

  constructor(@Inject(AngularFirestore) protected firestore: AngularFirestore) {}

  doc$(id: string): Observable<T> {
    return this.firestore.doc<T>(`${this.basePath}/${id}`).valueChanges().pipe(
      tap(r => {
        if (!environment.production) {
          console.groupCollapsed(`Firestore Streaming [${this.basePath}] [doc$] ${id}`);
          console.log(r);
          console.groupEnd();
        }
      })
    );
  }

  collection$(queryFn?: QueryFn): Observable<T[]> {
    return this.firestore.collection<T>(`${this.basePath}`, queryFn).valueChanges().pipe(
      tap(r => {
        if (!environment.production) {
          console.groupCollapsed(`Firestore Streaming [${this.basePath}] [collection$]`);
          console.table(r);
          console.groupEnd();
        }
      }),
    );
  }


export abstract class StoreService<T> {
  protected bs: BehaviorSubject<T>;
  state$: Observable<T>;
  state: T;
  previous: T;

  protected abstract store: string;

  constructor(initialValue: Partial<T>) {
    this.bs = new BehaviorSubject<T>(initialValue as T);
    this.state$ = this.bs.asObservable();

    this.state = initialValue as T;
    this.state$.subscribe(s => {
      this.state = s;
    });
  }

  patch(newValue: Partial<T>, event: string = 'Not specified') {
    this.previous = this.state;
    const newState = Object.assign({}, this.state, newValue);
    if (!environment.production) {
      console.groupCollapsed(`[${this.store} store] [patch] [event: ${event}]`);
      console.log('change', newValue);
      console.log('prev', this.previous);
      console.log('next', newState);
      console.groupEnd();
    }
    this.bs.next(newState);
  }

编辑:换句话说:如果您有这样的关系模型,您将如何寻求服务和状态等?

编辑:因此,我已经阅读了一些有关fork连接和在firestore中复制数据的知识,这在NoSQL数据库中似乎还不错,但是不幸的是,这些方法都没有真正解决我的问题。

0 个答案:

没有答案