Firebase Realtime DB — τι είναι, αρχιτεκτονική και εργασία με JSON

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

Firebase Realtime Database — είναι μια νεφελώδης βάση δεδομένων JSON πραγματικού χρόνου, που ξεκίνησε από την Google το 2012 για εφαρμογές κινητών και ιστού. Όλα τα δεδομένα αποθηκεύονται σε ένα μεγάλο δέντρο JSON και συγχρονίζονται μεταξύ των συνδεδεμένων πελατών σε πραγματικό χρόνο μέσω σύνδεσης WebSocket. Σύμφωνα με την επίσημη τεκμηρίωση Firebase, 2025, η Realtime Database μπορεί να εξυπηρετήσει έως και 200 000 ταυτόχρονες συνδέσεις και υποστηρίζει έως και 1000 ταυτόχρονες εγγραφές ανά δευτερόλεπτο. Η βάση δεδομένων δεν απαιτεί υποδομή διακομιστή και παρέχει SDK για iOS, Android, Web και πλατφόρμες διακομιστή.

Βασικά σημεία

  • Firebase Realtime DB — νεφελώδης βάση δεδομένων JSON με συγχρονισμό δεδομένων μεταξύ πελατών σε πραγματικό χρόνο.
  • Τα δεδομένα αποθηκεύονται ως ένα ενιαίο δέντρο JSON, όπου κάθε κόμβος είναι προσβάσιμος μέσω μοναδικής διαδρομής.
  • Η ενσωματωμένη λειτουργία εκτός σύνδεσης επιτρέπει στην εφαρμογή να λειτουργεί χωρίς διαδίκτυο και να συγχρονίζει τις αλλαγές όταν αποκατασταθεί η σύνδεση.
  • Υποστηρίζει έως 200 000 ταυτόχρονες συνδέσεις και έως 1000 λειτουργίες εγγραφής ανά δευτερόλεπτο.
  • Ενσωματώνεται με το Firebase Authentication και προσαρμοσμένους κανόνες ασφαλείας για τον έλεγχο πρόσβασης στα δεδομένα.

Τι είναι η Firebase Realtime Database;

Firebase Realtime Database — είναι μια νεφελώδης βάση δεδομένων NoSQL που αποθηκεύει και συγχρονίζει δεδομένα σε πραγματικό χρόνο μεταξύ όλων των συνδεδεμένων πελατών. Ξεκίνησε το 2012 ως Firebase (πριν την εξαγορά από την Google) και έγινε η πρώτη νεφελώδης βάση πραγματικού χρόνου για προγραμματιστές κινητών. Τα δεδομένα παρουσιάζονται σε μορφή JSON και οργανώνονται σε ιεραρχικό δέντρο, όπου κάθε κόμβος έχει μοναδική διαδρομή.

Η βασική αξία της Realtime Database — ο ενσωματωμένος συγχρονισμός. Όταν η εφαρμογή αλλάζει δεδομένα σε οποιαδήποτε συσκευή, όλοι οι άλλοι συνδεδεμένοι πελάτες λαμβάνουν άμεσα την ενημέρωση μέσω μόνιμης σύνδεσης. Αυτό απαλλάσσει τον προγραμματιστή από την υλοποίηση δικού του μηχανισμού συγχρονισμού, διακομιστή WebSocket ή REST API για τη μεταφορά δεδομένων μεταξύ πελατών.

Η βάση δεδομένων παρέχει SDK για όλες τις κύριες πλατφόρμες: Android (Java, Kotlin), iOS (Swift, Objective-C), Web (JavaScript) και περιβάλλοντα διακομιστή μέσω του Admin SDK. Σύμφωνα με την Google, η Realtime Database χρησιμοποιείται σε περισσότερα από 1,5 εκατομμύρια ενεργά έργα Firebase παγκοσμίως. Παρά την εμφάνιση της πιο σύγχρονης Firestore, η Realtime Database παραμένει δημοφιλής επιλογή για έργα με απλή δομή δεδομένων.

Δομή δεδομένων: δέντρο JSON

