Бессерверное решение делает веб-приложения и мобильные приложения такими быстрыми.

С serverless нет необходимости настраивать сервер (вероятно, глючный и небезопасный) для вашего логического центра и центра принятия решений вашего приложения.

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

Google основал Firebase в 2012 году, и я помню, что до этого был такой же сервис Parse. В любом случае, позвольте мне объяснить случай в Firestore (на JS).

В RDMS вы можете объединять таблицы и получать фантастический результат, но в Firestore нет никакой концепции объединения в Firestore (и других базах данных с документацией)!

Если вы знакомы с ReactJS (или React Native), вы можете использовать ES6 и прекрасные новые функции, такие как find, map, forEach и reduce.

Но есть одна тонкая вещь, которую вы никогда не должны забывать: новые функции итерации, не ожидающие результата, если вы использовали асинхронное ожидание в своем коде, вы должны вернуться слишком много лет назад :(

Например:

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

firebase.firestore().collection("users").get().then((usersSnapshot)=>{
    if(usersSnapshot.size>0){
        
        let usersArr=usersSnapshot.docs.map((x)=>{return {...x.data(),id:x.id}});

        usersArr.map((user)=>{
            firebase.firestore().collection("transactions").where("userId","==",user.id).get().then((transactionsSnapshot)=>{
                if(transactionsSnapshot.size>0){
                    user.transactions = [...transactionsSnapshot.docs.map((x)=>{return {...x.data(),id:x.id}})];
                    
                    //will call on every user! so dirty and expensive
                    this.setState({
                        users:usersArr
                    })
                }
            })
        })
        
    }
})

НО это не лучший способ установить свое состояние для каждого пользователя, это значит отображать страницу для каждого пользователя!

Итак, позвольте мне внести небольшие изменения в приведенный выше блок кода.

firebase.firestore().collection("users").get().then(async (usersSnapshot)=>{
    if(usersSnapshot.size>0){

        let usersArr=usersSnapshot.docs.map((x)=>{return {...x.data(),id:x.id}});

        let userInx = 0;

        for(const user of usersArr){

            await firebase.firestore().collection("transactions").where("userId","==",user.id).get().then(async (transactionsSnapshot)=>{
                if(transactionsSnapshot.size>0){
                    usersArr[userInx].transactions = [...transactionsSnapshot.docs.map((x)=>{return {...x.data(),id:x.id}})];
                }
                userInx++;
            });
        }

        this.setState({
            users:usersArr
        })

    }
})

ДА!!!

результат:

Как правило, я использую React-Redux в базовых веб-/мобильных приложениях ReactJS, но я не предпочитаю использовать Redux в приложениях, созданных Firebase, потому что я чувствую, что мое хранилище обновлений всегда остается в Firestore и нет необходимости хранить данные в мой местный магазин редуксов.

Удачного взлома!