Saltar al contenido

Firebase — la base que te avisa.

La idea más rara que trae Firebase es: tu app no pregunta por los datos, los recibe. Cada vez que algo cambia en la base, todas las pantallas que estaban mirando ese pedazo se actualizan solas. Realtime sin esfuerzo, sin servidor propio, sin WebSockets escritos a mano.

01Dos productos, una filosofía

Realtime Database
La original. Un único árbol JSON gigantesco; pides una rama y te suscribes. Buena para chat, presencia, juegos sencillos.
Firestore
La moderna. Colecciones de documentos, parecida a Mongo pero con onSnapshot() de fábrica y reglas de seguridad. Más escalable para apps grandes.

Las dos son "realtime" y serverless. La elección depende del tamaño esperado y del modelo de datos. Firestore gana en casi todo lo nuevo, pero RTDB sigue siendo perfecto para casos donde el árbol plano modela mejor (chats, contadores compartidos, presencia).

02Los cuatro verbos del RTDB

// Apuntar a una ruta
const ref = db.ref('chats/general/messages');

// Reemplazar todo lo que hay en ese path
ref.set({ ... });

// Mezclar campos (no borra lo demás)
ref.update({ ... });

// Agregar un hijo con clave auto-generada
ref.push({ by: 'ana', text: 'hola', at: Date.now() });

// Borrar el nodo
ref.remove();

// Y la joya:
ref.on('value', snap => render(snap.val()));

on('value') es lo que cambia el juego. Tu UI ya no pregunta — Firebase llama tu función con el dato nuevo cada vez que cambia.

03Caso 1 · RTDB Chat en tiempo real

Dos teléfonos, uno solo árbol. Cuando Ana escribe, el mensaje viaja a Firebase y el listener de Luis dispara — su pantalla se actualiza sin tocarla. Mira el árbol JSON crecer en vivo a la derecha.

Chat en tiempo real · Realtime Database
dos dispositivos, un solo árbol JSON
Ana
chateando con Luis
¿Estás ahí?
02:44 a. m.
Sí, te leo.
02:44 a. m.
Luis
chateando con Ana
¿Estás ahí?
02:44 a. m.
Sí, te leo.
02:44 a. m.
Árbol /chats/general/messages
"chats":
"general":
"messages":
"-mq61ekr91csxcg":
"by": "ana"
"text": "¿Estás ahí?"
"at": 1780973047605
"-mq61ekr9b6yzpr":
"by": "luis"
"text": "Sí, te leo."
"at": 1780973077605
Listeners disparados
on('value') está escuchando…
Magia: escribir en un teléfono dispara el listener en el otro instantáneamente — sin polling, sin refresh.
Por qué push() y no set()

push() genera una clave única ordenada por timestamp (los -Mx… que ves). Si dos clientes hacen push al mismo tiempo, sus mensajes no chocan: cada uno termina en su propia clave. set() con la misma ruta los sobrescribiría.

04Firestore — colecciones con superpoderes

db.collection('orders').add({
  customer: 'Ana',
  total: 45000,
  status: 'recibido'
});

// Listener: dispara cada vez que cambia la colección
db.collection('orders').onSnapshot(snapshot => {
  snapshot.docChanges().forEach(change => {
    if (change.type === 'added')   addToUI(change.doc);
    if (change.type === 'modified') updateUI(change.doc);
    if (change.type === 'removed') removeFromUI(change.doc);
  });
});

Si vienes de Mongo, esto te resulta familiar. La diferencia es onSnapshot: aquí no tiras de los datos, te llegan cuando hay cambios. Y un detalle bonito — Firestore te dice qué cambió, no solo el estado nuevo.

05Caso 2 · Firestore Dashboard de pedidos

Un comercio que recibe pedidos. Cada nuevo documento dispara onSnapshot en todos los dispositivos que estén mirando la colección — la cocina, el repartidor, el dueño. Dale a ▶ auto y mira el tráfico real entrando solo, sin recargar nada.

Dashboard del comercio · Firestore
onSnapshot(collection('orders'), …)
Pedidos en vivo
0 pendientes · $ 0 acumulado
Aún no hay pedidos. Dale a ▶ auto para simular tráfico real.
Colección · orders (0 docs)
[ ]
Eventos del listener
esperando cambios…
Tu app no hace polling: Firestore empuja los cambios. Cada vez que llega un pedido, esta pantalla y la del cliente y la del cocinero se actualizan juntas.

06Reglas de seguridad — el firewall declarativo

Como Firebase se conecta directo desde el navegador, no hay backend que filtre quién puede leer/escribir qué. Esa responsabilidad la asumen las security rules: pequeñas funciones declarativas que el motor evalúa en cada operación.

// Firestore rules  solo el dueño del documento puede modificarlo
match /orders/{orderId} {
  allow read:  if request.auth != null;
  allow write: if request.auth.uid == resource.data.userId;
}
No te saltes las rules

El error #1 de los principiantes en Firebase es lanzar a producción con allow read, write: if true. Cualquier persona con la URL podría leer y borrar todo. Las reglas son obligatorias, no decorativas.

07Cuándo Firebase, cuándo NO

Sí, Firebase
Prototipos rápidos. Apps móviles con sync entre dispositivos. Chat, colaborativos, presencia, notificaciones. Equipos sin backend dedicado. Cuando la velocidad de iteración es más importante que el control.
No, Firebase
Queries complejas con JOINs (no existen). Reportes analíticos. Costos predecibles a gran escala (la pricing sorprende). Cuando necesitas control fino sobre la base, o evitar vendor lock-in con Google.
Resumen

Firebase no es "una base de datos más rápida": es una base que cambia tu arquitectura. El servidor pasa a un segundo plano y la sincronización deja de ser un problema. A cambio, pierdes flexibilidad de consulta. Como siempre — la herramienta correcta para el problema correcto.