Firebase Firestore, mobil ve web uygulamaları için tasarlanmış, Google tarafından sunulan bir bulut NoSQL gerçek zamanlı veritabanıdır. Verileri istemciler arasında otomatik senkronizasyonla koleksiyonlar ve belgeler halinde depolar. Firebase, 2025 dokümantasyonuna göre, Firestore güçlü tutarlılıkla çok bölgeli dağıtımı destekler ve sunucu yönetimi gerektirmeden otomatik ölçekleme sağlar. Veritabanı, kendi sunucu altyapınız olmadan tam bir backend oluşturmak için Firebase Authentication ve Cloud Functions ile entegre olur.
Önemli Noktalar
Firebase Firestore, Google tarafından 2019 yılında Firebase Realtime Database'in evrimi olarak piyasaya sürülen esnek, ölçeklenebilir bir NoSQL veritabanıdır. Verileri belge koleksiyonlarında depolar ve her belge bir dizi anahtar-değer çifti içerir. Geleneksel ilişkisel veritabanlarının aksine, Firestore önceden tanımlanmış bir şema gerektirmez — veri yapısı, yazılan belgelere göre dinamik olarak oluşur.
Firestore ile klasik bulut veritabanları arasındaki temel fark, yerleşik gerçek zamanlı senkronizasyondur. Sunucudaki veriler değiştiğinde, bağlı tüm istemciler kalıcı bir WebSocket bağlantısı aracılığıyla güncellemeler alır. Bu, manuel sunucu yoklaması ihtiyacını ortadan kaldırır ve canlı güncellemelere sahip uygulamalar oluşturmayı sağlar: sohbetler, aktivite akışları, işbirlikçi düzenleyiciler ve izleme sistemleri.
Veritabanı tüm büyük platformlarda kullanılabilir: Android, iOS, Web (JavaScript) ve Admin SDK aracılığıyla sunucu tarafı dilleri. Firestore, Swift, Kotlin, JavaScript, Python, Go, Java ve Node.js için SDK sağlar. Google'a göre Firestore, tüm Firebase ekosisteminde günde 100 milyardan fazla isteği işleyerek üretim uygulamaları için bir temel olarak güvenilirliğini doğrulamaktadır.
Firestore'da veriler hiyerarşik bir yapıda düzenlenir. Koleksiyon, SQL'deki tabloya benzer ancak sabit şeması olmayan bir belge kapsayıcısıdır. Belge, çeşitli türlerde alanlar içeren bir kayıttır: dizeler, sayılar, boole değerleri, diziler, iç içe nesneler ve coğrafi noktalar. Belgeler alt koleksiyonlar içerebilir ve bu da herhangi bir derinlikte iç içe veri yapıları oluşturmayı sağlar.
val db = FirebaseFirestore.getInstance()
val user = hashMapOf(
"name" to "Anna Petrova",
"email" to "anna@example.com",
"age" to 28,
"isActive" to true
)
db.collection("users")
.add(user)
.addOnSuccessListener { docRef ->
Log.d("TAG", "Belge şu ID ile eklendi: ${docRef.id}")
}
Koleksiyondaki her belgenin, otomatik olarak oluşturulabilen veya manuel olarak ayarlanabilen benzersiz bir tanımlayıcısı vardır. Firestore, tüm belge alanlarını otomatik olarak indeksleyerek manuel indeks yapılandırması olmadan filtreleme, sıralama ve sonuç sınırlama ile karmaşık sorgulara olanak tanır.
Firestore ve Firebase Realtime Database, Google'ın iki bulut gerçek zamanlı veritabanıdır. Her ikisi de gerçek zamanlı senkronizasyon sağlasa da, veri modeli, ölçekleme ve fiyatlandırma konularında temel farklılıklara sahiptir. Belirli bir proje için doğru veritabanını seçerken bu farklılıkları anlamak çok önemlidir.
| Özellik | Firestore | Realtime Database |
|---|---|---|
| Veri modeli | Koleksiyonlar ve belgeler | Tek JSON ağacı |
| Tutarlılık | Güçlü tutarlılık | Nihai tutarlılık |
| Sorgular | Filtreleme ve sıralama ile bileşik | Yalnızca tek parametreyle filtreleme |
| Ölçekleme | Otomatik, çok bölgeli | Tek bölge, 200 bin bağlantıya kadar |
| Fiyatlandırma | Okuma/yazma/silme işlemi başına | Aktarılan veri hacmine göre |
Temel mimari fark veri modelidir. Realtime Database her şeyi büyük bir JSON ağacında depolar ve bu da derin iç içe yerleştirmeli sorguları karmaşık hale getirir. Firestore koleksiyonlar ve belgeler kullanarak birden çok koşullu karmaşık sorgulara olanak tanır. Ayrıca Firestore, güçlü veri tutarlılığı sağlar: başarılı bir yazma işleminden sonra, sonraki tüm okumaların en güncel verileri döndürmesi garanti edilir.
Firestore, çok bölgeli mimarisi sayesinde otomatik olarak milyonlarca eşzamanlı bağlantıya ölçeklenir. Realtime Database tek bir bölgeyle sınırlıdır ve en fazla 200.000 eşzamanlı bağlantıya izin verir. Küresel bir kitleyi hedefleyen projeler için Firestore tercih edilir çünkü veriler birden çok Google veri merkezinde otomatik olarak çoğaltılır.
Firestore'daki veri yapısı, alt koleksiyonlarla karmaşık hiyerarşik modeller oluşturmayı sağlar. Örneğin, bir kullanıcının "siparişler" alt koleksiyonu ve her siparişin "ürünler" alt koleksiyonu olabilir. Realtime Database'de bu tür derin iç içe yerleştirme, sorgular sırasında performans sorunlarına neden olur çünkü kökten gerekli düğüme kadar tüm yol yüklenir.
Firestore, gerçek zamanlı veri senkronizasyonu için istemci ve sunucu arasında kalıcı bir WebSocket bağlantısı kullanır. Bir uygulama, anlık görüntü dinleyicisi aracılığıyla bir belge veya koleksiyondaki değişikliklere abone olduğunda, SDK bir iletişim kanalı kurar ve sunucu veriler her değiştiğinde güncellemeler gönderir. İstemci, her seferinde tüm koleksiyonun tam anlık görüntüsünü değil, yalnızca değiştirilen belgeleri alır.
Senkronizasyon mekanizması bir olay akışına dayanır: added (belge göründü), modified (belge değişti) ve removed (belge silindi). Geliştirici her olayı ayrı ayrı işleyebilir ve yalnızca ilgili UI öğelerini güncelleyebilir. Bu, binlerce belge olsa bile yüksek performans sağlar çünkü yalnızca değiştirilen bileşenler yeniden oluşturulur.
Firestore'un en önemli avantajlarından biri, yerleşik çevrimdışı mod desteğidir. SDK, okunan tüm verileri otomatik olarak cihazda önbelleğe alır ve ağ olmadığında çalışmaya devam eder. Uygulama çevrimdışı modda veri yazdığında, yerel bir kuyruğa yerleştirilir ve bağlantı geri geldiğinde sunucuya gönderilir. Çakışma çözümü için last-write-wins stratejisi kullanılır.
val docRef = db.collection("cities").document("SF")
docRef.addSnapshotListener { snapshot, error ->
if (error != null) {
Log.w("TAG", "Dinleme hatası", error)
return@addSnapshotListener
}
if (snapshot != null && snapshot.exists()) {
Log.d("TAG", "Mevcut veriler: ${snapshot.data}")
}
}
Önbellek boyutu FirestoreSettings aracılığıyla yapılandırılabilir. Varsayılan değer 100 MB'dir ancak yoğun veri okuyan uygulamalar için artırılabilir. Uygulama yeniden başlatmalarından sonra da devam eden kalıcı disk önbellek modu da mevcuttur. Çevrimdışı modun kullanılabilirliğini yönetmek için enableNetwork ve disableNetwork yöntemleri kullanılır ve ağ etkileşimini geçici olarak devre dışı bırakmayı sağlar.
Firestore Security Rules, sunucu düzeyinde veri erişimini kontrol etmek için bildirimsel bir işaretleme dilidir. Kurallar, belgeleri kimlerin hangi koşullar altında okuyup yazabileceğini tanımlar. Sorgu yürütülmeden önce çalışırlar ve yetkilendirme için ayrı bir sunucu mantığı gerektirmezler. Kurallar, her veri okuma veya yazma işleminden önce Firebase tarafında kontrol edilir.
Erişim kuralları, izin (allow) ilkesine göre oluşturulur. Varsayılan olarak tüm erişim reddedilir. Geliştirici, belirli koşullar altında belirli işlemler (read, write, create, update, delete) için sırayla erişim açar. Koşullar, request.auth aracılığıyla kullanıcı kimlik doğrulamasını, request.resource aracılığıyla istek verilerini ve resource aracılığıyla mevcut verileri kontrol edebilir.
// Firestore erişim kuralları
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Kullanıcı yalnızca kendi verilerini okur ve yazar
match /users/{userId} {
allow read, write: if
request.auth != null &&
request.auth.uid == userId;
}
// Kimliği doğrulanmış herhangi bir kullanıcı gönderileri okuyabilir
match /posts/{postId} {
allow read: if request.auth != null;
allow create: if request.auth != null
&& request.resource.data.author == request.auth.uid;
}
}
}
Erişim kontrolünün yanı sıra, Security Rules yazılan verilerin yapısını ve türlerini doğrulamaya olanak tanır. Örneğin, e-posta alanının düzenli bir ifadeyle eşleşip eşleşmediği veya yaşın 120 yılı aşmadığı kontrol edilebilir. Doğrulama, yazma işleminden önce gerçekleştirilir ve sunucuda hatalı verilerin kaydedilmesini önler. Alan doğrulaması için, yazılmakta olan belgenin tamamını içeren request.resource.data nesnesi kullanılır.
Firestore ayrıca, istemci erişimi olmadan yalnızca Admin SDK aracılığıyla sunucu tarafında yazılabilen koleksiyonları da destekler. Bu, kullanıcılar tarafından görülmemesi gereken hizmet bilgilerini, API anahtarlarını ve yapılandırmaları depolamak için kullanışlıdır. Bunun için, kurallarda ilgili koleksiyonlardaki tüm istemci işlemlerini reddetmek ve yalnızca sunucu tarafından Admin SDK aracılığıyla erişime izin vermek yeterlidir.
Bir yapılacaklar listesi (todo) oluşturmak için Firestore'u bir Android uygulamasına entegre etme örneğine bakalım. Uygulama, görevleri gerçek zamanlı olarak okuyacak, yenilerini ekleyecek ve tamamlananları işaretleyecektir. Zaman uyumsuz çalışma için Firebase geri arama arayüzleri ve Kotlin coroutine'leri kullanılır.
Başlamadan önce, Firebase Console aracılığıyla projeyi Firebase'e bağlamak ve google-services.json dosyasını uygulama modülüne eklemek gerekir. Ardından, build.gradle dosyasına firebase-firestore-ktx bağımlılığı ve google-services eklentisi eklenir. Kütüphane sürümü, tüm Firebase bileşenlerinin birbiriyle uyumluluğu için mevcut Firebase BoM sürümüne karşılık gelmelidir.
dependencies {
// Firebase BoM — sürüm yönetimi
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"
}
Kurulumdan sonra, bir Task veri modeli ve Firestore ile çalışmak için bir depo oluşturulur. Model, id, title, isCompleted ve timestamp alanlarını içerir. Firestore, alan adlarını anahtar olarak kullanarak veri sınıfını otomatik olarak bir belgeye serileştirir. Verileri okumak için, snapshotFlow uzantısı aracılığıyla bir Flow döndüren bir anlık görüntü dinleyicisi kullanılır.
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))
}
}
ViewModel, depodan Flow'u abone olur ve görev listesini UI düzeyine iletir. Yeni bir görev eklendiğinde, deponun suspend işlevi bir coroutine kapsamı aracılığıyla çağrılır. Firestore, değişiklikleri tüm istemciler arasında otomatik olarak senkronize eder: bir kullanıcı görev eklerse, diğerleri ekranı yenilemeden gerçek zamanlı olarak görür.
Sıkça Sorulan Sorular
Firestore, esnek şemaya sahip, tabloları ve JOIN sorguları olmayan bir NoSQL veritabanıdır. Veriler, tablo satırlarında değil, belge koleksiyonlarında depolanır. SQL'in aksine, Firestore önceden tanımlanmış bir şema gerektirmez ve geçişler olmadan otomatik olarak ölçeklenir, ancak koleksiyonlar arasında karmaşık işlem sorgularını desteklemez.
Firestore cömert bir ücretsiz limite (Spark planı) sahiptir: günde 50.000 okuma, 20.000 yazma ve 20.000 silme. Bunu aştıktan sonra, kullandıkça öde Blaze planı uygulanır: 100.000 okuma başına $0,06 ve 100.000 yazma başına $0,18. Fiyat, bölgeye ve aktarılan veri hacmine bağlıdır.
Firestore, çakışma çözümü için last-write-wins stratejisini kullanır: bir belgeye yapılan son yazma, öncekinin tamamen yerini alır. Daha hassas kontrol için, birden çok belge üzerinde işlem yaparken bütünlüğü garanti eden işlemler (atomik okuma-yazma işlemleri) ve toplu yazmalar mevcuttur.
Evet, Firestore, Firebase Console veya gcloud CLI aracılığıyla veri dışa ve içe aktarmayı destekler. Dışa aktarma Cloud Firestore Export biçiminde yapılır ve Google Cloud Storage'da saklanır. Veriler Firebase projeleri arasında taşınabilir veya BigQuery ve diğer araçlarda analiz için dışa aktarılabilir.
Firestore yerleşik tam metin aramaya sahip değildir. Bu görev için Google, Algolia veya Meilisearch ile entegrasyon veya Elasticsearch ile Cloud Functions kullanılmasını önerir. Firestore'un yerleşik sorguları, alt dize araması olmadan yalnızca eşitlik, aralık ve alan varlığı kontrollerini destekler.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun