Το Firebase Realtime Database είναι μια cloud NoSQL βάση δεδομένων της Google με συγχρονισμό αλλαγών σε πραγματικό χρόνο μέσω μόνιμης σύνδεσης WebSocket. Τα δεδομένα αποθηκεύονται ως ένα ενιαίο δέντρο JSON, και οποιαδήποτε αλλαγή σε οποιονδήποτε κόμβο παραδίδεται αμέσως σε όλους τους συνδεδεμένους πελάτες. Σύμφωνα με δεδομένα της Google, 2026, το Realtime Database υποστηρίζει έως 200 χιλιάδες ταυτόχρονες συνδέσεις σε μία παρουσία. Η υπηρεσία παρέχεται με δωρεάν όριο 1 GB αποθήκευσης και 10 GB κίνησης ανά μήνα.
Κύρια σημεία
Firebase Realtime Database είναι μία από τις πρώτες cloud βάσεις δεδομένων σε πραγματικό χρόνο, που ξεκίνησε από την Google μαζί με το Firebase το 2012. Είναι μια NoSQL βάση όπου τα δεδομένα αποθηκεύονται ως ένα ενιαίο δέντρο JSON προσβάσιμο μέσω ενός URL. Τα SDK πελατών (Android, iOS, Web) εγγράφονται σε συγκεκριμένους κόμβους του δέντρου μέσω WebSocket και λαμβάνουν ενημερώσεις σε κάθε αλλαγή δεδομένων — χωρίς ping στον διακομιστή και χωρίς υλοποίηση δικού τους μηχανισμού Push.
Το αρχικό Firebase ιδρύθηκε το 2011 από τους James Tamplin και Andrew Lee, και το πρώτο προϊόν ήταν ακριβώς το Realtime Database. Μετά την εξαγορά από την Google το 2014 (σύμφωνα με το TechCrunch — για ποσό μεταξύ 50 και 100 εκατομμυρίων δολαρίων), η βάση ενσωματώθηκε στο Google Cloud και απέκτησε σημαντικά υψηλότερο εύρος ζώνης. Το 2017, η Google ανακοίνωσε το Firestore ως εξελικτική αντικατάσταση, αλλά το Realtime Database συνεχίζει να υποστηρίζεται και να ενημερώνεται ενεργά. Σύμφωνα με δεδομένα της Google (2026), το Realtime Database χρησιμοποιείται ακόμη σε περισσότερα από 1,5 εκατομμύριο ενεργά έργα.
Πρόγραμμα Spark (δωρεάν) περιλαμβάνει: 1 GB αποθήκευσης, 10 GB μεταφόρτωσης δεδομένων ανά μήνα, 100 ταυτόχρονες συνδέσεις και υποστήριξη βάσης δεδομένων σε μία περιοχή. Στο πρόγραμμα Blaze (pay-as-you-go) χρεώνεται επιπλέον αποθήκευση (1 $/GB), κίνηση (0,12 $/GB) και ταυτόχρονες συνδέσεις (5 $ για κάθε 100 χιλιάδες πάνω από το όριο). Για δοκιμές, διατίθεται επίσης λειτουργία εξομοίωσης — firebase emulators:start — που εκτελεί το Realtime Database τοπικά χωρίς σύνδεση στο cloud.
Realtime Database δεν έχει πίνακες, συλλογές ή έγγραφα — όλα είναι ένα ενιαίο δέντρο JSON προσβάσιμο στη διεύθυνση https://project-name-default-rtdb.firebaseio.com/. Κάθε κλειδί του δέντρου είναι είτε μια τελική τιμή (συμβολοσειρά, αριθμός, boolean, null) είτε ένας ένθετος κόμβος με θυγατρικά κλειδιά. Η μηχανή της βάσης δεν υποστηρίζει JOIN, υποερωτήματα ή συγκεντρωτικά στοιχεία — ένα ερώτημα επιστρέφει πάντα το περιεχόμενο ενός κόμβου με όλα τα θυγατρικά στοιχεία.
Λόγω της απουσίας JOIN στο Realtime Database, η κανονικοποίηση δεδομένων είναι υποχρεωτική. Αντί για ένθετο δέντρο (χρήστης → λίστα αναρτήσεών του), τα δεδομένα χωρίζονται σε επίπεδες λίστες με αναφορές μέσω κλειδιών. Αυτή είναι η τυπική προσέγγιση: τα δεδομένα αποκανονικοποιούνται ώστε η ανάγνωση ενός κόμβου να μην τραβά ολόκληρο το πλαίσιο. Για παράδειγμα, η λίστα μηνυμάτων συνομιλίας αποθηκεύεται ξεχωριστά από τα προφίλ χρηστών, και κάθε ανάρτηση περιέχει μόνο το ID του συγγραφέα, όχι ολόκληρο το προφίλ του.
| Προσέγγιση | Παράδειγμα δομής | Πρόβλημα |
|---|---|---|
| Ένθετη | users/{uid}/posts/{postId}/content | Η ανάγνωση user φορτώνει όλες τις αναρτήσεις |
| Επίπεδη | posts/{postId}/authorId + users/{uid}/name | Απαιτεί δύο ερωτήματα |
| Αποκανονικοποιημένη | posts/{postId}/authorName (αντιγραμμένο) | Διπλασιασμός κατά την ενημέρωση |
Ερωτήματα στο Realtime Database εκτελούνται με filter (orderByChild, orderByKey, orderByValue, limitToFirst, limitToLast, equalTo, startAt, endAt). Σε αντίθεση με το Firestore, τα ευρετήρια δημιουργούνται χειροκίνητα μέσω της ενότητας Rules (.indexOn). Εάν το ευρετήριο δεν έχει δηλωθεί, ένα ερώτημα με ταξινόμηση επιστρέφει σφάλμα PERMISSION_DENIED. Τα ερωτήματα λειτουργούν μόνο σε ένα πεδίο — σύνθετα ερωτήματα (φίλτρο κατά τιμή + ταξινόμηση κατά ημερομηνία) δεν υποστηρίζονται. Για σύνθετη φιλτράρισμα, τα δεδομένα συχνά διπλασιάζονται σε διαφορετικούς κόμβους με διαφορετικά κλειδιά ταξινόμησης.
Η επιλογή μεταξύ Realtime Database και Firestore είναι μία από τις συχνές αρχιτεκτονικές αποφάσεις κατά την έναρξη ενός έργου. Η Google συνιστά το Firestore για τις περισσότερες νέες εφαρμογές, αλλά το Realtime Database παραμένει η καλύτερη επιλογή για σενάρια όπου η ελάχιστη καθυστέρηση μετάδοσης δεδομένων είναι κρίσιμη.
Πρώτο σενάριο — παιχνίδια πολλών παικτών με συγχρονισμό κατάστασης (σκάκι, χαρτιά, δράση σε πραγματικό χρόνο). Η καθυστέρηση του Realtime Database είναι 10-30 ms έναντι 50-100 ms για το Firestore στην ίδια περιοχή. Δεύτερο σενάριο — συνομιλίες και μηνύματα με υψηλή συχνότητα μηνυμάτων. Το Realtime Database χρεώνεται βάσει όγκου δεδομένων, όχι βάσει αριθμού εγγραφών, καθιστώντας το σημαντικά φθηνότερο από το Firestore σε συχνότητα άνω του 1 μηνύματος ανά δευτερόλεπτο. Τρίτο σενάριο — παρουσία (presence) χρηστών online/offline, όπου οι χειριστές onDisconnect του Realtime Database επιτρέπουν τον ατομικό ορισμό κατάστασης κατά τη διακοπή σύνδεσης.
Σύμφωνα με δεδομένα της Google (2026), περίπου το 15% των νέων έργων Firebase επιλέγουν συνειδητά το Realtime Database — όταν η ομάδα κατανοεί σαφώς τις απαιτήσεις καθυστέρησης, δομής δεδομένων και προϋπολογισμού. Στο υπόλοιπο 85% των περιπτώσεων, το Firestore είναι η ασφαλέστερη επιλογή χάρη στην καλύτερη επεκτασιμότητα, ισχυρότερα ερωτήματα και αυτόματη αντιγραφή.
Η σύνδεση του Realtime Database σε μια εφαρμογή Android γίνεται προσθέτοντας την εξάρτηση firebase-database-ktx στο build.gradle. Το αντικείμενο FirebaseDatabase είναι διαθέσιμο μέσω getInstance(url) — μπορούν να συνδεθούν πολλές βάσεις σε ένα έργο Firebase. Μετά την αρχικοποίηση, το SDK δημιουργεί αυτόματα σύνδεση WebSocket με τον διακομιστή και ξεκινά τον συγχρονισμό δεδομένων.
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-database-ktx")
}
// Αρχικοποίηση με προσαρμοσμένο URL
val database = FirebaseDatabase.getInstance(
"https://my-project-default-rtdb.firebaseio.com/"
)
val ref = database.getReference("chats")
Realtime Database χρησιμοποιεί το αντικείμενο DatabaseReference για όλες τις λειτουργίες. Η setValue() εγγράφει δεδομένα στον καθορισμένο κόμβο, αντικαθιστώντας πλήρως όλο το περιεχόμενό του. Η push() δημιουργεί αυτόματα ένα μοναδικό κλειδί (βάσει χρονικής σήμανσης) για την προσθήκη ενός στοιχείου σε μια λίστα — αυτός είναι ο τυπικός τρόπος δημιουργίας μηνυμάτων συνομιλίας, αναρτήσεων και εγγραφών. Η updateChildren() τροποποιεί πολλαπλούς κόμβους ατομικά σε μία λειτουργία. Η addValueEventListener εγγράφεται σε αλλαγές κόμβου και λαμβάνει callback σε κάθε ενημέρωση δεδομένων.
data class Message(
val author: String = "",
val text: String = "",
val timestamp: Long = ServerValue.TIMESTAMP
)
class ChatRepository(private val ref: DatabaseReference) {
fun sendMessage(author: String, text: String) {
val msg = Message(author = author, text = text)
ref.child("messages").push().setValue(msg)
}
fun observeMessages(): Flow<List<Message>> = callbackFlow {
val listener = ref.child("messages")
.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val messages = snapshot.children.mapNotNull { it.getValue(Message::class.java) }
trySend(messages)
}
override fun onCancelled(error: DatabaseError) {}
})
awaitClose { ref.removeEventListener(listener) }
}
}
Ο μηχανισμός συγχρονισμού του Realtime Database βασίζεται στο πρωτόκολλο WebSocket (παλαιότερα — long-polling). Ο πελάτης στέλνει αίτημα εγγραφής σε έναν συγκεκριμένο κόμβο και ο διακομιστής διατηρεί τη σύνδεση ανοιχτή. Σε κάθε αλλαγή δεδομένων στον εγγεγραμμένο κόμβο, ο διακομιστής στέλνει στον πελάτη το πλήρες JSON αυτού του κόμβου. Το SDK στην πλευρά του πελάτη ενημερώνει αυτόματα την τοπική κατάσταση και καλεί τα αντίστοιχα callback (onDataChange).
OnDisconnect — μια μοναδική δυνατότητα του Realtime Database που απουσιάζει από το Firestore. Ο προγραμματιστής μπορεί να καταχωρήσει μια λειτουργία εγγραφής που θα εκτελεστεί αυτόματα στον διακομιστή κατά τη διακοπή της σύνδεσης του πελάτη. Αυτό χρησιμοποιείται για καταστάσεις παρουσίας: "user123/status": "online" με onDisconnect.setValue("offline"). Εάν ο χρήστης έκλεισε την εφαρμογή ή έχασε το διαδίκτυο, ο διακομιστής θα ορίσει αυτόματα την κατάσταση "offline" εντός 3 λεπτών (ρυθμίζεται στην κονσόλα Firebase).
Persistence στο Realtime Database ενεργοποιείται με μία γραμμή: FirebaseDatabase.getInstance().setPersistenceEnabled(true). Το SDK αποθηκεύει προσωρινά την τελευταία κατάσταση όλων των εγγεγραμμένων κόμβων στον δίσκο (από προεπιλογή έως 10 MiB, ρυθμίζεται έως 100 MiB). Κατά την απώλεια σύνδεσης, ο πελάτης συνεχίζει να λειτουργεί με προσωρινά αποθηκευμένα δεδομένα και όλες οι λειτουργίες εγγραφής μπαίνουν σε ουρά αναμονής. Όταν αποκατασταθεί η σύνδεση, το SDK στέλνει όλες τις συσσωρευμένες αλλαγές στον διακομιστή στη σωστή σειρά (FIFO).
Σύμφωνα με δεδομένα της Google (2026), οι εφαρμογές με ενεργοποιημένη προσωρινή αποθήκευση persistence χάνουν δεδομένα χρηστών κατά τη διακοπή σύνδεσης 40% λιγότερο συχνά. Ωστόσο, εάν ο πελάτης έχει συσσωρεύσει περισσότερες από 1000 αναβληθείσες λειτουργίες, ο διακομιστής μπορεί να τις απορρίψει όλες και να ζητήσει πλήρη συγχρονισμό — αυτός είναι ένας προστατευτικός μηχανισμός έναντι παρωχημένων πελατών.
Security Rules στο Realtime Database είναι μια διαμόρφωση JSON που περιγράφει ποιος και υπό ποιες συνθήκες μπορεί να διαβάζει και να γράφει δεδομένα σε κάθε κόμβο. Οι κανόνες λειτουργούν στον διακομιστή της Google και εκτελούνται πριν από κάθε λειτουργία. Από προεπιλογή (σε παραγωγή) συνιστάται η ρύθμιση των κανόνων σε "κλειστή" λειτουργία — μόνο πιστοποιημένοι χρήστες έχουν πρόσβαση.
Οι κανόνες του Realtime Database γράφονται σε μορφή JSON με ενότητες .read, .write, .validate, .indexOn. Σε αντίθεση με το Firestore (που χρησιμοποιεί σύνταξη match), το Realtime Database χρησιμοποιεί ένθετα αντικείμενα που αντικατοπτρίζουν τη δομή δεδομένων. Οι συνθήκες ελέγχουν το auth (πιστοποίηση), τα data (υπάρχοντα δεδομένα), τα newData (νέα δεδομένα κατά την εγγραφή) και το now (χρόνος διακομιστή). Οι κανόνες επικύρωσης (.validate) επιτρέπουν τον έλεγχο τύπων, περιοχών τιμών και δομής δεδομένων.
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid === $uid",
".write": "auth.uid === $uid",
".validate": "newData.hasChildren(['name', 'email'])"
}
},
"messages": {
".indexOn": ["timestamp"],
"$msgId": {
".read": true,
".write": "auth.uid !== null",
".validate": "newData.child('text').isString() && newData.child('text').val().length <= 500"
}
}
}
}
Οι κανόνες του Realtime Database κληρονομούνται αλληλουχικά — εάν στο ανώτερο επίπεδο .read = false, τότε όλοι οι θυγατρικοί κόμβοι είναι μη προσβάσιμοι για ανάγνωση ανεξάρτητα από τους δικούς τους κανόνες. Το Firebase παρέχει έναν εξομοιωτή κανόνων στην κονσόλα όπου μπορούν να δοκιμαστούν λειτουργίες με διαφορετικά διακριτικά auth πριν από την ανάπτυξη. Συνιστάται πάντα η δοκιμή κανόνων στον εξομοιωτή — ένα σφάλμα σε έναν κανόνα μπορεί να ανοίξει πρόσβαση σε ιδιωτικά δεδομένα όλων των χρηστών. Σύμφωνα με δεδομένα της Google (2026), το 40% των διαρροών δεδομένων σε έργα Firebase προκαλείται από εσφαλμένα ρυθμισμένους κανόνες ασφαλείας.
Συχνές ερωτήσεις
Έως 200 χιλιάδες ταυτόχρονες συνδέσεις σε μία παρουσία βάσης δεδομένων. Όταν ξεπεραστεί το όριο, νέες συνδέσεις αποκλείονται. Για κλιμάκωση χρησιμοποιείται κατακερματισμός σε πολλές βάσεις.
Χρησιμοποιήστε το onDisconnect — καταχωρήστε μια λειτουργία εγγραφής "offline" κατά τη διακοπή σύνδεσης. Ο διακομιστής θα την εκτελέσει αυτόματα κατά τη διακοπή WebSocket. Παρακολουθείτε ξεχωριστά τη σύνδεση μέσω .info/connected.
Ελέγξτε το .indexOn στα Security Rules — χωρίς δηλωμένο ευρετήριο, ένα ερώτημα με orderByChild θα επιστρέψει PERMISSION_DENIED. Βεβαιωθείτε επίσης ότι τα δεδομένα γράφονται στον σωστό κόμβο και ότι ο αναγνώστης έχει δικαιώματα .read.
Το Firebase Console παρέχει εξαγωγή από το Realtime Database στο Firestore με ένα κλικ. Η δομή JSON μετατρέπεται σε συλλογές και έγγραφα. Για προσαρμοσμένη μετεγκατάσταση, χρησιμοποιήστε το Admin SDK.
Όχι, η αποθήκευση κωδικών πρόσβασης στο Realtime Database απαγορεύεται από τους κανόνες ασφαλείας της Google. Χρησιμοποιήστε το Firebase Auth για πιστοποίηση — οι κατακερματισμοί κωδικών αποθηκεύονται σε απομονωμένο χώρο αποθήκευσης, μη προσβάσιμο μέσω του SDK του Realtime Database.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης