Firebase Firestore је облачна NoSQL база података у реалном времену од Google-а, намењена за мобилне и веб апликације. Чува податке у облику колекција и докумената са аутоматском синхронизацијом између клијената. Према документацији Firebase, 2025, Firestore подржава мултирегионално постављање са гарантованом конзистентношћу и обезбеђује аутоматско скалирање без потребе за управљањем серверима. База података се интегрише са Firebase Authentication и Cloud Functions за изградњу потпуног бекенда без сопствене серверске инфраструктуре.
Главно
Firebase Firestore је флексибилна, скалабилна NoSQL база података коју је Google покренуо 2019. године као еволуцију Firebase Realtime Database. Чува податке у облику колекција докумената, где сваки документ садржи скуп парова кључ-вредност. За разлику од традиционалних релационих база, Firestore не захтева унапред дефинисану шему — структура података се формира динамички на основу записаних докумената.
Кључна разлика Firestore-а од класичних облачних база је уграђена синхронизација у реалном времену. Када се подаци промене на серверу, сви повезани клијенти добијају ажурирања преко сталне WebSocket везе. То елиминише потребу за ручним испитивањем сервера и омогућава изградњу апликација са живим ажурирањима: четове, фидове активности, колаборативне едиторе и системе за надгледање.
База података је доступна на свим главним платформама: Android, iOS, Web (JavaScript) и серверским језицима преко Admin SDK-а. Firestore обезбеђује SDK за Swift, Kotlin, JavaScript, Python, Go, Java и Node.js. Према Google-овим подацима, Firestore обрађује преко 100 милијарди упита дневно широм Firebase екосистема, што потврђује његову поузданост као основе за production апликације.
У Firestore-у подаци су организовани у хијерархијску структуру. Колекција је контејнер докумената, сличан табели у SQL-у, али без фиксне шеме. Документ је запис који садржи поља различитих типова: стрингове, бројеве, булове вредности, низове, угнежђене објекте и гео-тачке. Документи могу садржати подколекције, што омогућава изградњу угнежђених структура података било које дубине.
val db = FirebaseFirestore.getInstance()
val user = hashMapOf(
"name" to "Ана Петрова",
"email" to "anna@example.com",
"age" to 28,
"isActive" to true
)
db.collection("users")
.add(user)
.addOnSuccessListener { docRef ->
Log.d("TAG", "Документ додат са ID: ${docRef.id}")
}
Сваки документ у колекцији има јединствени идентификатор који може бити генерисан аутоматски или постављен ручно. Firestore аутоматски индексира сва поља документа, што омогућава извршавање сложених упита са филтрирањем, сортирањем и ограничавањем броја резултата без претходног подешавања индекса.
Firestore и Firebase Realtime Database су две облачне базе података у реалном времену од Google-а. Иако обе обезбеђују синхронизацију у реалном времену, оне имају суштинске разлике у моделу података, скалирању и ценама. Разумевање ових разлика је кључно при одабиру одговарајуће базе за одређени пројекат.
| Карактеристика | Firestore | Realtime Database |
|---|---|---|
| Модел података | Колекције и документи | Јединствено JSON стабло |
| Конзистентност | Јака (strong consistency) | Eventual consistency |
| Упити | Сложени са филтрирањем и сортирањем | Само филтрирање по једном параметру |
| Скалирање | Аутоматско, мултирегионално | Један регион, до 200k веза |
| Цене | По операцијама читања/писања/брисања | По обиму пренесених података |
Главна архитектонска разлика је модел података. Realtime Database чува све у једном великом JSON стаблу, што отежава упите са дубоким угнежђењем. Firestore користи колекције и документе, што омогућава извршавање сложених упита са више услова. Поред тога, Firestore обезбеђује јаку конзистентност података: након успешног уписа, сва накнадна читања гарантовано враћају ажурне податке.
Firestore се аутоматски скалира до милиона истовремених веза захваљујући мултирегионалној архитектури. Realtime Database је ограничена на један регион и максимум 200.000 истовремених веза. За пројекте који планирају глобалну публику, Firestore је пожељнији јер се подаци аутоматски реплицирају између више Google-ових дата центара.
Структура података у Firestore-у омогућава изградњу сложених хијерархијских модела са подколекцијама. На пример, корисник може имати подколекцију „поруџбине", а свака поруџбина — подколекцију „производи". У Realtime Database такво дубоко угнежђење доводи до проблема са перформансама при упитима, јер се учитава цео пут од корена до жељеног чвора.
Firestore користи сталну WebSocket везу између клијента и сервера за синхронизацију података у реалном времену. Када се апликација претплати на промене документа или колекције преко snapshot listener-а, SDK успоставља комуникациони канал преко којег сервер шаље ажурирања при свакој промени података. Клијент добија само измењене документе, а не комплетан снимак целе колекције сваки пут.
Механизам синхронизације се заснива на току догађаја: added (документ се појавио), modified (документ се променио) и removed (документ је обрисан). Програмер може обрађивати сваки догађај посебно, ажурирајући само одговарајуће UI елементе. То обезбеђује високе перформансе чак и са хиљадама докумената, јер се само измењене компоненте поново исцртавају.
Једна од кључних предности Firestore-а је уграђена подршка за офлајн режим. SDK аутоматски кешира све прочитане податке на уређају и наставља да ради у одсуству мреже. Када апликација уписује податке у офлајн режиму, они се смештају у локални ред и шаљу на сервер при успостављању везе. За решавање конфликата користи се стратегија last-write-wins.
val docRef = db.collection("cities").document("SF")
docRef.addSnapshotListener { snapshot, error ->
if (error != null) {
Log.w("TAG", "Грешка при слушању", error)
return@addSnapshotListener
}
if (snapshot != null && snapshot.exists()) {
Log.d("TAG", "Тренутни подаци: ${snapshot.data}")
}
}
Величина кеша се може подесити кроз FirestoreSettings. Подразумевано се користи 100 MB, али за апликације са интензивним читањем података може се повећати. Такође је доступан persistent disk cache режим који преживљава поновно покретање апликације. За управљање доступношћу офлајн режима користе се методе enableNetwork и disableNetwork, које омогућавају привремено искључивање мрежне комуникације.
Firestore Security Rules су декларативни језик означавања за контролу приступа подацима на нивоу сервера. Правила одређују ко и под којим условима може читати и уписати документе. Она раде пре извршења упита и не захтевају одвојену серверску логику за ауторизацију. Правила се проверавају на Firebase страни пре сваког читања или уписа података.
Правила приступа се граде на принципу дозвољеног приступа (allow). Подразумевано, сав приступ је забрањен. Програмер сукцесивно отвара приступ за конкретне операције (read, write, create, update, delete) под одређеним условима. Услови могу проверавати аутентификацију корисника преко request.auth, податке упита преко request.resource и постојеће податке преко resource.
// Правила приступа Firestore
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Корисник чита и пише само своје податке
match /users/{userId} {
allow read, write: if
request.auth != null &&
request.auth.uid == userId;
}
// Сваки аутентификовани корисник може читати објаве
match /posts/{postId} {
allow read: if request.auth != null;
allow create: if request.auth != null
&& request.resource.data.author == request.auth.uid;
}
}
}
Поред контроле приступа, Security Rules омогућавају валидацију структуре и типова записаних података. На пример, може се проверити да ли поље е-поште одговара регуларном изразу или да ли старост не прелази 120 година. Валидација се врши пре уписа, што спречава чување неисправних података на серверу. За проверу поља користи се објекат request.resource.data који садржи цео документ који се уписује.
Firestore такође подржава колекције доступне само за серверски упис преко Admin SDK-а, без приступа са стране клијената. Ово је згодно за чување сервисних информација, API кључева и конфигурација које не би требало да буду видљиве корисницима. За то је у правилима довољно забранити све клијентске операције на одговарајућим колекцијама, дозвољавајући приступ само преко Admin SDK са серверске стране.
Размотримо пример интеграције Firestore-а у Android апликацију за креирање листе задатака (todo). Апликација ће читати задатке у реалном времену, додавати нове и означавати завршене. За асинхрони рад користе се callback интерфејси Firebase и корутине Kotlin-а.
Пре почетка рада потребно је повезати пројекат са Firebase-ом преко Firebase Console-а и додати датотеку google-services.json у модул апликације. Затим се у build.gradle додаје зависност firebase-firestore-ktx и прикључак google-services. Верзија библиотеке треба да одговара актуелној верзији BoM Firebase-а ради компатибилности свих Firebase компоненти међу собом.
dependencies {
// Firebase BoM — управљање верзијама
implementation platform("com.google.firebase:firebase-bom:33.0.0")
implementation "com.google.firebase:firebase-firestore-ktx"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.9.0"
}
Након подешавања креира се модел података Task и репозиторијум за рад са Firestore-ом. Модел садржи поља id, title, isCompleted и timestamp. Firestore аутоматски серијализује data class у документ, користећи имена поља као кључеве. За читање података користи се snapshot listener који враћа Flow преко проширења snapshotFlow.
data class Task(
val id: String = "",
val title: String = "",
val isCompleted: Boolean = false,
val createdAt: Timestamp? = null
)
class TaskRepository {
private val tasksRef = FirebaseFirestore
.getInstance()
.collection("tasks")
fun getTasks(): Flow<List<Task>> = tasksRef
.orderBy("createdAt", Query.Direction.DESCENDING)
.snapshotFlow()
.map { snapshot ->
snapshot?.toObjects(Task::class.java) ?: emptyList()
}
suspend fun addTask(title: String) {
tasksRef.add(Task(title = title))
}
}
View-model се претплаћује на Flow из репозиторијума и прослеђује листу задатака на UI ниво. При додавању новог задатка позива се suspend-функција репозиторијума преко корутин scope-а. Firestore аутоматски синхронизује промене између свих клијената: ако задатак дода један корисник, остали га виде у реалном времену без поновног учитавања екрана.
Често постављана питања
Firestore је NoSQL база са флексибилном шемом без табела и JOIN упита. Подаци се чувају у колекцијама докумената, а не у редовима табела. За разлику од SQL-а, Firestore не захтева претходно дефинисање шеме и аутоматски се скалира без миграција, али не подржава сложене транзакционе упите између колекција.
Firestore има великодушан бесплатни лимит (Spark план): 50.000 читања, 20.000 уписа и 20.000 брисања дневно. Након прекорачења користи се Blaze план са плаћањем по употреби: $0.06 за 100.000 читања и $0.18 за 100.000 уписа. Цена зависи од региона и обима пренесених података.
Firestore користи стратегију last-write-wins за решавање конфликата: последњи упис у документ потпуно замењује претходни. За финију контролу доступне су трансакције (атомске операције читања-уписа) и пакетни упису који гарантују интегритет при операцијама над више докумената.
Да, Firestore подржава извоз и увоз података преко Firebase Console-а или gcloud CLI-ја. Извоз се врши у формату Cloud Firestore Export и чува се у Google Cloud Storage-у. Подаци се могу мигрирати између Firebase пројеката или преузети за анализу у BigQuery-у и другим алатима.
Firestore нема уграђену претрагу пуног текста. За овај задатак Google препоручује интеграцију са Algolia или Meilisearch, или коришћење Cloud Functions са Elasticsearch-ом. Уграђени упити Firestore-а подржавају само проверу једнакости, опсега и присуства поља без претраге по подстрингу.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође