Моделирование реляционных данных в Firestore с помощью Angular - PullRequest
0 голосов
/ 30 марта 2019

Мне известно, что к этой теме задано множество вопросов, но другие вопросы, похоже, не отвечают на мой вопрос, специфичный для конкретного случая.

У меня следующая структура:

Каждый пользователь через FireAuth владеет культом.Этот Культ имеет множество дополнительных данных, например, какому Богу поклоняется его Культ, и текущему действию, которое хранится.Итак, мои коллекции Firestore выглядят примерно так:

Пользователь

  • uid

  • cultid

  • ...

Культ

  • cultid

  • год

  • actionid

  • ...

Боги

  • бог

  • последователь

Действия (Это действительно происходящие действия)

  • actionid

  • preActionid

  • attackerid (cultid инициатора)

  • defenderid (cultid инициатора)

  • done (логическое значение, которое проверяет, выполнено ли это действие)

  • ...

PreActions (Это действия, которые даны, и пользователь может выбрать один изэти)

  • preActionid

  • ...

Огромная проблема для меня состоит в том, чтобы связать все это вместе.Например, мне нужно иметь возможность проверить действие current , которое выполняет культ пользователя.Моя идея заключалась в том, чтобы проверить, не является ли действие культа actionid пустым, выполнить его и найти в текущих действиях конкретный actionid, извлечь его и отобразить.Как бы я пошел на такую ​​цепь?

Мои настройки службы и firestore выглядят так, как описано в этом руководстве, поскольку я решил выбросить большую часть моего текущего кода и сделать его чистым: https://www.toptal.com/angular/state-management-in-angular-using-firebase Я полагаю, текст будет длиннымпредоставляя все дженерики и наследования, описанные там, поэтому я был бы рад, если бы вы могли кратко взглянуть на них.

Я также был бы рад любым советам с отображением моих данных в другой форме, потому что яиз-за моих привычек к SQL.

Спасибо за вашу помощь.

Я пытался отфильтровать через Frontend текущее действие, которое в итоге связалось с наблюдаемыми,Я попытался отфильтровать через backend предложения where для запросов, которые не увенчались успехом из-за отсутствия всех идентификаторов, доступных одновременно.

Редактировать: Поэтому я решил добавить код:

  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);
  }

Редактировать: чтобы поставить вопрос в ином свете: если бы у вас была такая реляционная модель, как бы вы пошли на услуги итес и т. д.?

Редактировать: Итак, я прочитал немного о форк-соединениях и копировании данных внутри firestore, что, похоже, хорошо в базах данных NoSQL, но, к сожалению, ни один из них действительно не решил мою проблему.

...