Σε αντίθεση με τις σχεσιακές βάσεις, η Realtime Database δεν χρησιμοποιεί πίνακες και γραμμές. Όλα τα δεδομένα αποτελούν ένα ενιαίο δέντρο JSON, που μοιάζει με ένθετα αντικείμενα JavaScript. Για παράδειγμα, για την αποθήκευση χρηστών και των μηνυμάτων τους δημιουργείται ιεραρχία: users/userId/name και messages/messageId/text. Κάθε διαδρομή στο δέντρο είναι μια συμβολοσειρά και μπορείτε να έχετε άμεση πρόσβαση στα δεδομένα μέσω αυτής της διαδρομής.

json
{
  "users": {
    "user1": {
      "name": "Ιβάν Πετρόφ",
      "email": "ivan@example.com"
    },
    "user2": {
      "name": "Μαρία Σοκολόβα",
      "email": "maria@example.com"
    }
  },
  "messages": {
    "-Nabc123": {
      "text": "Γεια!",
      "userId": "user1"
    }
  }
}

Ένα σημαντικό χαρακτηριστικό — η βαθιά ένθεση επηρεάζει την απόδοση. Όταν η εφαρμογή διαβάζει δεδομένα σε μια συγκεκριμένη διαδρομή, φορτώνει όλους τους θυγατρικούς κόμβους αυτής της διαδρομής. Γι' αυτό συνιστάται ο σχεδιασμός όσο το δυνατόν πιο επίπεδης δομής δεδομένων, αποφεύγοντας ένθεση βαθύτερη από 3–4 επίπεδα. Για την αντιμετώπιση αυτού του προβλήματος χρησιμοποιείται η αποκανονικοποίηση δεδομένων — η αντιγραφή πληροφοριών σε διαφορετικούς κόμβους του δέντρου.

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

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

Το κύριο πλεονέκτημα της Realtime Database — η χαμηλή καθυστέρηση συγχρονισμού. Καθώς όλα τα δεδομένα αποθηκεύονται σε ένα δέντρο JSON χωρίς επιπλέον επίπεδα αφαίρεσης, ο συγχρονισμός γίνεται ταχύτερα από ό,τι στην Firestore. Για εφαρμογές όπου η ταχύτητα παράδοσης ενημερώσεων είναι κρίσιμη (συνομιλίες, διαδικτυακά παιχνίδια, συστήματα συνεργατικής επεξεργασίας), η Realtime Database μπορεί να είναι πιο κατάλληλη επιλογή.

Πότε να χρησιμοποιήσετε την Realtime Database

Η Realtime Database ταιριάζει καλύτερα σε σενάρια με απλή δομή δεδομένων και υψηλή συχνότητα ενημερώσεων. Τυπικά παραδείγματα: συνομιλίες, like σε πραγματικό χρόνο, ενδείξεις πληκτρολόγησης, καταστάσεις παρουσίας χρηστών. Είναι επίσης καλή επιλογή για πρωτότυπα και έργα με περιορισμένο προϋπολογισμό, καθώς η τιμολόγηση βασίζεται στον όγκο δεδομένων και όχι στον αριθμό των λειτουργιών.

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

Πώς λειτουργεί ο συγχρονισμός στην Realtime Database

Η Realtime Database χρησιμοποιεί μόνιμη σύνδεση WebSocket για τον αμφίδρομο συγχρονισμό δεδομένων. Όταν ο πελάτης καλεί setValue ή updateChildren σε μια συγκεκριμένη διαδρομή, τα δεδομένα αποστέλλονται στον διακομιστή Firebase μέσω ανοιχτού καναλιού. Ο διακομιστής εφαρμόζει τις αλλαγές και διανέμει τις ενημερώσεις σε όλους τους συνδεδεμένους πελάτες μέσα σε χιλιοστά δευτερολέπτου. Κάθε σύνδεση αναγνωρίζεται με μοναδικό κλειδί περιόδου.

