Бессерверное решение делает веб-приложения и мобильные приложения такими быстрыми.
С 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 и нет необходимости хранить данные в мой местный магазин редуксов.
Удачного взлома!