Firebase Firestore је флексибилна NoSQL документна база података компаније Google са аутоматском синхронизацијом у реалном времену за мобилне и веб апликације. Подаци се чувају у облику колекција и докумената, од којих сваки садржи скуп поља произвољне структуре. Према подацима Google, 2026, Firestore подржава мултирегионалну репликацију са аутоматским опоравком приликом отказа. SDK шаље промене на сервер преко WebSocket везе са кашњењем мањим од 100 милисекунди.
Главне тачке
Firebase Firestore је облачна NoSQL база података коју је Google лансирао 2019. године као наследника Realtime Database. Firestore је изграђен на инфраструктури Google Cloud Spanner и Google Cloud Datastore, обезбеђујући строгу конзистентност података у оквиру једне транзакције и аутоматску мултирегионалну репликацију. SDK подржава Android, iOS, Web (JavaScript), Flutter, Kotlin Multiplatform и Unity.
Firestore је најављен на Google I/O 2017 као „Cloud Firestore” — решење које елиминише кључна ограничења Realtime Database: недостатак подршке за сложене упите, немогућност скалирања података на више чворова и слабу конзистентност. Према подацима Google (2026), Firestore обрађује преко 1 билион упита дневно и представља подразумевану базу података за 80% нових Firebase пројеката. Међутим, Realtime Database остаје релевантна за сценарије са ултра-ниским кашњењем (игре, заједничко уређивање) захваљујући једноставној JSON структури.
Firestore се нуди по pay-as-you-go моделу са великодушним бесплатним лимитом на Spark тарифи: 1 GB складишта, 10 GB мрежног саобраћаја месечно, 50 хиљада операција читања, 20 хиљада операција писања и 20 хиљада операција брисања дневно. На Blaze тарифи све је исто бесплатно, а прекорачења се наплаћују: $0.06 на 100 хиљада операција читања, $0.18 на 100 хиљада операција писања. Према подацима Google (2026), 90% пројеката не излази изван бесплатног лимита.
Модел података Firestore је организован хијерархијски: корен садржи колекције, свака колекција садржи документе, сваки документ садржи поља (примитивни типови, низови, Map) и угњеждене колекције (subcollections). Дубина угњежђења колекција није ограничена, али документ не може директно да садржи други документ — само преко референце (Reference type).
Колекција је контејнер докумената са аутоматски генерисаним или задатим идентификаторима. Сваки документ је JSON-сличан објекат величине до 1 MiB. Поља документа могу бити стрингови, бројеви, булови, низови, Map, временске ознаке (Timestamp), географске тачке (GeoPoint) и референце на друге документе (Reference). Величина документа је ограничена на 1 MiB, укључујући имена свих поља.
| Тип поља Firestore | Пример | Индексира се |
|---|---|---|
| String | „user@example.com” | Да |
| Number | 42, 3.14 | Да |
| Boolean | true, false | Да |
| Array | [1, 2, 3] | Само contains |
| Map | {„угњеждено”: „вредност”} | Да (по кључевима) |
| Timestamp | 2026-07-03T12:00:00Z | Да |
| Reference | users/user123 | Да |
Firestore подржава атомске транзакције на нивоу базе података. Транзакција може читати и писати више докумената — Commit атомски примењује све промене или ниједну. Максимум 500 операција по транзакцији, тајмаут 60 секунди. Пакетно писање (batch write) је нетранзакциона атомска операција писања без фазе читања. Транзакције су критичне за финансијске операције, резервације места и инвентаризацију.
Избор између Firestore и Realtime Database зависи од захтева пројекта. Обе базе података су део Firebase екосистема, пружају синхронизацију у реалном времену и доступне су на свим платформама, али се суштински разликују по моделу података, скалирању и ценама.
Realtime Database чува податке у једном JSON стаблу, што је згодно за једноставне структуре, али отежава скалирање при угњежђењу дубљем од 3 нивоа. Firestore користи колекционо-документни модел са аутоматским шардовањем, што омогућава скалирање до милиона докумената без погоршања перформанси. Према подацима Google (2026), Firestore подржава до 10 хиљада истовремених веза са једном колекцијом без губитка брзине, Realtime Database — до 200 хиљада веза са једном инстанцом.
Realtime Database се наплаћује по обиму пренесених података (преузетих бајтова) и броју истовремених веза. Firestore — по броју операција (читање, писање, брисање). За апликације са честим малим ажурирањима (ћаскање, обавештења) Firestore је обично исплативији — свака операција писања има фиксну цену без обзира на величину података. За апликације са ретким читањем великих количина података Realtime Database може бити јефтинија.
Препорука Google (2026): користите Firestore као подразумевану базу података за нове пројекте, а Realtime Database — за игре и апликације где је критично минимално кашњење (мање од 50 ms) и структура података је равна. Обе базе могу радити истовремено у једном пројекту.
Упити Firestore се извршавају на колекцијама или групама колекција са филтрирањем, сортирањем и лимитом. За разлику од Realtime Database, где је сваки упит обилазак целог JSON стабла са филтером на клијенту, Firestore извршава све упите на серверу, користећи унапред креиране индексе. Ово гарантује да сложеност упита зависи само од величине резултата, а не од величине колекције.
Firestore подржава филтрирање по једном или више поља (equality, range, in, array-contains, array-contains-any), сортирање растуће и опадајуће, лимит и курсоре за пагинацију. Ограничења: сложени упити са филтрирањем по различитим пољима (where price > 10 AND where category == „books”) захтевају сложени индекс; OR упити су забрањени (користи се in и array-contains-any) и упити са неједнакошћу по различитим пољима су забрањени.
data class Product(
val name: String = "",
val category: String = "",
val price: Double = 0.0,
val inStock: Boolean = false
)
suspend fun FirestoreRepository.queryProducts(): List<Product> {
return firestore
.collection("products")
.whereEqualTo("category", "electronics")
.whereGreaterThanOrEqualTo("price", 100.0)
.whereLessThan("price", 500.0)
.orderBy("price")
.limit(20)
.get()
.await()
.toObjects(Product::class.java)
}
Firestore аутоматски креира индексе за појединачна поља — упити по једном пољу раде без икаквог подешавања. За упите са два или више поља (филтрирање + сортирање) креирају се сложени индекси. Приликом првог слања упита, Firestore враћа грешку са линком ка конзоли где се индекс може креирати једним кликом. Максимум 200 сложених индекса по бази података. Индекси се могу извозити и увозити преко firebase CLI.
Повезивање Firestore са Android апликацијом се врши стандардно преко Firebase BOM. Након додавања зависности firebase-firestore-ktx, објекат FirebaseFirestore је доступан преко getInstance() — без додатних кључева или токена. Firestore користи исти Firebase пројекат као и остали сервиси.
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-firestore-ktx")
}
// Иницијализација
val db = FirebaseFirestore.getInstance()
Firestore пружа два режима читања: једнократно (get) и у реалном времену (addSnapshotListener). Једнократно читање добија документ једном — корисно за подешавања и конфигурацију. Слушалац се претплаћује на промене — свако ажурирање документа аутоматски доставља ажуриране податке свим повезаним клијентима у реалном времену. set() креира или преписује документ, update() мења само наведена поља без преписивања целог документа.
Према подацима Google (2026), апликације средње величине (100 хиљада DAU) са Firestore у реалном времену троше око 5-10 GB одлазног саобраћаја месечно. Коришћење офлајн кеша (Persistence Cache) смањује обим поновног учитавања за 60-70%, јер SDK учитава само измењене документе приликом успостављања везе.
Persistence Cache је уграђени механизам Firestore за рад без интернета. SDK аутоматски кешира све прочитане документе на уређају (до 500 MiB на Android-у). При губитку везе, читање се наставља из кеша, писање се ставља у ред. При успостављању везе, све одложене операције се шаљу на сервер, а кеш се синхронизује са сервером. За контролу конфликата користе се snapshot-metadata.hasPendingWrites и setOptions(ServerTimestampBehavior).
Security Rules је декларативни језик за разграничење приступа Firestore-у, који се извршава на Google серверу пре сваке операције читања или писања. Rules не захтевају серверски код — пишу се у Firebase конзоли или преко firebase CLI и верзионишу се кроз Git. Свака операција се проверава на усклађеност са правилима, а при прекршају се враћа грешка PERMISSION_DENIED.
Правила Firestore Security Rules се састоје од match блокова и allow израза. match дефинише путању до колекције или документа, allow одређује дозвољене операције (read, write, create, update, delete) и услов — израз сличан JavaScript-у који враћа булову вредност. Правила могу проверавати аутентификацију (request.auth), податке захтева (request.resource.data), постојеће податке (resource.data), време (request.time) и путању (request.path).
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read: if request.auth != null;
allow write: if request.auth.uid == userId;
}
match /products/{productId} {
allow read: if true;
allow create: if request.auth.token.role == "admin";
allow update: if resource.data.authorId == request.auth.uid;
}
}
}
Security Rules подржавају валидацију типова и вредности на серверској страни. Може се забранити писање ако је цена негативна или име празно. Све провере се извршавају на Google серверу пре писања — ово гарантује конзистентност података без обзира на клијента (Android, iOS, Web, Admin SDK). Rules не штите од злонамерног Admin SDK — он по дефиницији заобилази правила. За потпуну заштиту користите Transaction Functions и Firebase Extensions.
Често постављана питања
Firestore користи документни модел са индексима и сложеним упитима. Realtime Database чува податке у JSON стаблу и обезбеђује мање кашњење. Firestore се препоручује за нове пројекте.
Firestore аутоматски шардује податке по колекцијама — није потребно подешавати репликацију или шардовање. База издржава милионе докумената у колекцији и хиљаде истовремених веза без деградације.
Да, користите Firebase Console — функција „Export to Firestore” претвара JSON структуру Realtime Database у колекције и документе Firestore са неколико кликова. Угњеждени чворови постају угњеждене колекције.
Last write wins — подразумевано, Firestore користи политику „последњи запис побеђује” за решавање конфликата при истовременом писању. За прилагођену обраду користите транзакције са поновним читањем.
Бесплатни лимит Spark тарифе: 1 GB складишта, 50 хиљада операција читања и 20 хиљада операција писања дневно. Ово је довољно за MVP и апликације са малим оптерећењем.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође