2017-01-04 11 views
0

В качестве примера рассмотрим приложение «Instagram-like».Агрегирование данных базы данных Firebase

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

В принципе, у клиента я жду, чтобы получить от бэкэнда что-то вроде

{ username: "John", avatar:"some_link", photo:"photo_url", likes:"9", time:"182937428", comments:[comments there] }

, но с использованием Firebase, мне нужно хранить данные в более плоском виде. поэтому в данных JSON будут «пользователи», «сообщения» и «комментарии».

Как я могу объединить данные с этих узлов в каком-то одном объекте, который прост в использовании на клиенте?

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

ответ

1

Вы должны реализовать «мелкую» древовидную структуру и использовать ссылки там, где это необходимо. Это означает, что в большинстве случаев в вашем приложении вы должны использовать объект как есть. Убедившись, что он содержит «основные данные» (в приведенном ниже примере «название чата») и ключи для «дополнительной» информации (в пример, ключи к «членам»).

из firebase Docs (https://firebase.google.com/docs/database/web/structure-data):

плохого

{ 
    // This is a poorly nested data architecture, because iterating the children 
    // of the "chats" node to get a list of conversation titles requires 
    // potentially downloading hundreds of megabytes of messages 
    "chats": { 
    "one": { 
     "title": "Historical Tech Pioneers", 
     "messages": { 
     "m1": { "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." }, 
     "m2": { ... }, 
     // a very long list of messages 
     } 
    }, 
    "two": { ... } 
    } 
} 

хороших

{ 
    // Chats contains only meta info about each conversation 
    // stored under the chats's unique ID 
    "chats": { 
    "one": { 
     "title": "Historical Tech Pioneers", 
     "lastMessage": "ghopper: Relay malfunction found. Cause: moth.", 
     "timestamp": 1459361875666 
    }, 
    "two": { ... }, 
    "three": { ... } 
    }, 

    // Conversation members are easily accessible 
    // and stored by chat conversation ID 
    "members": { 
    // we'll talk about indices like this below 
    "one": { 
     "ghopper": true, 
     "alovelace": true, 
     "eclarke": true 
    }, 
    "two": { ... }, 
    "three": { ... } 
    }, 

    // Messages are separate from data we may want to iterate quickly 
    // but still easily paginated and queried, and organized by chat 
    // conversation ID 
    "messages": { 
    "one": { 
     "m1": { 
     "name": "eclarke", 
     "message": "The relay seems to be malfunctioning.", 
     "timestamp": 1459361875337 
     }, 
     "m2": { ... }, 
     "m3": { ... } 
    }, 
    "two": { ... }, 
    "three": { ... } 
    } 
} 
+0

Я до сих пор не получить его. Так что, если я получил «пользователь» с «аватаром», «именем», «возрастом». И я получил «сообщение» с «url», «count» и «userId». Как его собрать? Вручную создайте для каждого для каждой «записи» и добавьте «user.avatar» и «user.name» в свою реализацию на клиенте? А что, если у вас тысячи сообщений? Или я должен дублировать данные от пользователя для публикации? А что, если пользователь меняет имя или аватар ??? – Graykos

+0

извините, я не слежу .. что вы имеете в виду «соберите это вместе» .. – idosh

Смежные вопросы