Firebase Realtime Database: τι είναι, δομή JSON και συγχρονισμός

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-28 Χρόνος ανάγνωσης: 10 λεπ

Το Firebase Realtime Database είναι μια cloud NoSQL βάση δεδομένων της Google με συγχρονισμό αλλαγών σε πραγματικό χρόνο μέσω μόνιμης σύνδεσης WebSocket. Τα δεδομένα αποθηκεύονται ως ένα ενιαίο δέντρο JSON, και οποιαδήποτε αλλαγή σε οποιονδήποτε κόμβο παραδίδεται αμέσως σε όλους τους συνδεδεμένους πελάτες. Σύμφωνα με δεδομένα της Google, 2026, το Realtime Database υποστηρίζει έως 200 χιλιάδες ταυτόχρονες συνδέσεις σε μία παρουσία. Η υπηρεσία παρέχεται με δωρεάν όριο 1 GB αποθήκευσης και 10 GB κίνησης ανά μήνα.

Κύρια σημεία

  • Firebase Realtime Database — ένα cloud δέντρο JSON με συγχρονισμό αλλαγών σε πραγματικό χρόνο μέσω WebSocket.
  • Τα δεδομένα είναι διαθέσιμα εκτός σύνδεσης — το SDK αποθηκεύει προσωρινά την τελευταία κατάσταση και συγχρονίζεται όταν αποκατασταθεί η σύνδεση.
  • Υποστηρίζει έως 200 χιλιάδες ταυτόχρονες συνδέσεις σε μία παρουσία βάσης δεδομένων.
  • Δομή δεδομένων — ενιαίο δέντρο JSON, που απλοποιεί την ανάγνωση αλλά απαιτεί επίπεδη κανονικοποίηση για απόδοση.
  • Η τιμολόγηση βασίζεται στον όγκο δεδομένων και τον αριθμό ταυτόχρονων συνδέσεων, όχι στον αριθμό λειτουργιών.

Τι είναι το Firebase Realtime Database

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.

Δομή δεδομένων: δέντρο JSON και κανονικοποίηση

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

Ερωτήματα στο Realtime Database εκτελούνται με filter (orderByChild, orderByKey, orderByValue, limitToFirst, limitToLast, equalTo, startAt, endAt). Σε αντίθεση με το Firestore, τα ευρετήρια δημιουργούνται χειροκίνητα μέσω της ενότητας Rules (.indexOn). Εάν το ευρετήριο δεν έχει δηλωθεί, ένα ερώτημα με ταξινόμηση επιστρέφει σφάλμα PERMISSION_DENIED. Τα ερωτήματα λειτουργούν μόνο σε ένα πεδίο — σύνθετα ερωτήματα (φίλτρο κατά τιμή + ταξινόμηση κατά ημερομηνία) δεν υποστηρίζονται. Για σύνθετη φιλτράρισμα, τα δεδομένα συχνά διπλασιάζονται σε διαφορετικούς κόμβους με διαφορετικά κλειδιά ταξινόμησης.

Realtime Database vs Firestore: τι να επιλέξετε

Η επιλογή μεταξύ Realtime Database και Firestore είναι μία από τις συχνές αρχιτεκτονικές αποφάσεις κατά την έναρξη ενός έργου. Η Google συνιστά το Firestore για τις περισσότερες νέες εφαρμογές, αλλά το Realtime Database παραμένει η καλύτερη επιλογή για σενάρια όπου η ελάχιστη καθυστέρηση μετάδοσης δεδομένων είναι κρίσιμη.

Τρία βασικά σενάρια για το 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

Η σύνδεση του Realtime Database σε μια εφαρμογή Android γίνεται προσθέτοντας την εξάρτηση firebase-database-ktx στο build.gradle. Το αντικείμενο FirebaseDatabase είναι διαθέσιμο μέσω getInstance(url) — μπορούν να συνδεθούν πολλές βάσεις σε ένα έργο Firebase. Μετά την αρχικοποίηση, το SDK δημιουργεί αυτόματα σύνδεση WebSocket με τον διακομιστή και ξεκινά τον συγχρονισμό δεδομένων.

groovy
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 σε κάθε ενημέρωση δεδομένων.

kotlin
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 — ενεργοποιητές αποσύνδεσης

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 και εκτελούνται πριν από κάθε λειτουργία. Από προεπιλογή (σε παραγωγή) συνιστάται η ρύθμιση των κανόνων σε "κλειστή" λειτουργία — μόνο πιστοποιημένοι χρήστες έχουν πρόσβαση.

Δομή των rules

Οι κανόνες του Realtime Database γράφονται σε μορφή JSON με ενότητες .read, .write, .validate, .indexOn. Σε αντίθεση με το Firestore (που χρησιμοποιεί σύνταξη match), το Realtime Database χρησιμοποιεί ένθετα αντικείμενα που αντικατοπτρίζουν τη δομή δεδομένων. Οι συνθήκες ελέγχουν το auth (πιστοποίηση), τα data (υπάρχοντα δεδομένα), τα newData (νέα δεδομένα κατά την εγγραφή) και το now (χρόνος διακομιστή). Οι κανόνες επικύρωσης (.validate) επιτρέπουν τον έλεγχο τύπων, περιοχών τιμών και δομής δεδομένων.

