Как лучше всего получить все комментарии для данной комнаты чата в Firebase в Интернете? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть приложение Firebase в реальном времени с чатами и комментариями.Комментарий принадлежит одному чату, а в чате может быть много комментариев.Я хотел бы получить только комментарии для данной комнаты, но сейчас я могу получить только все из них.

Каждый раз, когда комментарий сохраняется, я также сохраняю его идентификатор в комнате, в которуюЭто пренадлежит.Таким образом, в каждой комнате есть список идентификаторов комментариев.Я могу получить список идентификаторов комментариев в чате, используя chatRooms/${id}/commentIds.

// data structure is basically like this:
chatRooms: {
    ROOMID123: {
        title: "Room A",
        commentIds: {
            COMMENTIDABC: true,
            COMMENTIDXYZ: true
        }
    }
},
comments: {
    COMMENTIDABC: {
        message: "some message",
        parentRoomId: ROOMID123
    },
    COMMENTIDXYZ: {
        message: "Another message",
        parentRoomId: ROOMID123
    }
}

Я могу получить идентификаторы комментариев для данной комнаты на основе идентификатора комнаты, например:

firebase.database().ref(`chatRooms/${chatRoomId}/commentIds`).on('value', 
    snapshot => {
        const commentsObject = snapshot.val();
        const commentIdsList = Object.keys(commentsObject);
    });

Было бы лучше для меня

а) использовать этот список commentIds, чтобы получить только комментарии для данной комнаты?Если да, то какой запрос мне следует использовать?

b) использовать идентификатор chatRoom для получения каждого комментария с совпадающим parentRoomId?Если это так, я не знаю, как это сделать, несмотря на то, что вы прочитали документы.

Спасибо!

1 Ответ

2 голосов
/ 13 апреля 2019

Я бы предложил третий вариант: хранить комментарии для каждой комнаты чата в отдельном родительском узле. Так что-то вроде:

commentsPerRoom: {
  ROOMID123: {
    COMMENTIDABC: {
        message: "some message",
    },
    COMMENTIDXYZ: {
        message: "Another message",
    }
  }
}

С помощью приведенной выше структуры вы можете получить комментарии для конкретной комнаты с помощью одного прямого поиска:

firebase.database().ref(`commentsPerRoom/${chatRoomId}`).on('value', 

Причины, по которым я бы использовал эту структуру данных поверх текущей:

  • Хранение комментариев в виде единого списка означает, что вам придется запрашивать этот список. И хотя база данных Firebase Realtime достаточно хорошо масштабируется, запросы на данные всегда будут иметь пределы масштабируемости. Вот почему приведенная выше структура данных позволяет осуществлять прямой поиск вместо запроса запроса.
  • Загрузка отдельных комментариев через идентификаторы комментариев также возможна, и не так медленно, как думают некоторые разработчики, из-за того, что Firebase передает запросы по одному соединению . Но здесь это кажется ненужным, так как комментарии уже имеют сильную связь 1: n с комнатой, к которой они принадлежат. Каждый комментарий относится только к одной комнате, поэтому вы также можете смоделировать эту взаимосвязь в том, как вы структурируете данные, и сохранить все поиски.
  • Получение комментариев для определенной комнаты является наиболее распространенным вариантом использования, и эта структура данных позволяет использовать этот вариант наиболее эффективно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...