2016-06-18 4 views
0

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

Объект разговора/дерево/все выглядит следующим образом:

conversations: { 
    "-JRHTHaKuITFIhnj02kE": { 
    user_one_id: "054bd9ea-5e05-442b-a03d-4ff8e763030b", 
    user_two_id: "0b1b89b7-2580-4d39-ae6e-22ba6773e004", 
    user_one_name: "Christina", 
    user_two_name: "Conor", 
    user_one_typing: false, 
    user_two_typing: false, 
    last_message_text: "Hey girl, what are you doing?", 
    last_message_type: "TEXT", 
    last_message_date: 0 
    } 
} 

и сообщения объект выглядит следующим образом:

messages: { 
    "-JRHTHaKuITFIhnj02kE": { 
    conversation: "-JRHTHaKuITFIhnj02kE", 
    sender: "054bd9ea-5e05-442b-a03d-4ff8e763030b", 
    message: "Hey girl, what are you doing?", 
    message_type: "TEXT", 
    message_date: 0 
    } 
} 

хранит имя по отношению к пользователю в объекте разговора, необходимом , или я могу легко найти имя пользователя пользователем UID на лету? За исключением вопроса имени, это хорошо? Я не хочу начинать с очень плохой структуры данных.

Примечание: Да, я знаю UID для разговора & сообщение такое же, я устал составлять переменные.

+0

Перекрестная почта: https://groups.google.com/forum/#!topic/firebase-talk/U-ztd-PbFLs –

ответ

0

Обычно я моделирую данные, которые мне нужно показать на одном экране в одном месте в базе данных. Это позволяет извлекать эти данные с помощью одного чтения/прослушивателя.

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

Для именования чата: если это довольно стандартное приложение чата, пользователь может ожидать постоянных чатов 1: 1 друг с другом, так что каждый раз, когда вы и я общаемся, мы оказываемся в та же комната. Хороший подход для достижения этого в модели данных можно найти в этом ответе: Best way to manage Chat channels in Firebase

+0

Проблема с хранением всего в одном месте заключается в том, что при загрузке «беседы» '(На самом деле другое отношение в моем приложении, но разговор облегчает), сообщения не всегда актуальны. Кроме того, сообщения между пользователями не должны загружаться одновременно, что необходимо, если они находятся под одним и тем же объектом, даже если предположим, что мы хотим загрузить только 50 последних сообщений. Хранение всего в одном месте влияет на производительность со шкалой. Кроме того, это позволяет запрашивать «беседу» без загрузки сообщений. – Hobbyist

0

Я не думаю, что вы правильно структурировали его. Вы должны иметь в виду «что, если» полный анализ.

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

{ 
    "conversation-messages" : { 
    "--JpntMPN_iPC3pKDUX9Z" : { 
     "-Jpnjg_7eom7pMG6LDe1" : { 
     "message" : "hey! Who are you?", 
     "timestamp" : 1432165992987, 
     "type" : "text", 
     "userId" : "user:-Jpnjcdp6YXM0auS1BAT" 
     }, 
     "-JpnjibdwWpf1k-zS3SD" : { 
     "message" : "Arya Stark. You?", 
     "timestamp" : 1432166001453, 
     "type" : "text", 
     "userId" : "user:-OuJffgdYY0jshTFD" 
     }, 
     "-JpnkqRjkz5oT9sTrKYU" : { 
     "message" : "no one. a man has no name.", 
     "timestamp" : 1432166295571, 
     "type" : "text", 
     "userId" : "user:-Jpnjcdp6YXM0auS1BAT" 
     } 
    } 
    }, 
    "conversations-metadata" : { // to show the conversation list from all users for each user 
    "-JpntMPN_iPC3pKDUX9Z" : { 
     "id": "-JpntMPN_iPC3pKDUX9Z", 
     "date":995043959933, 
     "lastMsg": "no one. a man has no name.", 
     "messages_id": "-JpntMPN_iPC3pKDUX9Z" 
    } 
    }, 
    "users" : { 
    "user:-Jpnjcdp6YXM0auS1BAT" : { 
     "id" : "user:-Jpnjcdp6YXM0auS1BAT", 
     "name" : "many-faced foo", 
     "ProfileImg" : "...." 
     "conversations":{ 
      "user:-Yabba_Dabba_Doo" : { 
       "conversation_id": "-JpntMPN_iPC3pKDUX9Z", 
       "read" : false 
      } 
     } 
    }, 
    "user:-Yabba_Dabba_Doo" : { 
     "id" : "user:-Yabba_Dabba_Doo", 
     "name" : "Arya Stark", 
     "ProfileImg" : "...." 
     "conversations":{ 
      "user:-Jpnjcdp6YXM0auS1BAT" : { 
       "conversation_id": "-JpntMPN_iPC3pKDUX9Z", 
       "read" : true 
      } 
     } 
    } 
    } 
} 
Смежные вопросы