Многопользовательская структура данных чата в базе данных Firebase - PullRequest
0 голосов
/ 07 сентября 2018

Мне трудно понять, как правильно структурировать архитектуру чата FirebaseDatabase.

В основном, приложение поддерживает личные сообщения между пользователями (может быть между 2 пользователями или несколькими пользователями). Если бы это было только между двумя пользователями, структура данных на самом деле довольно проста.

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

Итак, вот идея, скажем, пользователь выбирает другую, чтобы начать чат. Я думал о чем-то вроде этого:

enter image description here

enter image description here

Проблема, с которой я сталкиваюсь, заключается в поддержании этого chatId. Каждый раз, когда пользователь собирается отправить новое сообщение, как я могу проверить, существует ли уже чат с тем же получателем (или получателями) на основе chatId. Это запутанная часть для меня. Я застрял на этом уже несколько дней и не могу найти правильный способ сохранить этот chatId и правильно его запросить. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 сентября 2018

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

Начнем с узла пользователя

users
  uid_0
    name: "Bill"
    chats:
      chat_id_0: true
      chat_id_9: true
  uid_1
    name: "Jesse"
    chats:
      chat_id_0: true
      chat_id_6: true
  .
  .
  .

и затем упрощенный узел чатов

chats
   chat_id_0:
     uid_0: "Hey there, Jesse"
     uid_1: "Sup Bill?"
   chat_id_6:
     uid_0: "This is Bill, anyone around?"
   chat_id_9:
     uid_1: "Look ma, no hands"
     uid_7: "Impressive"

В приведенном выше примере chat_id_x создается с помощью .childByAutoId, когда пользователь запускает чат.

Когда Билл входит в систему (uid_0), прочитайте его узел чатов, а затем добавьте наблюдателей в чаты, перечисленные в этом узле. В этом случае Билл является частью chat_id_0 и chat_id_9. Сделайте то же самое для Джесси, который является частью 0 и 6.

И Билл, и Джесси ведут чат в chat_id_0, Билл ожидает ответа от всех пользователей, также просматривающих chat_id_6, а Джесси беседует с uid_7 в chat_id_9.

Оттуда в любое время, когда есть событие (например, .childAdded, когда в чат добавляется новое сообщение), только те пользователи, которые наблюдают за этим чатом («подписались»), получат событие.

Очевидно, что более подробная информация будет включена в каждый узел чата (отметка времени и т. Д.)

как проверить, есть ли уже чат с тем же получателем (или получателей) на основе chatId

Есть несколько способов справиться с этим;

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

Второй вариант - запросить все чаты, в которых отображается пользовательский uid (запрос с использованием .observeSingleEvent). Это вернет все чат-узлы, к которым они принадлежат, и затем получит uid того, с кем они еще общаются, и идентификатор чата.

Другой вариант - при создании чата / chat_id_0 добавить дочерний узел с именем / who_dat, в котором хранится список приглашенных в чат

chats
  chat_id_0
     who_dat
        uid_0: true
        uid_1: true
        uid_2: true
     messages:
        uid_0: "Hey there, Jesse"
        uid_1: "Sup Bill?"

в этом случае uid_2 также был добавлен в chat_id_0, но пока не слышал о них.

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