Firebase Realtime Database: qué es, estructura JSON y sincronización

Autor: IT Sectr Publicado: 2026-04-28 Tiempo de lectura: 10 min

Firebase Realtime Database es una base de datos NoSQL en la nube de Google con sincronización de cambios en tiempo real a través de una conexión WebSocket persistente. Los datos se almacenan como un único árbol JSON, y cualquier cambio en cualquier nodo se entrega instantáneamente a todos los clientes conectados. Según Google, 2026, Realtime Database soporta hasta 200 mil conexiones simultáneas a una sola instancia. El servicio se ofrece con un límite gratuito de 1 GB de almacenamiento y 10 GB de tráfico al mes.

Puntos Clave

  • Firebase Realtime Database es un árbol JSON en la nube con sincronización de cambios en tiempo real mediante WebSocket.
  • Los datos están disponibles offline — el SDK almacena en caché el último estado y sincroniza al restaurar la conexión.
  • Soporta hasta 200 mil conexiones simultáneas a una sola instancia de base de datos.
  • La estructura de datos es un único árbol JSON, lo que simplifica la lectura pero requiere normalización plana para el rendimiento.
  • El precio se basa en el volumen de datos y el número de conexiones simultáneas, no en la cantidad de operaciones.

Qué es Firebase Realtime Database

Firebase Realtime Database es una de las primeras bases de datos en la nube en tiempo real, lanzada por Google junto con Firebase en 2012. Es una base de datos NoSQL donde los datos se almacenan como un único árbol JSON accesible a través de una sola URL. Los SDKs de cliente (Android, iOS, Web) se suscriben a nodos específicos del árbol mediante WebSocket y reciben actualizaciones en cada cambio de datos — sin necesidad de hacer polling al servidor ni implementar un mecanismo Push personalizado.

Historia y Desarrollo

Firebase original fue fundada en 2011 por James Tamplin y Andrew Lee, y el primer producto fue precisamente Realtime Database. Tras la adquisición por Google en 2014 (según TechCrunch — por una cantidad entre 50 y 100 millones de dólares), la base de datos se integró en Google Cloud y recibió un rendimiento significativamente mayor. En 2017, Google anunció Firestore como un reemplazo evolutivo, pero Realtime Database sigue siendo compatible y actualizado activamente. Según Google (2026), Realtime Database todavía se utiliza en más de 1.5 millones de proyectos activos.

Límites Gratuitos y Precios

Plan Spark (gratuito) incluye: 1 GB de almacenamiento, 10 GB de datos descargados al mes, 100 conexiones simultáneas y soporte de base de datos en una región. En el plan Blaze (pago por uso), se cobra por almacenamiento adicional ($1/GB), tráfico ($0.12/GB) y conexiones simultáneas ($5 por cada 100 mil por encima del límite). Para pruebas, también está disponible el modo de emulación — firebase emulators:start — que ejecuta Realtime Database localmente sin conexión a la nube.

Estructura de Datos: Árbol JSON y Normalización

Realtime Database no tiene tablas, colecciones ni documentos — todo es un único árbol JSON accesible mediante una URL como https://project-name-default-rtdb.firebaseio.com/. Cada clave del árbol es o un valor final (cadena, número, booleano, null) o un nodo anidado con claves hijas. El motor de la base de datos no soporta JOIN, subconsultas ni agregaciones — una consulta siempre devuelve el contenido de un nodo con todos sus elementos hijos.

Normalización de Datos

Debido a la falta de JOIN en Realtime Database, la normalización de datos es obligatoria. En lugar de un árbol anidado (usuario → lista de sus publicaciones), los datos se dividen en listas planas con referencias a través de claves. Este es el enfoque estándar: los datos se desnormalizan para que la lectura de un nodo no extraiga todo el contexto. Por ejemplo, la lista de mensajes del chat se almacena separada de los perfiles de usuario, y cada publicación contiene solo el ID del autor, no todo su perfil.

EnfoqueEjemplo de EstructuraProblema
Anidadousers/{uid}/posts/{postId}/contentLeer usuario carga todas las publicaciones
Planoposts/{postId}/authorId + users/{uid}/nameRequiere dos consultas
Desnormalizadoposts/{postId}/authorName (copiado)Duplicación al actualizar

Consultas en Realtime Database

Las consultas en Realtime Database se realizan utilizando filtros (orderByChild, orderByKey, orderByValue, limitToFirst, limitToLast, equalTo, startAt, endAt). A diferencia de Firestore, los índices se crean manualmente mediante la sección Rules (.indexOn). Si no se declara un índice, una consulta con ordenación devuelve un error PERMISSION_DENIED. Las consultas funcionan solo en un único campo — las consultas compuestas (filtrar por precio + ordenar por fecha) no son compatibles. Para filtrados complejos, los datos a menudo se duplican en diferentes nodos con diferentes claves de ordenación.

Realtime Database vs Firestore: Cuál Elegir

Elegir entre Realtime Database y Firestore es una de las decisiones arquitectónicas más comunes al iniciar un proyecto. Google recomienda Firestore para la mayoría de las nuevas aplicaciones, pero Realtime Database sigue siendo la mejor opción para escenarios donde la latencia mínima de transferencia de datos es crítica.

Tres Escenarios Clave para Realtime Database

Primer escenario — juegos multijugador con sincronización de estado (ajedrez, juegos de cartas, acción en tiempo real). La latencia de Realtime Database es de 10-30 ms frente a 50-100 ms de Firestore en una misma región. Segundo escenario — chats y mensajería con alta frecuencia de mensajes. Realtime Database se factura por volumen de datos, no por cantidad de escrituras, lo que lo hace significativamente más barato que Firestore en frecuencias superiores a 1 mensaje por segundo. Tercer escenario — presencia de usuarios (online/offline), donde los manejadores onDisconnect de Realtime Database permiten establecer atómicamente el estado al perder la conexión.

Según Google (2026), aproximadamente el 15% de los nuevos proyectos de Firebase eligen conscientemente Realtime Database — cuando el equipo comprende claramente sus requisitos de latencia, estructura de datos y presupuesto. En el 85% restante de los casos, Firestore es la opción más segura gracias a su mejor escalabilidad, consultas más potentes y replicación automática.

Integración de Realtime Database en Android

Conectar Realtime Database a una aplicación Android se realiza añadiendo la dependencia firebase-database-ktx en build.gradle. El objeto FirebaseDatabase está disponible mediante getInstance(url) — puedes conectarte a múltiples bases de datos dentro de un mismo proyecto Firebase. Tras la inicialización, el SDK establece automáticamente una conexión WebSocket con el servidor y comienza la sincronización de datos.

groovy
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-database-ktx")
}

// Initialization with custom URL
val database = FirebaseDatabase.getInstance(
    "https://my-project-default-rtdb.firebaseio.com/"
)
val ref = database.getReference("chats")

Escritura y Lectura de Datos

Realtime Database utiliza el objeto DatabaseReference para todas las operaciones. setValue() escribe datos en el nodo especificado, reemplazando completamente todo su contenido. push() genera automáticamente una clave única (basada en una marca de tiempo) para añadir un elemento a una lista — esta es la forma estándar de crear mensajes de chat, publicaciones y registros. updateChildren() modifica múltiples nodos atómicamente en una sola operación. addValueEventListener se suscribe a los cambios de un nodo y recibe una callback en cada actualización de datos.

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

Sincronización en Tiempo Real y Modo Offline

El mecanismo de sincronización de Realtime Database se basa en el protocolo WebSocket (anteriormente — long-polling). El cliente envía una solicitud para suscribirse a un nodo específico, y el servidor mantiene la conexión abierta. Ante cualquier cambio de datos en el nodo suscrito, el servidor envía el JSON completo de ese nodo al cliente. El SDK en el cliente actualiza automáticamente el estado local y ejecuta las callbacks correspondientes (onDataChange).

OnDisconnect — Disparadores de Desconexión

OnDisconnect es una característica única de Realtime Database que no está presente en Firestore. Un desarrollador puede registrar una operación de escritura que se ejecutará automáticamente en el servidor cuando se pierda la conexión del cliente. Esto se utiliza para estados de presencia: "user123/status": "online" con onDisconnect.setValue("offline"). Si el usuario cierra la aplicación o pierde internet, el servidor establecerá automáticamente el estado a "offline" en un máximo de 3 minutos (configurable en la consola de Firebase).

Caché Offline

Persistence en Realtime Database se habilita con una sola línea: FirebaseDatabase.getInstance().setPersistenceEnabled(true). El SDK almacena en caché el último estado de todos los nodos suscritos en el disco (hasta 10 MiB por defecto, configurable hasta 100 MiB). Cuando se pierde la conexión, el cliente continúa trabajando con los datos en caché, y todas las operaciones de escritura se ponen en cola. Cuando se restaura la conexión, el SDK envía todos los cambios acumulados al servidor en el orden correcto (FIFO).