Ο μηχανισμός εγγραφής λειτουργεί μέσω listeners. Ο προγραμματιστής μπορεί να εγγραφεί στην αλλαγή ενός συγκεκριμένου κόμβου (addListenerForSingleValueEvent) ή να λαμβάνει συνεχείς ενημερώσεις (addValueEventListener). Σε κάθε αλλαγή δεδομένων καλείται το callback onDataChange με πλήρη στιγμιότυπο δεδομένων για τη συγκεκριμένη διαδρομή. Αυτό διαφέρει από την Firestore, όπου έρχονται μόνο τα αλλαγμένα έγγραφα — στην Realtime Database φορτώνονται πάντα όλα τα δεδομένα του κόμβου.

Λειτουργία εκτός σύνδεσης και διαχείριση συγκρούσεων

Η Realtime Database υποστηρίζει λειτουργία εκτός σύνδεσης σε Android και iOS μέσω προσωρινής αποθήκευσης σε δίσκο. Το SDK αποθηκεύει τοπικό αντίγραφο των δεδομένων και συνεχίζει να επεξεργάζεται λειτουργίες εγγραφής όταν δεν υπάρχει δίκτυο. Όταν αποκατασταθεί η σύνδεση, όλες οι συσσωρευμένες αλλαγές αποστέλλονται στον διακομιστή. Για την επίλυση συγκρούσεων χρησιμοποιείται η στρατηγική last-write-wins, αλλά ο προγραμματιστής μπορεί να εφαρμόσει προσαρμοσμένη λογική μέσω του ServerValue.TIMESTAMP για την επίλυση συγκρούσεων.

kotlin
val database = FirebaseDatabase.getInstance()
val myRef = database.getReference("messages")

// Εγγραφή δεδομένων
myRef.push().setValue(
    hashMapOf(
        "text" to "Νέο μήνυμα",
        "timestamp" to ServerValue.TIMESTAMP
    )
)

// Ανάγνωση με συνεχή ενημέρωση
myRef.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        val data = snapshot.getValue()
        Log.d("TAG", "Δεδομένα: $data")
    }

    override fun onCancelled(error: DatabaseError) {
        Log.w("TAG", "Σφάλμα: ${error.message}")
    }
})

Για τη βελτιστοποίηση της κίνησης και της απόδοσης συνιστάται η χρήση child listeners αντί για value listeners, όταν χρειάζεται να παρακολουθείτε τις αλλαγές συγκεκριμένων θυγατρικών κόμβων. Το ChildEventListener παρέχει ξεχωριστά callback για προσθήκη, αλλαγή, διαγραφή και μετακίνηση θυγατρικών στοιχείων, επιτρέποντας πιο ακριβή έλεγχο των ενημερώσεων του UI και αποφυγή επανασχεδίασης όλων των στοιχείων της λίστας σε κάθε αλλαγή δεδομένων.

Κανόνες ασφαλείας και επικύρωση δεδομένων

Η Realtime Database χρησιμοποιεί δηλωτική γλώσσα κανόνων για τον έλεγχο πρόσβασης στα δεδομένα. Οι κανόνες περιγράφουν ποιος μπορεί να διαβάζει και να γράφει δεδομένα σε κάθε διαδρομή του δέντρου JSON. Ελέγχονται στον διακομιστή Firebase πριν από κάθε αίτημα και δεν απαιτούν λογική διακομιστή για εξουσιοδότηση. Οι κανόνες υποστηρίζουν μεταβλητές, ενσωματωμένα αντικείμενα και συναρτήσεις για ευέλικτη διαμόρφωση της πρόσβασης.

Από προεπιλογή, η πρόσβαση στη βάση δεδομένων είναι απαγορευμένη για όλους τους χρήστες. Ο προγραμματιστής ανοίγει σταδιακά την πρόσβαση χρησιμοποιώντας τον κανόνα ".read" και ".write" σε διάφορα επίπεδα του δέντρου. Οι συνθήκες μπορούν να ελέγχουν την ταυτοποίηση μέσω της μεταβλητής auth, τον τύπο αιτήματος (read/write) και τα υπάρχοντα δεδομένα μέσω του αντικειμένου data. Επιπλέον, οι κανόνες υποστηρίζουν την επικύρωση των δεδομένων εγγραφής μέσω του αντικειμένου newData.

js
{
  "rules": {
    "users": {
      "$uid": {
        // Μόνο ο κάτοχος μπορεί να διαβάζει τα δεδομένα του
        ".read": "$uid === auth.uid",
        // Μόνο ο κάτοχος μπορεί να γράφει
        ".write": "$uid === auth.uid",
        // Επικύρωση πεδίων κατά την εγγραφή
        ".validate": "newData.hasChildren(['name', 'email'])"
      }
    },
    "messages": {
      // Οποιοσδήποτε ταυτοποιημένος μπορεί να διαβάζει
      ".read": "auth !== null",
      // Μόνο ταυτοποιημένος μπορεί να γράφει
      ".write": "auth !== null",
      ".indexOn": ["timestamp"]
    }
  }
}

Οι κανόνες υποστηρίζουν επίσης την ευρετηρίαση δεδομένων μέσω της οδηγίας ".indexOn". Χωρίς αυτήν, τα ερωτήματα με ταξινόμηση (orderByChild) θα απορρίπτονται ή θα εκτελούνται αναποτελεσματικά. Τα ευρετήρια καθορίζονται για κάθε διαδρομή όπου εκτελείται ταξινόμηση κατά συγκεκριμένο πεδίο. Οι κανόνες είναι αλληλουχικοί: οι βαθύτεροι κανόνες υπερισχύουν των γονικών, και αν σε κάποιο επίπεδο δεν υπάρχει πρόσβαση, θεωρείται επιτρεπτή ή απαγορευμένη ανάλογα με τον γονικό κανόνα.

Τύποι δεδομένων και περιορισμοί

Η Realtime Database υποστηρίζει πέντε τύπους δεδομένων: String, Number, Boolean, Map (αντικείμενο) και List (πίνακας). Το βάθος ένθεσης περιορίζεται στα 32 επίπεδα, ενώ το μέγιστο μέγεθος ενός κόμβου δεν πρέπει να υπερβαίνει τα 256 MB. Για αποτελεσματική εργασία με τη βάση συνιστάται ο σχεδιασμός επίπεδης δομής δεδομένων και η χρήση αποκανονικοποίησης για την αποφυγή βαθιών ερωτημάτων που φορτώνουν μεγάλους όγκους δεδομένων.

Παράδειγμα χρήσης της Realtime Database σε Android

Ας δούμε ένα πρακτικό παράδειγμα ενσωμάτωσης της Realtime Database σε εφαρμογή Android για τις καταστάσεις χρηστών (online/offline). Η εφαρμογή θα εμφανίζει τη λίστα χρηστών με την τρέχουσα κατάστασή τους, που ενημερώνεται σε πραγματικό χρόνο. Για την επίδειξη χρησιμοποιούνται το Firebase Authentication για την ταυτοποίηση χρηστών και τα coroutines για ασύγχρονες λειτουργίες.

Ρύθμιση εξαρτήσεων και αρχικοποίηση

Για να ξεκινήσετε, προσθέστε την εξάρτηση firebase-database-ktx στο αρχείο build.gradle της μονάδας της εφαρμογής. Η έκδοση της βιβλιοθήκης διαχειρίζεται μέσω του Firebase BoM για να διασφαλιστεί η συμβατότητα όλων των στοιχείων. Μετά την προσθήκη της εξάρτησης, πρέπει να αρχικοποιήσετε το Firebase στην κλάση Application ή μέσω τεμπέλικης αρχικοποίησης στο ViewModel.

groovy
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"
}

