Приложение чата Firebase: запрос сообщений, оптимизация запроса, который должен быть оператором ИЛИ, или улучшение структуры базы данных NoSQL

Я разрабатываю приложение для Android с использованием Firebase, которое должно встраивать чат.

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

Я не могу просто так их отфильтровать. И, будучи полями receiver и sender объекта внутри чата, я не могу даже просто отфильтровать их, когда использую URL-адрес Firebase, например firebase.myapp.io/chat.

Чат Firebase

Итак, единственное возможное решение в этой модели - получить все чаты и отфильтровать их. Это почти хороший способ сделать эту работу. Кроме того, когда сообщений будет много, все может стать очень медленным.

Поэтому я подумал о разных способах достижения результата:

  • Я получаю в чате ключи, соответствующие uid пользователя. Среди значений я получаю чаты с точки зрения пользователя, или я получаю ключи моих получателей в качестве значений и внутри сообщений

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

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

Каким будет лучший способ NoSQL для управления несколькими частными беседами в чате?


person BlackBox    schedule 10.05.2016    source источник
comment
В базах данных NoSQL довольно часто встречается дублирование данных. См. stackoverflow.com / questions / 33540479 / для моделирования чатов.   -  person Frank van Puffelen    schedule 10.05.2016
comment
Итак, я должен создать такие объекты, как chat_uid1_uid2 и chat_uid2_uid1? Внутри я должен правильно настроить разговор (объекты сообщения со временем и текстом и, в конечном итоге, другие вещи)?   -  person BlackBox    schedule 10.05.2016
comment
Я часто моделирую в базе данных то, что вижу на экране. Итак, если вам нужны личные чаты, я моделирую личные чаты. Что именно лучше для вас, зависит от многих факторов, которых я не знаю (и вы, вероятно, еще не знаете). Если вы хотите прочитать больше, я рекомендую эту статью о NoSQL моделирование данных.   -  person Frank van Puffelen    schedule 10.05.2016


Ответы (1)


В настоящее время у меня такая же проблема с создаваемым приложением чата. Я недавно нашел решение:

1) Я в основном использовал уникальный идентификатор двух пользователей и преобразовал их в число с помощью ID.getBytes ().

2) Затем я сложил 2 числа одно к другому (сложение) и снова преобразовал их в число base64.

3) Использовал полученный номер в качестве идентификатора чата.

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

person BoyoApps    schedule 09.07.2016
comment
Объедините два идентификатора пользователя в алфавитном порядке и используйте его в качестве идентификатора чата. - person Chaitanya Shah; 02.11.2016