Según Google (2026), las aplicaciones con caché de persistencia habilitada tienen un 40% menos de probabilidades de perder datos de usuario al perder la conexión. Sin embargo, si un cliente ha acumulado más de 1000 operaciones pendientes, el servidor puede rechazarlas todas y solicitar una sincronización completa — este es un mecanismo de protección contra clientes desactualizados.

Reglas de Seguridad y Validación

Las Reglas de Seguridad en Realtime Database son una configuración JSON que describe quién puede leer y escribir datos en cada nodo y bajo qué condiciones. Las reglas se ejecutan en el servidor de Google y se aplican antes de cada operación. Por defecto (en producción), se recomienda configurar las reglas en modo "cerrado" — solo los usuarios autenticados tienen acceso.

Estructura de las Reglas

Las reglas de Realtime Database se escriben en formato JSON con las secciones .read, .write, .validate, .indexOn. A diferencia de Firestore (que utiliza sintaxis match), Realtime Database utiliza objetos anidados que reflejan la estructura de datos. Las condiciones verifican auth (autenticación), data (datos existentes), newData (nuevos datos al escribir) y now (hora del servidor). Las reglas de validación (.validate) permiten verificar tipos, rangos de valores y estructura de datos.

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

Comportamiento en Cascada y Prueba de Reglas

Las reglas de Realtime Database se heredan en cascada — si .read = false en el nivel superior, entonces todos los nodos hijos no están disponibles para lectura independientemente de sus propias reglas. Firebase proporciona un simulador de reglas en la consola donde se pueden probar operaciones con diferentes tokens de autenticación antes del despliegue. Se recomienda probar siempre las reglas en el simulador — un error en una regla puede abrir el acceso a datos privados de todos los usuarios. Según Google (2026), el 40% de las filtraciones de datos en proyectos Firebase son causadas por reglas de seguridad mal configuradas.

Preguntas Frecuentes

¿Cuántas conexiones simultáneas soporta Realtime Database?

Hasta 200 mil conexiones simultáneas a una sola instancia de base de datos. Cuando se supera el límite, las nuevas conexiones se bloquean. Para escalar, se utiliza el particionado en múltiples bases de datos.

¿Cómo implementar la presencia de usuarios online/offline?

Usa onDisconnect — registra una operación de escritura para "offline" al perder la conexión. El servidor la ejecutará automáticamente cuando se interrumpa el WebSocket. Monitorea la conexión por separado mediante .info/connected.

¿Por qué mis consultas no devuelven datos?

Verifica .indexOn en las Reglas de Seguridad — sin un índice declarado, una consulta con orderByChild devolverá PERMISSION_DENIED. También asegúrate de que los datos se escriben en el nodo correcto y el lector tiene permisos .read.

¿Cómo migrar datos de Realtime Database a Firestore?

Firebase Console proporciona exportación de Realtime Database a Firestore con un solo botón. La estructura JSON se convierte en colecciones y documentos. Para migraciones personalizadas, usa el Admin SDK.

¿Es segura Realtime Database para almacenar contraseñas?

No, almacenar contraseñas en Realtime Database está prohibido por las reglas de seguridad de Google. Usa Firebase Auth para la autenticación — los hashes de contraseñas se almacenan en un almacenamiento aislado que no es accesible a través del SDK de Realtime Database.

Resumen

  • Firebase Realtime Database es un árbol JSON NoSQL con sincronización en tiempo real mediante WebSocket, presentado por Google en 2012.
  • Los datos se normalizan en listas planas con referencias basadas en claves debido a la falta de soporte de JOIN y consultas complejas.
  • OnDisconnect es un mecanismo único para escribir atómicamente el estado de presencia al perder la conexión del cliente.
  • La verificación SMS y la caché offline de hasta 10 MiB con una cola de operaciones permiten que la aplicación funcione sin internet y se sincronice al restaurarse.
  • Las Reglas de Seguridad son un sistema de control de acceso en cascada con soporte de validación de tipos y valores mediante .validate.
  • Recomendado para juegos, chats y escenarios de presencia — aplicaciones críticas para la latencia mínima de transferencia de datos.
  • El precio se basa en el volumen de almacenamiento, el tráfico descargado y las conexiones simultáneas, no en la cantidad de operaciones como en Firestore.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también