Firebase Realtime Database — 2012-ci ildə Google tərəfindən mobil və web tətbiqlər üçün yaradılmış bulud JSON real vaxt məlumat bazasıdır. Bütün məlumatlar bir böyük JSON ağacında saxlanılır və WebSocket əlaqəsi vasitəsilə qoşulmuş müştərilər arasında real vaxtda sinxronlaşdırılır. Rəsmi sənədlərə Firebase, 2025 əsasən, Realtime Database 200 000-ə qədər eyni vaxtlı əlaqə və saniyədə 1000-ə qədər yazma əməliyyatını dəstəkləyir. Məlumat bazası server infrastrukturu tələb etmir və iOS, Android, Web və server platformaları üçün SDK təqdim edir.
Başlıca məqamlar
Firebase Realtime Database — bütün qoşulmuş müştərilər arasında məlumatları real vaxtda saxlayan və sinxronlaşdıran bulud NoSQL məlumat bazasıdır. 2012-ci ildə Firebase kimi (Google tərəfindən satın alınmazdan əvvəl) yaradılmışdır və mobil tərtibatçılar üçün ilk bulud real vaxt məlumat bazası olmuşdur. Məlumatlar JSON formatında təqdim edilir və hər bir qovşağın unikal yolu olan iyerarxik ağaca təşkil olunur.
Realtime Database-in əsas dəyəri — daxili sinxronizasiyadır. Tətbiq hər hansı bir cihazda məlumatları dəyişdikdə, bütün digər qoşulmuş müştərilər daimi əlaqə vasitəsilə dərhal yeniləmə alırlar. Bu, tərtibatçını öz sinxronizasiya mexanizmini, WebSocket serverini və ya müştərilər arasında məlumat ötürmək üçün REST API-ni tətbiq etməkdən azad edir.
Məlumat bazası bütün əsas platformalar üçün SDK təqdim edir: Android (Java, Kotlin), iOS (Swift, Objective-C), Web (JavaScript) və Admin SDK vasitəsilə server mühitləri. Google məlumatlarına görə, Realtime Database bütün dünyada 1,5 milyondan çox aktiv Firebase layihəsində istifadə olunur. Daha müasir Firestore-un yaranmasına baxmayaraq, Realtime Database sadə məlumat strukturu olan layihələr üçün məşhur seçim olaraq qalır.
Relyasiya məlumat bazalarından fərqli olaraq, Realtime Database cədvəl və sətirlərdən istifadə etmir. Bütün məlumatlar iç-içə JavaScript obyektlərinə bənzəyən bir JSON ağacını təşkil edir. Məsələn, istifadəçiləri və onların mesajlarını saxlamaq üçün iyerarxiya yaradılır: users/userId/name və messages/messageId/text. Ağacdakı hər bir yol sətirdir və məlumatlara bu yol vasitəsilə birbaşa daxil olmaq olar.
{
"users": {
"user1": {
"name": "Ivan Petrov",
"email": "ivan@example.com"
},
"user2": {
"name": "Mariya Sokolova",
"email": "maria@example.com"
}
},
"messages": {
"-Nabc123": {
"text": "Salam!",
"userId": "user1"
}
}
}
Əhəmiyyətli xüsusiyyət — dərin iç-içəlik performansa təsir edir. Tətbiq müəyyən bir yol üzrə məlumatları oxuyarkən, həmin yolun bütün uşaq qovşaqlarını yükləyir. Buna görə məlumat strukturunu mümkün qədər düz, 3–4 səviyyədən dərin iç-içəlikdən qaçaraq dizayn etmək tövsiyə olunur. Bu problemi həll etmək üçün məlumatların denormalizasiyası tətbiq olunur — məlumatların ağacın müxtəlif qovşaqlarında təkrarlanması.
Realtime Database və Firestore tez-tez Google-dan iki bulud real vaxt məlumat bazası kimi müqayisə edilir. Onlar arasında seçim layihənin xüsusi tələblərindən asılıdır: sorğuların mürəkkəbliyi, tələb olunan ardıcıllıq və planlaşdırılan yük. Hər bir bazanın güclü tərəflərini başa düşmək düzgün arxitektura qərarı verməyə kömək edir.
Realtime Database-in əsas üstünlüyü aşağı sinxronizasiya gecikməsidir. Bütün məlumatlar əlavə abstraksiya qatları olmadan bir JSON ağacında saxlanıldığı üçün sinxronizasiya Firestore-dan daha sürətlidir. Yeniləmələrin çatdırılma sürətinin kritik olduğu tətbiqlər üçün (söhbətlər, onlayn oyunlar, birgə redaktə sistemləri) Realtime Database daha uyğun seçim ola bilər.
Realtime Database sadə məlumat strukturu və yüksək yeniləmə tezliyi olan ssenarilər üçün daha uyğundur. Tipik nümunələr: söhbətlər, real vaxtda bəyənmələr, yazı göstəriciləri, istifadəçi varlıq statusları. Bu həm də məhdud büdcəli prototiplər və layihələr üçün yaxşı seçimdir, çünki qiymətləndirmə əməliyyatların sayına deyil, məlumatların həcminə əsaslanır.
Digər tərəfdən, mürəkkəb sorğulu tətbiqlər üçün (bir neçe sahə üzrə filtrləmə, sıralama, aqreqasiya) Firestore daha güclü imkanlar təqdim edir. Realtime Database yalnız bir parametr üzrə filtrləməni dəstəkləyir və nəticləri eyni anda bir neçə sahə üzrə sıralaya bilmir. Layihə müştəri tərəfdə mürəkkəb məlumat analitikası planlaşdırırsa, Firestore daha praktik seçim olacaqdır.
Realtime Database ikitərəfli məlumat sinxronizasiyası üçün daimi WebSocket əlaqəsindən istifadə edir. Müştəri müəyyən bir yolda setValue və ya updateChildren çağırdıqda, məlumatlar açıq kanal vasitəsilə Firebase serverinə göndərilir. Server dəyişiklikləri tətbiq edir və yeniləmələri millisaniyələr ərzində bütün abunə olmuş müştərilərə yayır. Hər bir əlaqə unikal sessiya açarı ilə müyyənləşdirilir.
Abunə mexanizmi listenerlər vasitəsilə işləyir. Tərtibatçı müəyyən bir qovşağın dəyişməsinə abunə ola (addListenerForSingleValueEvent) və ya daimi yeniləmələr ala bilər (addValueEventListener). Hər məlumat dəyişikliyində göstərilən yol üzrə tam məlumat anı görüntüsü ilə onDataChange callback-i çağırılır. Bu, Firestore-dan fərqlidir — orada yalnız dəyişdirilmiş sənədlər gəlir, Realtime Database-də isə həmişə qovşağın bütün məlumatları yüklənir.
Realtime Database disk keşi vasitəsilə Android və iOS-da oflayn rejimi dəstəkləyir. SDK məlumatların yerli sürümünü saxlayır və şəbəkə olmadıqda yazma əməliyyatlarını emal etməyə davam edir. Əlaqə bərpa edildikdə, bütün yığılmış dəyişikliklər serverə göndərilir. Konfliktləri həll etmək üçün last-write-wins strategiyası istifadə olunur, lakin tərtibatçı toqquşmaları həll etmək üçün ServerValue.TIMESTAMP vasitəsilə fərdi məntiq tətbiq edə bilər.
val database = FirebaseDatabase.getInstance()
val myRef = database.getReference("messages")
// Məlumat yazılışı
myRef.push().setValue(
hashMapOf(
"text" to "Yeni mesaj",
"timestamp" to ServerValue.TIMESTAMP
)
)
// Daimi yeniləmə ilə oxu
myRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val data = snapshot.getValue()
Log.d("TAG", "Məlumatlar: $data")
}
override fun onCancelled(error: DatabaseError) {
Log.w("TAG", "Xəta: ${error.message}")
}
})
Trafik və performans optimallaşdırma üçün müəyyən uşaq qovşaqların dəyişikliklərini izləmək lazım olduqda, value listeners əvəzinə child listeners istifadə etmək tövsiyə olunur. ChildEventListener uşaq elementlərin əlavə edilməsi, dəyişdirilməsi, silinməsi və daşınması üçün ayrı callbacklər təqdim edir ki, bu da UI yeniləmələrini daha dəqiq idarə etməyə və hər məlumat dəyişikliyində bütün siyahı elementlərinin yenidən çəkilməsinin qarşısını almağa imkan verir.
Realtime Database məlumatlara girişi idarə etmək üçün deklarativ qayda dilindən istifadə edir. Qaydalar JSON ağacının hər bir yolu üzrə məlumatları kimin oxuya və yaza biləcəyini təsvir edir. Onlar hər sorğudan əvvəl Firebase serverində yoxlanılır və icazə üçün server məntiqi tələb etmir. Qaydalar elastik giriş konfiqurasiyası üçün dəyişənləri, daxili obyektləri və funksiyaları dəstəkləyir.
Əvvəlcədən məlumat bazasına giriş bütün istifadəçilər üçün qadağandır. Tərtibatçı ağacın müxtəlif səviyyələrində ".read" və ".write" qaydalarından istifadə edərək tədricən giriş açır. Şərtlər auth dəyişəni vasitəsilə autentifikasiyanı, sorğu növünü (read/write) və data obyekti vasitəsilə mövcud məlumatları yoxlaya bilər. Bundan əlavə, qaydalar newData obyekti vasitəsilə yazılan məlumatların validasiyasını dəstəkləyir.
{
"rules": {
"users": {
"$uid": {
// Yalnız sahib öz məlumatlarını oxuya bilər
".read": "$uid === auth.uid",
// Yalnız sahib yaza bilər
".write": "$uid === auth.uid",
// Yazarkən sahə validasiyası
".validate": "newData.hasChildren(['name', 'email'])"
}
},
"messages": {
// İstənilən autentifikasiya olunmuş şəxs oxuya bilər
".read": "auth !== null",
// Yalnız autentifikasiya olunmuş şəxs yaza bilər
".write": "auth !== null",
".indexOn": ["timestamp"]
}
}
}
Qaydalar həmçinin ".indexOn" direktivi vasitəsilə məlumatların indekslənməsini dəstəkləyir. Olmazsa, sıralama ilə sorğular (orderByChild) rədd ediləcək və ya səmərəsiz yerinə yetiriləcək. İndekslər müəyyən bir sahə üzrə sıralamanın aparıldığı hər bir yol üçün göstərilir. Qaydalar kaskaddır: daha dərin qaydalar valideyn qaydalarını ləğv edir və əgər hansısa səviyyədə giriş yoxdursa, valideyn qaydasından asılı olaraq icazə verilmiş və ya qadağan edilmiş hesab olunur.
Realtime Database beş məlumat növünü dəstəkləyir: String, Number, Boolean, Map (obyekt) və List (massiv). İç-içəlik dərinliyi 32 səviyyə ilə məhdudlaşdırılıb və bir qovşağın maksimum ölçüsü 256 MB-dır. Baza ilə səmərəli işləmək üçün düz məlumat strukturu dizayn etmək və böyük həcmdə məlumat yükləyən dərin sorğulardan qaçmaq üçün denormalizasiyadan istifadə etmək tövsiyə olunur.
Statuslar üçün (online/offline) Android tətbiqində Realtime Database inteqrasiyasının praktik nümunəsini nəzərdən keçirək. Tətbiq istifadəçilərin siyahısını onların real vaxtda yenilənən cari statusu ilə göstərəcək. Nümayiş üçün istifadəçiləri müyyənləşdirmək üçün Firebase Authentication və asinxron əməliyyatlar üçün korutinlər istifadə olunur.
Əvvəlcə, tətbiq modulunun build.gradle faylına firebase-database-ktx asılılığını əlavə edin. Kitabxana versiyası bütün komponentlərin uyğunluğunu təmin etmək üçün Firebase BoM vasitəsilə idarə olunur. Asılılığı əlavə etdikdən sonra Firebase-i Application sinfində və ya ViewModel-də tənbəl işəsalma vasitəsilə işə salmaq lazımdır.
dependencies {
implementation platform("com.google.firebase:firebase-bom:33.0.0")
implementation "com.google.firebase:firebase-database-ktx"
implementation "com.google.firebase:firebase-auth-ktx"
}
Qurulumdan sonra istifadəçilərlə işləmək üçün repozitoriya yaradılır. Hər bir istifadəçi /users/{uid} qovşağında name, email və status sahələri ilə təmsil olunur. Statusu izləmək üçün onDisconnect — müştəri əlaqəsi kəsildikdə avtomatik olaraq yazma əməliyyatını yerinə yetirən xüsusi Firebase mexanizmi istifadə olunur. Bu, tətbiq bağlandıqda və ya şəbəkə itirildikdə müştəri tərəfində əlavə kod olmadan istifadəçi statusunun "offline" olaraq dəyişməsini təmin edir.
class PresenceRepository {
private val database = FirebaseDatabase.getInstance()
private val auth = FirebaseAuth.getInstance()
private val presenceRef = database
.getReference("presence")
fun trackPresence() {
val uid = auth.currentUser?.uid ?: return
val userRef = presenceRef.child(uid)
userRef.onDisconnect().setValue("offline")
userRef.setValue("online")
}
fun getPresenceStream(): Flow<Map<String, String>> =
presenceRef.snapshotFlow()
.map { snapshot ->
(snapshot.value as? Map<*, *>)
?.mapKeys { it.key.toString() }
?.mapValues { it.value.toString() }
?: emptyMap()
}
}
Nümunənin əsas elementi onDisconnect-dir. Bu mexanizm müştəri əlaqəsi kəsildikdə serverdə yerinə yetiriləcək yazma əməliyyatını təyin etməyə imkan verir. Bu halda istifadəçi ayrıldıqda, onun statusu tətbiqin bağlanma hadisəsini emal etməyə ehtiyac olmadan avtomatik olaraq "offline" olaraq təyin edilir. Tətbiq qəzaya uğrayarsa, Firebase özü onDisconnect əməliyyatını yerinə yetirəcək və digər istifadəçilər düzgün statusu görəcəklər.
Tez-tez verilən suallar
Realtime Database məlumatları bir JSON ağacında saxlayır və daha aşağı sinxronizasiya gecikməsi təmin edir. Firestore sənəd kolleksiyalarından istifadə edir, mürəkkəb sorğuları və güclü ardıcıllığı dəstəkləyir. Realtime Database sadə söhbətlər və statuslar üçün daha yaxşıdır, Firestore — mürəkkəb məlumat strukturu və analitikası olan tətbiqlər üçün.
Realtime Database-də bir qovşağın maksimum ölçüsü 256 MB-dır. İç-içəlik dərinliyi 32 səviyyə ilə məhdudlaşdırılıb. Bir Firebase layihəsi üçün bir neçə Realtime Database məlumat bazası yaradıla bilər (Spark planında 5-ə qədər və Blaze planında 100-ə qədər), bu da məlumatları müxtəlif nüsxələr arasında bölməyə imkan verir.
Realtime Database Firebase Authentication ilə inteqrasiya edir. Təhlükəsizlik qaydalarında autentifikasiya olunmuş istifadəçinin uid-sini ehtiva edən auth dəyişəni mövcuddur. Tərtibatçı məlumat sahibinin uid uyğunluğunu yoxlayaraq JSON ağacının ayrı-ayrı qovşaqları səviyyəsində girişi məhdudlaşdıra bilər. Anonim və autentifikasiya olunmamış istifadəçilərin auth = null-dır.
Bəli, Realtime Database runTransaction metodu vasitəsilə əməliyyatları dəstəkləyir. Əməliyyat bir qovşaq üçün oxu-dəyişiklik-yazma əməliyyatının atomarlığını təmin edir. Eyni vaxtlı dəyişikliklər zamanı əməliyyat cari məlumatlarla təkrarlanır. Bu, sayıcılar, reytinqlər və məlumat ardıcıllığının vacib olduğu digər ssenarilər üçün faydalıdır.
Bəli, Realtime Database Android və iOS-da oflayn rejimi dəstəkləyir. SDK məlumatları lokal olaraq keşləyir və şəbəkə olmadıqda yazma əməliyyatlarını emal etməyə davam edir. Əlaqə bərpa edildikdən sonra bütün yığılmış dəyişikliklər serverlə sinxronlaşdırılır. Oflayn rejimi aktivləşdirmək üçün müvafiq qovşaqda keepSynced(true) metodundan istifadə olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun