Получить события пользователя с Firebase (многие ко многим отношениям) - PullRequest
0 голосов
/ 23 июня 2019

Я - Front-End Developer и впервые использую Firebase для создания приложения.Я прочитал некоторую документацию / статьи и посмотрел это интересное видео о внешних ключах (отношения многих ко многим): https://www.youtube.com/watch?v=ran_Ylug7AE&list=PLl-K7zZEsYLlP-k-RKFa7RyNPa9_wCH2s&index=2.

Я пытаюсь применить этот подход для извлечения событий для конкретного пользователя.В идеале я хочу получить эту информацию, не запрашивая / не оплачивая слишком много данных.Во-первых, вот как я настраивал следующую структуру базы данных (см. Видео):

{
  users:
    "abc": {
      firstname: "Maxime",
      ...
    },
    "def": {
      firstname: "John",
      ...
    },
  },
  events: {
    "eventAbc-": {
      title: "Some great event",
      ...
    },
    "eventDef": {
      title: "Another great event",
      ...
    } 
  },
  eventAttendees: {
    "eventAbc": {
      abc: true,
      def: true,
    },
    "eventDef": {
      abc: true,
    } 
  }
}

Чтобы получить события пользователя, у меня есть следующее, что на самом деле работает:

getEvents(userId) {
  const self = this;
  const query = firebase.firestore().collection('eventAttendees');
  var promises = [];
  query.onSnapshot(function(snap) {
    snap.docs.forEach(doc => {
      const data = doc.data();
      if (data[userId]) {
        // user has been invited to this event
        promises.push(self.getEvent(doc.id));
      }
    });
    Promise.all(promises).then((results) => {
      console.log("All events");
      console.log(results);
    });
  });
}

getEvent(eventId) {
  return new Promise((resolve) => {
    const query = firebase.firestore()
    .collection('events')
    .doc(eventId);
    query.onSnapshot(function(snap) {
      resolve(snap.data());
    });
  });
}

getEvents('abc');

Вопросы

  1. Я не думаю / не знаю, есть ли у меня правильный и оптимизированный подход?Любая документация / Github проект, который я должен рассмотреть в качестве ссылки?
  2. Что произойдет, если abc был приглашен на 1 миллион событий?Я чувствую, я зацикливаюсь и нужно обрабатывать нумерацию страниц из коробки.Есть ли лучший способ?
  3. Предположим, что каждое событие имеет много информации (подробности).Однако на главной странице мне просто нужно отобразить основную информацию (название события, дата события).Где я должен хранить это, чтобы не загружать много информации.

Надеюсь, найдется время, чтобы ответить на мои вопросы. Спасибо .

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Спасибо, что нашли время ответить на мои вопросы. Действительно, мне нравится этот видео-сериал, и я с нетерпением жду того, который вы порекомендовали, который кажется более свежим.

Я согласен с вами и определенно хочу загружать только то, что нужно. На данный момент у меня не так много данных, поэтому мне сложно это представить / предвидеть. Возможно, мне следовало воспользоваться преимуществами .limit (10) или .startAt () в функции getEvents?

Я не знаком с базой данных в целом и не знаю, где у меня должно быть подмножество данных для каждого события? Это то, что вы бы назвали начальным представлением списка? Для моего примера это правильное место? Если нет, то где бы это поставить?

eventAttendees: {
  "eventAbc": {
    title: "Some great event",
    eventDate: "",
    moreKeyInformation: "",
    abc: true,
    def: true,
  },
  "eventDef": {
    title: "Another great event",
    eventDate: "",
    moreKeyInformation: "",
    abc: true,
  } 
}
0 голосов
/ 23 июня 2019

Вы, кажется, смотрите замечательный видео-сериал Дэвида Firebase для разработчиков SQL , который был написан для базы данных Firebase Realtime. Поскольку ваш код использует API Cloud Firestore, я бы порекомендовал перейти на серию Todd Знакомство с Cloud Firestore , которая содержит аналогичную информацию и многое другое, но затем адаптирована для Firestore.

Что произойдет, если 'abc' был приглашен на 1 миллион событий?

Ни один пользователь никогда не будет смотреть эти миллионы событий. Так что не загружайте их. Подумайте, сколько элементов реально увидит пользователь, а затем загрузите их. Как правило, это будет один или несколько экранов. Если вы думаете, что они могут захотеть загрузить больше, позвольте им загрузить новую страницу. Поиск Firebase и нумерация страниц, чтобы увидеть много вопросов по этой теме.

Предположим, у каждого события много информации (подробностей). Однако на главной странице мне просто нужно отобразить основную информацию (название события, дата события). Где я должен хранить это, чтобы не загружать много информации.

Вы должны загружать только те данные, которые вам нужны. Если вам нужно подмножество данных для каждого события в начальном представлении списка, создайте отдельный узел или коллекцию, содержащую только эту информацию для каждого события. Да, вы действительно дублируете данные таким образом, но это вполне нормально для баз данных NoSQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...