Структура БД для обработки групп чатов, аналогичных Telegram / FB Messenger

1

В настоящее время приложение чата, где пользователь может присоединиться к нескольким чат-группам, что-то похожее на то, что Telegram и Facebook Messenger есть. Довольно прямо. В основном мы используем базу данных Firebase для хранения групп чатов и деталей сообщений.

Пример структуры БД:

Чтобы получить только чат-группы, у пользователя есть:

root/
users/
  chatGroups/
    $uid/
      $chatGroupId: true

Затем мы получаем информацию о группе чатов с другого узла, то же самое с последним сообщением чата в этой группе:

root/
chatGroups/
  entries/
    $groupId/
      group details here...
  messages/
    $groupId/
      $messageId/
        message details here..

Все выше, чтобы получить данные для одного элемента группы, который выглядит примерно так:

Изображение 174551

Все работает нормально. Сначала мы сначала получаем не более 5 чат-групп, а затем просто сортируем список. Проблема заключается в том, что мы должны прислушиваться к обновлениям для групп чатов - группа с самым последним сообщением чата переместилась бы вверх.

Структура, которую мы слушаем только в списке групп, которые имеет конкретный пользователь, - мы могли бы обнаружить группы, объединенные (onChildAdded) и left (onChildRemoved) пользователем, но она не содержит отметки времени, которые нам нужны для сортировки списка групп чатов по последним изменениям.

Кто-нибудь пробовал подобное поведение с Firebase раньше (мы делаем клиент для Android и Web - Javascript)? Любые идеи или предложения будут оценены. Дайте мне знать, если вам нужны какие-то релевантные детали, чтобы сделать вещи более ясными.

  • 1
    В таком случае я бы хотел сохранить lastUpdated времени lastUpdated в lastUpdated каждого пользователя, если это чат-группы, поэтому $chatGroupId: 1508508569108 . В зависимости от количества участников в группе обновление этих временных меток может быть довольно дорогой операцией разветвления. Но я не сразу вижу много других вариантов.
  • 0
    @FrankvanPuffelen Спасибо, Пуф. Да уж. Мы думали об одном и том же. Мы ожидаем не более 300 пользователей в группе чата, так что да, было бы дорого писать каждому из них.
Показать ещё 3 комментария
Теги:
firebase
firebase-realtime-database

1 ответ

0

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

Существует другой подход, в котором вы можете использовать денормализацию. Добавьте эти чаты в новый созданный раздел с именем uxChats. Чаты должны содержать только text message и timestamp. Если вы используете FirebaseUI, вы можете отменить порядок, просто используя эти строки кода:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager)

Последний чат идет сверху.

Надеюсь, это поможет AL.

  • 0
    Привет, Алекс. Благодарю. Мы уже знаем о поведении и обычных механизмах. Я стремился к тому, чтобы кто-то предложил структуру, которая наилучшим образом использовала бы поведение Firebase DB, чтобы мы могли создать UX - новейший автоматический чат выходит на первое место .
  • 0
    Обновил ответ с новой идеей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню