Respuesta: Los principales tipos de bases de datos NoSQL son:
// Ejemplo de inserción en MongoDB
db.collection.insertOne({
"nombre": "Juan",
"edad": 30,
"ciudad": "Bogotá"
});
Respuesta: Las bases de datos NoSQL son sistemas diseñados para manejar grandes volúmenes de datos no estructurados o semiestructurados. En lugar de usar el modelo relacional con tablas y filas, NoSQL ofrece diferentes modelos de almacenamiento. Algunos fundamentos teóricos incluyen:
// Ejemplo de consulta en Redis
SET clave "valor"
GET clave
Respuesta: Elegiría una base de datos NoSQL cuando los datos son no estructurados o crecen de manera descontrolada, o cuando es necesario escalar horizontalmente. Por otro lado, usaría SQL cuando se requiere transaccionalidad, integridad referencial, y un esquema fijo.
Respuesta: La "eventual consistency" significa que en un sistema distribuido, las actualizaciones de datos no se reflejan inmediatamente en todos los nodos, pero eventualmente, todas las copias de los datos convergerán al mismo estado.
Respuesta: El teorema CAP establece que una base de datos distribuida puede garantizar solo dos de las tres propiedades:
Respuesta: Un documento en una base de datos NoSQL documental (como MongoDB) es un registro que contiene datos en formato JSON o BSON. Cada documento puede tener una estructura diferente, lo que da flexibilidad a los datos.
// Ejemplo de documento en MongoDB
{
"nombre": "María",
"edad": 28,
"dirección": {
"calle": "Calle 123",
"ciudad": "Bogotá"
}
}
Respuesta: Utilizaría la sentencia find()
para buscar documentos que coincidan con ciertos criterios.
db.collection.find({"edad": {"$gt": 25}});
Respuesta: El particionamiento distribuye los datos en múltiples servidores o nodos para mejorar la escalabilidad y el rendimiento. Es crucial en bases de datos NoSQL porque ayuda a manejar grandes cantidades de datos y tráfico.
Respuesta: Un índice en NoSQL mejora el rendimiento de las consultas al permitir búsquedas más rápidas sobre ciertos campos. Por ejemplo, en MongoDB se puede crear un índice en una clave específica para acelerar las búsquedas.
// Crear un índice en MongoDB
db.collection.createIndex({"nombre": 1});
Respuesta: Al trabajar con consistencia eventual, diseñaría la aplicación para manejar estados inconsistentes temporalmente. También podría implementar un mecanismo de reconcilio o notificaciones para asegurar que los usuarios reciban actualizaciones correctas eventualmente.
Respuesta: Un esquema flexible significa que los datos pueden almacenarse sin una estructura fija, lo que permite que diferentes documentos en la misma colección tengan diferentes campos. Es ventajoso porque facilita cambios rápidos en la estructura de los datos sin necesidad de migraciones complejas.
Respuesta: MapReduce es un modelo de procesamiento distribuido que permite realizar operaciones de agregación sobre grandes conjuntos de datos en paralelo. En MongoDB, MapReduce se usa para procesar y analizar grandes volúmenes de documentos.
db.collection.mapReduce(
function() { emit(this.category, 1); }, // Mapeo
function(key, values) { return Array.sum(values); }, // Reducción
{ out: "resultado" }
);
Respuesta: La replicación mejora la disponibilidad y tolerancia a fallos al crear copias redundantes de los datos en múltiples nodos. Si un nodo falla, otro nodo puede seguir atendiendo las solicitudes, asegurando alta disponibilidad.
Respuesta: En NoSQL, la consistencia varía dependiendo del sistema. Algunos aseguran consistencia eventual, donde los datos pueden estar temporalmente desincronizados, pero eventualmente todos los nodos convergen al mismo estado.
Respuesta: Un sistema de base de datos de grafos (como Neo4j) está optimizado para manejar relaciones entre entidades. Es útil cuando las conexiones entre los datos son fundamentales, como en redes sociales o sistemas de recomendaciones.
Respuesta: Un almacenamiento clave-valor, como Redis, guarda datos como pares clave-valor. Es ideal para escenarios donde las búsquedas se basan en una clave única, como caché de sesiones o configuraciones de aplicaciones.
SET "usuario:123" "Juan"
GET "usuario:123"
Respuesta: Implementaría índices en los campos que más se consultan, usaría particionamiento y distribuiría los datos para mejorar la latencia.
Respuesta: Usaría compensating transactions o diseñaría la lógica de la aplicación para manejar operaciones idempotentes, asegurando que las transacciones parciales se reconcilien.
Respuesta: Las bases de datos orientadas a columnas, como Cassandra, almacenan los datos por columnas en lugar de filas. Son útiles para análisis de grandes volúmenes de datos y consultas de agregación.
Respuesta: En lugar de usar joins como en SQL, en NoSQL se recomienda usar documentos embebidos o hacer referencia a otros documentos mediante IDs. Las relaciones son manejadas en la capa de aplicación.
Respuesta: En bases de datos distribuidas, pueden surgir inconsistencias debido a la latencia entre nodos, fallos en la comunicación o diferentes nodos actualizando datos de forma simultánea. Esto puede llevar a datos desincronizados temporalmente.
Respuesta: En MongoDB, usaría índices geoespaciales para almacenar y consultar datos relacionados con ubicaciones. Esto permite realizar consultas como "encontrar todos los puntos cercanos a una ubicación dada".
db.collection.createIndex({ location: "2dsphere" });
db.collection.find({
location: {
$near: {
$geometry: { type: "Point", coordinates: [ -73.97, 40.77 ] },
$maxDistance: 5000
}
}
});
Respuesta: El sharding es la técnica de dividir grandes colecciones de datos en partes más pequeñas, llamadas shards, que se distribuyen en diferentes servidores. En MongoDB, el sharding permite escalar horizontalmente grandes volúmenes de datos.
Respuesta: En bases de datos NoSQL, las consultas complejas como las agregaciones se manejan usando pipelines o MapReduce, permitiendo realizar filtrados, agrupamientos y cálculos sobre los datos.
Respuesta: Utilizaría un sistema de sincronización de datos, como Apache Kafka, que actúe como middleware para leer los cambios en la base de datos SQL y replicarlos en NoSQL. También podría implementar una API para mantener ambas bases de datos sincronizadas.
Respuesta: En la replicación maestro-esclavo, un nodo maestro maneja las escrituras y distribuye las actualizaciones a uno o más nodos esclavos. Los esclavos solo permiten lecturas, lo que mejora la disponibilidad y redundancia de los datos.
Respuesta: Una base de datos orientada a grafos, como Neo4j, almacena datos en nodos y aristas que representan relaciones. Se usa en aplicaciones donde las relaciones entre los datos son más importantes que los propios datos, como en redes sociales.
Respuesta: Implementaría respaldos incrementales periódicos y utilizaría herramientas nativas como mongodump
en MongoDB o snapshots en Redis para asegurar la integridad de los datos y una rápida recuperación ante fallos.
Respuesta: Optaría por NoSQL cuando se requiere escalabilidad horizontal, los datos son no estructurados, o la aplicación requiere alta disponibilidad y tolerancia a fallos, como en sistemas distribuidos y aplicaciones web de gran escala.
Respuesta: Cassandra utiliza replicación para asegurar que los datos se almacenen en múltiples nodos para alta disponibilidad. Además, implementa particionamiento para distribuir datos entre nodos de manera eficiente utilizando un algoritmo de hash.