Μετά τη ρύθμιση δημιουργείται ένα repository για την εργασία με τους χρήστες. Κάθε χρήστης αντιπροσωπεύεται από έναν κόμβο στο δέντρο /users/{uid} με πεδία name, email και status. Για την παρακολούθηση της κατάστασης χρησιμοποιείται το onDisconnect — ένας ειδικός μηχανισμός του Firebase που εκτελεί αυτόματα μια λειτουργία εγγραφής όταν διακοπεί η σύνδεση του πελάτη. Αυτό εγγυάται ότι η κατάσταση του χρήστη θα αλλάξει σε "offline" όταν κλείσει η εφαρμογή ή χαθεί το δίκτυο, χωρίς επιπλέον κώδικα στον πελάτη.

kotlin
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()
            }
}

Το βασικό στοιχείο του παραδείγματος — το onDisconnect. Αυτός ο μηχανισμός επιτρέπει τον ορισμό μιας λειτουργίας εγγραφής που θα εκτελεστεί στον διακομιστή όταν διακοπεί η σύνδεση του πελάτη. Σε αυτή την περίπτωση, όταν ο χρήστης αποσυνδεθεί, η κατάστασή του ορίζεται αυτόματα σε "offline" χωρίς να χρειάζεται να χειριστείτε το συμβάν κλεισίματος της εφαρμογής. Αν η εφαρμογή τερματιστεί απροσδόκητα, το Firebase θα εκτελέσει μόνο του τη λειτουργία onDisconnect και οι άλλοι χρήστες θα δουν τη σωστή κατάσταση.

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

Ποια είναι η διαφορά μεταξύ Firebase Realtime Database και Firestore;

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

Ποιο είναι το μέγιστο μέγεθος δεδομένων στην Realtime Database;

Το μέγιστο μέγεθος ενός κόμβου της Realtime Database είναι 256 MB. Το βάθος ένθεσης περιορίζεται στα 32 επίπεδα. Για ένα έργο Firebase μπορούν να δημιουργηθούν πολλές βάσεις δεδομένων Realtime Database (έως 5 στο πρόγραμμα Spark και έως 100 στο πρόγραμμα Blaze), επιτρέποντας τη διανομή δεδομένων μεταξύ διαφορετικών περιπτώσεων.

Πώς λειτουργεί η ταυτοποίηση στην Realtime Database;

Η Realtime Database ενσωματώνεται με το Firebase Authentication. Στους κανόνες ασφαλείας είναι διαθέσιμη η μεταβλητή auth, που περιέχει το uid του ταυτοποιημένου χρήστη. Ο προγραμματιστής μπορεί να διαχωρίζει την πρόσβαση σε επίπεδο μεμονωμένων κόμβων του δέντρου JSON, ελέγχοντας την αντιστοιχία με το uid του κατόχου των δεδομένων. Οι ανώνυμοι και μη ταυτοποιημένοι χρήστες έχουν auth = null.

Υποστηρίζει η Realtime Database συναλλαγές;

Ναι, η Realtime Database υποστηρίζει συναλλαγές μέσω της μεθόδου runTransaction. Η συναλλαγή εγγυάται την ατομικότητα της λειτουργίας ανάγνωσης-αλλαγής-εγγραφής για έναν κόμβο. Σε ταυτόχρονες αλλαγές, η συναλλαγή επαναλαμβάνεται με ενημερωμένα δεδομένα. Αυτό είναι χρήσιμο για μετρητές, βαθμολογίες και άλλα σενάρια όπου η συνέπεια των δεδομένων είναι σημαντική.

Μπορείτε να χρησιμοποιήσετε την Realtime Database χωρίς διαδίκτυο;

Ναι, η Realtime Database υποστηρίζει λειτουργία εκτός σύνδεσης σε Android και iOS. Το SDK αποθηκεύει τα δεδομένα στην προσωρινή μνήμη τοπικά και συνεχίζει να επεξεργάζεται λειτουργίες εγγραφής όταν δεν υπάρχει δίκτυο. Κατά την αποκατάσταση της σύνδεσης, όλες οι συσσωρευμένες αλλαγές συγχρονίζονται με τον διακομιστή. Για την ενεργοποίηση της λειτουργίας εκτός σύνδεσης χρησιμοποιείται η μέθοδος keepSynced(true) στον απαραίτητο κόμβο.

Σύνοψη

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

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

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

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

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