Структурировать базу данных NoSQL для приложения чата (используя FireBase)

Исходя из многолетнего использования реляционных баз данных, я пытаюсь разработать довольно простое приложение для чата/обмена сообщениями с использованием FireBase.

FireBase использует структуру данных NoSQL с использованием строк в формате JSON.

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

{

"chats" : {

    "1" : {
        "10" : {
            "conversationId" : "x123332"
         },
        "17": {
            "conversationId" : "x124442"
        }
    }
},

"conversations" : {

    "x123332" : {

      "message1" : {

        "time" : 12344556,
        "text" : "hello, how are you?",
        "userId" : 10
      },
      "message2" : {

        "time" : 12344560,
        "text" : "Good",
        "userId" : 1
      }
    }
  }
}

Цифры 1, 10, 17 являются примерами идентификаторов пользователей.

Мой вопрос в том, можно ли это структурировать лучше? Цель состоит в том, чтобы масштабироваться по мере роста пользователей приложения и при этом получать максимально возможную производительность.


person TareK Khoury    schedule 13.03.2016    source источник
comment
Структуры данных Firebase зависят от того, что вы хотите делать с данными. То, что представлено, очень расширяемо, доступно для запросов, а узлы доступны для наблюдения за изменениями. Кроме того, Firebase невероятно быстр и может легко обрабатывать тысячи запросов. Однако без понимания всего объема или конкретного вопроса о данных это открытый вопрос. Например; какова функция узла чата? Узел разговоров содержит все необходимое для отслеживания разговора с другим пользователем. например Пользователь входит в систему, запрашивает все разговоры, которые содержат его идентификатор пользователя, а затем наблюдает за ними.   -  person Jay    schedule 13.03.2016
comment
Думайте об этом как о простом приложении WhatsApp, в котором у вас есть активность, отображающая все мои чаты. Когда я нажимаю на чат, я получаю подробное представление, которое представляет собой сообщения разговора между двумя пользователями.   -  person TareK Khoury    schedule 13.03.2016
comment
Сам вопрос объясняет, что делает приложение, но использование структуры расплывчато; описанная функциональность может быть легко реализована только с помощью узла бесед. Денормализация данных очень важна, но не делайте этого только ради создания другого узла, когда в этом нет необходимости. В данном случае это может и не понадобиться. Вопрос должен быть более конкретным, поэтому я предлагаю создать некоторый код для тестирования, а когда вы столкнетесь с проблемой, тогда опубликуйте свой конкретный вопрос.   -  person Jay    schedule 13.03.2016


Ответы (1)


Один из вариантов хранения сообщений может выглядеть примерно так:

"userMessages": 
    { "simplelogin:1": 
        { "simplelogin:2": 
            { "messageId1": 
                { "uid": "simplelogin:1", 
                  "body": "Hello!", 
                  "timestamp": Firebase.ServerValue.TIMESTAMP },
               "messageId2": { 
                  "uid": "simplelogin:2", 
                  "body": "Hey!", 
                  "timestamp": Firebase.ServerValue.TIMESTAMP } 
                 } 
             } 
         } 

Вот пример Fireslack, из которого взялась эта структура. В этом руководстве создается приложение, подобное slack, с использованием Firebase: https://thinkster.io/angularfire-slack-tutorial

Если вы хотите что-то более конкретное, дополнительная информация будет полезна.

person Luke Schlangen    schedule 13.03.2016