javascript
{
  "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"
      }
    }
  }
}

Αλληλουχική συμπεριφορά και δοκιμή rules

Οι κανόνες του Realtime Database κληρονομούνται αλληλουχικά — εάν στο ανώτερο επίπεδο .read = false, τότε όλοι οι θυγατρικοί κόμβοι είναι μη προσβάσιμοι για ανάγνωση ανεξάρτητα από τους δικούς τους κανόνες. Το Firebase παρέχει έναν εξομοιωτή κανόνων στην κονσόλα όπου μπορούν να δοκιμαστούν λειτουργίες με διαφορετικά διακριτικά auth πριν από την ανάπτυξη. Συνιστάται πάντα η δοκιμή κανόνων στον εξομοιωτή — ένα σφάλμα σε έναν κανόνα μπορεί να ανοίξει πρόσβαση σε ιδιωτικά δεδομένα όλων των χρηστών. Σύμφωνα με δεδομένα της Google (2026), το 40% των διαρροών δεδομένων σε έργα Firebase προκαλείται από εσφαλμένα ρυθμισμένους κανόνες ασφαλείας.

Συχνές ερωτήσεις

Πόσες ταυτόχρονες συνδέσεις αντέχει το Realtime Database;

Έως 200 χιλιάδες ταυτόχρονες συνδέσεις σε μία παρουσία βάσης δεδομένων. Όταν ξεπεραστεί το όριο, νέες συνδέσεις αποκλείονται. Για κλιμάκωση χρησιμοποιείται κατακερματισμός σε πολλές βάσεις.

Πώς υλοποιείται η παρουσία χρηστών online/offline;

Χρησιμοποιήστε το onDisconnect — καταχωρήστε μια λειτουργία εγγραφής "offline" κατά τη διακοπή σύνδεσης. Ο διακομιστής θα την εκτελέσει αυτόματα κατά τη διακοπή WebSocket. Παρακολουθείτε ξεχωριστά τη σύνδεση μέσω .info/connected.

Γιατί τα ερωτήματά μου δεν επιστρέφουν δεδομένα;

Ελέγξτε το .indexOn στα Security Rules — χωρίς δηλωμένο ευρετήριο, ένα ερώτημα με orderByChild θα επιστρέψει PERMISSION_DENIED. Βεβαιωθείτε επίσης ότι τα δεδομένα γράφονται στον σωστό κόμβο και ότι ο αναγνώστης έχει δικαιώματα .read.

Πώς μεταφέρω δεδομένα από το Realtime Database στο Firestore;

Το Firebase Console παρέχει εξαγωγή από το Realtime Database στο Firestore με ένα κλικ. Η δομή JSON μετατρέπεται σε συλλογές και έγγραφα. Για προσαρμοσμένη μετεγκατάσταση, χρησιμοποιήστε το Admin SDK.

Είναι ασφαλές το Realtime Database για αποθήκευση κωδικών πρόσβασης;

Όχι, η αποθήκευση κωδικών πρόσβασης στο Realtime Database απαγορεύεται από τους κανόνες ασφαλείας της Google. Χρησιμοποιήστε το Firebase Auth για πιστοποίηση — οι κατακερματισμοί κωδικών αποθηκεύονται σε απομονωμένο χώρο αποθήκευσης, μη προσβάσιμο μέσω του SDK του Realtime Database.

Περίληψη

  • Firebase Realtime Database — ένα δέντρο NoSQL JSON με συγχρονισμό σε πραγματικό χρόνο μέσω WebSocket, που παρουσιάστηκε από την Google το 2012.
  • Τα δεδομένα κανονικοποιούνται σε επίπεδες λίστες με αναφορές μέσω κλειδιών λόγω απουσίας JOIN και υποστήριξης σύνθετων ερωτημάτων.
  • OnDisconnect — ένας μοναδικός μηχανισμός για ατομική εγγραφή κατάστασης παρουσίας κατά τη διακοπή σύνδεσης πελάτη.
  • Επαλήθευση SMS και προσωρινή αποθήκευση εκτός σύνδεσης έως 10 MiB με ουρά λειτουργιών επιτρέπουν στην εφαρμογή να λειτουργεί χωρίς διαδίκτυο και να συγχρονίζεται κατά την αποκατάσταση.
  • Security Rules — ένα αλληλουχικό σύστημα δικαιωμάτων πρόσβασης με υποστήριξη επικύρωσης τύπων και τιμών μέσω .validate.
  • Συνιστάται για παιχνίδια, συνομιλίες και σενάρια παρουσίας — εφαρμογές που είναι κρίσιμες για ελάχιστη καθυστέρηση μετάδοσης δεδομένων.
  • Η τιμολόγηση βασίζεται στον όγκο αποθήκευσης, τη μεταφορτωμένη κίνηση και τις ταυτόχρονες συνδέσεις, όχι στον αριθμό λειτουργιών όπως στο Firestore.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης