Las bases de datos son una herramienta fundamental en el mundo de la ciencia de datos. Son sistemas que permiten el almacenamiento y la gestión de grandes cantidades de información, de una forma estructurada y organizada.

Existen dos tipos principales de bases de datos: relacional y no relacional. Las bases de datos relacionales se basan en tablas que se relacionan entre sí mediante claves primarias y extranjeras. Este tipo de base de datos es ideal para manejar grandes cantidades de información estructurada y relaciones complejas entre los datos.

Por otro lado, las bases de datos no relacionales se basan en una estructura de datos más flexible llamada 'documentos'. Esta estructura permite almacenar información de forma no estructurada y permite fácilmente agregar nuevos tipos de datos sin requerir cambios drásticos en la estructura de la base de datos. Este tipo de bases de datos son particularmente útiles para manejar grandes cantidades de información no relacionada.

En conclusión, la elección entre una base de datos relacional o no relacional dependerá de los datos que se quieran almacenar y del uso que se les quiera dar. Ambos tipos tienen sus ventajas y desventajas, y es importante elegir la mejor opción para el proyecto en cuestión.

Las bases de datos son sistemas donde pueden almacenarse, organizar y recuperar información de forma eficiente. Las bases de datos suelen clasificarse en dos tipos principales: las bases de datos relacionales y las bases de datos no relacionales.

Las bases de datos relacionales son aquellas que están organizadas en tablas o relaciones formando una estructura de datos bidimensional, donde la información se almacena en varias tablas que se relacionan entre ellas mediante claves. Las bases de datos relacionales son muy buenas para almacenar datos estructurados y con un buen nivel de normalización. Una de las ventajas de este tipo de bases de datos es que tienen muy buena integridad de datos ya que aseguran que los datos almacenados sean coherentes y precisos. Por ejemplo, las bases de datos relacionales son ampliamente utilizadas en el ambiente empresarial y financiero, para almacenar información de clientes, proveedores, facturas, etc.

Por otro lado, las bases de datos no relacionales, también conocidas como NoSQL, son aquellas que tienen una estructura de datos no tabular y no se utilizan claves para relacionar los datos. En estas bases de datos, los datos se almacenan en documentos, pares clave-valor o grafos. Las bases de datos no relacionales se adaptan muy bien a los casos en que los datos son menos estructurados o cuando la cantidad de datos es muy grande. Las bases de datos NoSQL son muy buenas para almacenar datos desestructurados y con muchos cambios. Por ejemplo, son utilizadas en redes sociales para almacenar información de perfil de usuario, publicaciones y relaciones de amistad.

En resumen, mientras las bases de datos relacionales funcionan bien para estructuras esquemáticas y altamente normalizadas, las bases de datos NoSQL se adaptan mejor a conjuntos de datos desordenados o estructuras menos predecibles. El tipo de base de datos a utilizar dependerá del modelo de datos que se desee almacenar y del uso que se le quiera dar.

Modelado de Datos en Bases de Datos Relacionales

El modelado de datos en bases de datos relacionales es una técnica fundamental para estructurar y organizar datos en sistemas de bases de datos. Aquí, el enfoque se centra en representar las relaciones y las estructuras de los datos mediante tablas, claves y restricciones, siguiendo principios matemáticos y lógicos. Desarrollaré este tema en términos matemáticos y conceptuales:

1. Conceptos Básicos y Teóricos

1.1. Modelo Relacional

El modelo relacional, propuesto por Edgar F. Codd en 1970, es una forma de estructurar datos utilizando tablas (relaciones), donde cada tabla está formada por filas (tuplas) y columnas (atributos). Matemáticamente, un modelo relacional se puede definir como un conjunto de relaciones \( R \) en un esquema \( S \), donde:

- Relación: Una relación \( R \) en el esquema \( S \) es un conjunto de tuplas \( \{ t_1, t_2, \ldots, t_n \} \) donde cada tupla es un vector ordenado de valores correspondientes a los atributos del esquema \( S \).

- Esquema: Un esquema \( S \) es un conjunto de atributos \( \{ A_1, A_2, \ldots, A_k \} \) junto con una relación específica \( R \) que define la estructura de la tabla. Cada atributo \( A_i \) pertenece a un dominio \( D_i \), que es el conjunto de valores posibles para ese atributo.

1.2. Álgebra Relacional

El álgebra relacional es un conjunto de operaciones utilizadas para manipular y consultar datos en una base de datos relacional. Estas operaciones incluyen:

- Selección (σ): Filtra las tuplas de una relación que cumplen una condición dada. Matemáticamente, para una relación \( R \) y una condición \( \varphi \), la selección se denota como \( \sigma_{\varphi}(R) \).

- Proyección (π): Extrae un subconjunto de atributos de una relación. Para una relación \( R \) y un conjunto de atributos \( A \), la proyección se denota como \( \pi_A(R) \).

- Unión (∪): Combina las tuplas de dos relaciones compatibles en una sola relación. Para dos relaciones \( R \) y \( S \), la unión se denota como \( R \cup S \).

- Intersección (∩): Devuelve las tuplas comunes a dos relaciones. Para dos relaciones \( R \) y \( S \), la intersección se denota como \( R \cap S \).

- Diferencia (−): Devuelve las tuplas que están en una relación pero no en la otra. Para dos relaciones \( R \) y \( S \), la diferencia se denota como \( R - S \).

- Producto Cartesiano (×): Combina todas las tuplas de dos relaciones. Para dos relaciones \( R \) y \( S \), el producto cartesiano se denota como \( R \times S \).

- Join (⨝): Combina tuplas de dos relaciones basadas en una condición de coincidencia. Matemáticamente, para dos relaciones \( R \) y \( S \) con una condición de coincidencia \( \varphi \), el join se denota como \( R \bowtie_{\varphi} S \).

1.3. Teoría de Conjuntos y Funciones

En el contexto del modelado de datos, las tablas se pueden considerar como conjuntos de tuplas, y las relaciones entre tablas se representan mediante claves y restricciones.

- Clave Primaria: Un conjunto mínimo de atributos que identifica de manera única cada tupla en una relación. Matemáticamente, una clave primaria \( K \) para una relación \( R \) es un subconjunto de los atributos de \( R \) tal que ninguna dos tuplas en \( R \) tienen el mismo valor para \( K \).

- Clave Foránea: Un atributo en una relación que se refiere a la clave primaria en otra relación. Matemáticamente, para una relación \( R \) con una clave foránea \( F \) que referencia una clave primaria \( K \) en una relación \( S \), la clave foránea establece una restricción de integridad referencial entre \( R \) y \( S \).

- Integridad Referencial: Una restricción que garantiza que los valores de una clave foránea en una relación coincidan con los valores de una clave primaria en otra relación.

 2. Modelado de Datos

 2.1. Modelo Entidad-Relación (ER)

El modelo ER es una técnica de diseño que usa entidades y relaciones para representar datos y sus interrelaciones. En términos matemáticos, una entidad se puede considerar como un conjunto \( E \) y una relación como un conjunto de pares ordenados \( (e_i, e_j) \) donde \( e_i \in E \) y \( e_j \in E \).

- Entidad: Un objeto o concepto que tiene una existencia independiente en el modelo de datos, como una entidad \( E \) con atributos \( \{ A_1, A_2, \ldots, A_k \} \).

- Relación: Un conjunto de pares de entidades que tienen una relación particular, representada como un conjunto de tuplas \( \{ (e_i, e_j) \} \) donde \( e_i \) y \( e_j \) son entidades en \( E \).

 2.2. Normalización

La normalización es un proceso matemático para reducir la redundancia y evitar anomalías en las bases de datos. Se basa en la descomposición de relaciones en formas normales. Las formas normales son:

- Primera Forma Normal (1NF): Una relación está en 1NF si todos los atributos contienen valores atómicos, es decir, indivisibles.

- Segunda Forma Normal (2NF): Una relación está en 2NF si está en 1NF y todos los atributos no clave son totalmente dependientes de la clave primaria.

- Tercera Forma Normal (3NF): Una relación está en 3NF si está en 2NF y no tiene dependencias transitivas, es decir, no hay atributos no clave que dependan de otros atributos no clave.

- Forma Normal de Boyce-Codd (BCNF): Una relación está en BCNF si está en 3NF y para cada dependencia funcional \( X \to Y \), \( X \) es una superclave.

3. Ejemplo Matemático

Consideremos una base de datos con las siguientes tablas:

- Estudiantes \( (ID_{est}, Nombre, Edad) \)
- Cursos \( (ID_{curso}, Título, Créditos) \)
- Inscripciones \( (ID_{est}, ID_{curso}, Fecha) \)

Aquí:

- Estudiantes: Cada tupla tiene un identificador único \( ID_{est} \), nombre y edad.
- Cursos: Cada tupla tiene un identificador único \( ID_{curso} \), título y número de créditos.
- Inscripciones: Relaciona estudiantes y cursos con una fecha de inscripción. La clave primaria es \( (ID_{est}, ID_{curso}) \) y la clave foránea \( ID_{est} \) referencia a la tabla Estudiantes y \( ID_{curso} \) referencia a la tabla Cursos.

Aplicando operaciones de álgebra relacional:

- Selección: Encuentra estudiantes mayores de 21 años: \( \sigma_{Edad > 21}(Estudiantes) \).
- Proyección: Obtiene los nombres de los estudiantes inscritos en un curso específico: \( \pi_{Nombre}(\sigma_{ID_{curso} = 101}(Estudiantes \bowtie_{Estudiantes.ID_{est} = Inscripciones.ID_{est}} Inscripciones)) \).
- Join: Combina información de estudiantes y cursos para inscripciones: \( Estudiantes \bowtie_{Estudiantes.ID_{est} = Inscripciones.ID_{est}} (Inscripciones \bowtie_{Inscripciones.ID_{curso} = Cursos.ID_{curso}} Cursos) \).

Conclusión

El modelado de datos en bases de datos relacionales implica una representación matemática y lógica de datos mediante tablas y relaciones. Utiliza principios de álgebra relacional, teoría de conjuntos y funciones para definir y manipular datos, mientras que la normalización asegura la integridad y eficiencia del modelo.

 

Teoría de la Normalización de Bases de Datos

La teoría de la normalización en bases de datos es un conjunto de principios y técnicas que se utilizan para estructurar bases de datos relacionales con el fin de minimizar la redundancia de datos y evitar problemas como las anomalías de actualización, inserción y eliminación. Esta teoría se basa en la descomposición de relaciones complejas en formas más simples llamadas **formas normales**, utilizando un conjunto de reglas basadas en dependencias funcionales y restricciones de integridad.

1. Fundamentos de la Normalización

La normalización fue introducida por Edgar F. Codd en la década de 1970 como parte del desarrollo del modelo relacional de bases de datos. Su objetivo principal es organizar los datos de manera eficiente, reducir la redundancia, asegurar la integridad y facilitar el mantenimiento.

1.1. Dependencias Funcionales

Una dependencia funcional describe una relación entre dos conjuntos de atributos dentro de una relación en una base de datos. Formalmente, un conjunto de atributos \(X\) determina funcionalmente un conjunto de atributos \(Y\) (denotado como \(X \rightarrow Y\)) si, para cualquier par de tuplas en la relación, el mismo valor para \(X\) implica el mismo valor para \(Y\). Esto significa que los valores de \(Y\) pueden ser determinados de manera única a partir de los valores de \(X\).

1.2. Dependencias Funcionales Completas y Parciales

- Dependencia Funcional Completa: Un atributo \(Y\) es completamente dependiente de un conjunto de atributos \(X\) si \(Y\) depende de \(X\) en su totalidad y no de un subconjunto propio de \(X\). Este concepto es fundamental para la segunda forma normal (2NF).

- Dependencia Funcional Parcial: Un atributo \(Y\) depende parcialmente de un conjunto de atributos \(X\) si \(Y\) depende de un subconjunto propio de \(X\). Para alcanzar la 2NF, es necesario eliminar las dependencias parciales.

2. Formas Normales

Las formas normales son criterios aplicados a las tablas de una base de datos para reducir la redundancia y mejorar la integridad de los datos. Las formas normales más comunes incluyen:

2.1. Primera Forma Normal (1NF)

Una tabla está en 1NF si:

- Todos los atributos contienen valores atómicos, es decir, indivisibles.
- Cada columna debe contener un solo valor por tupla y cada valor debe pertenecer a un dominio específico.

2.2. Segunda Forma Normal (2NF)

Una tabla está en 2NF si:

- Está en 1NF.
- Todos los atributos no clave son completamente dependientes de la clave primaria, eliminando así cualquier dependencia parcial.

2.3. Tercera Forma Normal (3NF)

Una tabla está en 3NF si:

- Está en 2NF.
- No tiene dependencias transitivas, es decir, ningún atributo no clave depende de otro atributo no clave.

2.4. Forma Normal de Boyce-Codd (BCNF)

Una tabla está en BCNF si:

- Está en 3NF.
- Para cada dependencia funcional no trivial \(X \rightarrow Y\), \(X\) es una superclave (un conjunto de atributos que contiene una clave candidata).

3. Proceso de Normalización

El proceso de normalización implica descomponer iterativamente una tabla en relaciones más pequeñas para eliminar redundancias y dependencias no deseadas. Los pasos típicos incluyen:

1. Identificación de Dependencias Funcionales: Determinar todas las dependencias funcionales presentes en las relaciones.
2. Aplicación de Reglas de Normalización: Descomponer tablas basadas en dependencias funcionales para alcanzar formas normales sucesivas (1NF, 2NF, 3NF, BCNF, etc.).
3. Revisión y Ajuste: Asegurarse de que las nuevas relaciones no introduzcan redundancias o anomalías, y mantener la integridad de los datos.

4. Beneficios de la Normalización

- Eliminación de Redundancia: Reduce la duplicación de datos, lo que ahorra espacio de almacenamiento y simplifica la gestión de datos.
- Minimización de Anomalías: Evita problemas de actualización, inserción y eliminación, que pueden surgir debido a datos redundantes.
- Integridad de los Datos: Mantiene la consistencia y precisión de los datos en la base de datos, asegurando que las relaciones entre los datos sean válidas.
- Facilita el Mantenimiento: Simplifica la estructura de la base de datos y hace que los cambios sean más manejables, reduciendo la necesidad de modificar múltiples lugares cuando los datos cambian.

5. Desnormalización

La desnormalización es el proceso inverso a la normalización y se puede aplicar en ciertas situaciones para mejorar el rendimiento de las consultas de la base de datos. Este proceso implica combinar tablas normalizadas para reducir la complejidad de las consultas a cambio de aumentar la redundancia de datos, lo cual puede ser beneficioso en sistemas donde las consultas de lectura son más frecuentes que las actualizaciones de datos.

Conclusión

La teoría de la normalización es un enfoque sistemático y matemáticamente fundamentado para estructurar bases de datos relacionales de manera óptima. Al aplicar las formas normales, se construyen bases de datos eficientes y robustas que minimizan redundancias y aseguran un alto grado de integridad de datos, facilitando así la administración y el uso eficiente de la información almacenada.

Modelos de Consistencia y Disponibilidad en Bases de Datos No Relacionales

Los modelos de consistencia y disponibilidad en bases de datos no relacionales (también conocidas como bases de datos NoSQL) se refieren a cómo estos sistemas manejan la integridad de los datos y la accesibilidad en entornos distribuidos. A diferencia de las bases de datos relacionales tradicionales que siguen el modelo ACID (Atomicity, Consistency, Isolation, Durability) para garantizar transacciones consistentes y seguras, las bases de datos NoSQL priorizan la flexibilidad, escalabilidad y alta disponibilidad. Esto se debe a que están diseñadas para manejar grandes volúmenes de datos distribuidos a través de múltiples servidores o nodos.

1. El Teorema CAP

El teorema CAP (Consistency, Availability, Partition tolerance) es fundamental para entender los compromisos y las decisiones de diseño que enfrentan las bases de datos distribuidas. Este teorema, propuesto por Eric Brewer en 2000, establece que en un sistema distribuido es imposible garantizar simultáneamente las tres propiedades siguientes:

- Consistencia (Consistency): Cada lectura desde la base de datos devuelve el resultado de la escritura más reciente. Esto significa que todos los nodos ven los mismos datos al mismo tiempo.
  
- Disponibilidad (Availability): Cada solicitud de cliente recibe una respuesta, ya sea exitosa o fallida, garantizando que el sistema esté siempre operativo.
  
- Tolerancia a Particiones (Partition tolerance): El sistema continúa funcionando a pesar de fallos o particiones de red que interrumpen la comunicación entre nodos.

En un entorno distribuido, al enfrentarse a una partición de red, un sistema puede garantizar como máximo dos de estas tres propiedades. Esto lleva a las siguientes combinaciones:

1. CA (Consistencia y Disponibilidad): No se garantiza la tolerancia a particiones; es más común en sistemas centralizados.
2. CP (Consistencia y Tolerancia a Particiones): Se prioriza la consistencia y la tolerancia a fallos de red, pero puede comprometer la disponibilidad durante particiones.
3. AP (Disponibilidad y Tolerancia a Particiones): Se prioriza la disponibilidad y la tolerancia a particiones, pero se puede comprometer la consistencia en casos de fallos de red.

2. Modelos de Consistencia en Bases de Datos NoSQL

Existen varios modelos de consistencia que determinan cómo se manejan los datos en un entorno distribuido:

2.1. Consistencia Fuerte

En un sistema con **consistencia fuerte**, cada lectura garantiza obtener el resultado de la última escritura realizada. Esto significa que, después de una actualización, todas las réplicas del dato deben estar sincronizadas antes de que cualquier lectura adicional pueda suceder. Este modelo es similar al enfoque ACID de las bases de datos relacionales y se aplica en sistemas donde la precisión de los datos es crucial.

- Ventajas: Garantiza que todas las lecturas reflejen las actualizaciones más recientes, lo que es fundamental para aplicaciones que requieren precisión transaccional.
- Desventajas: Puede resultar en latencias más altas y menor disponibilidad, especialmente en sistemas distribuidos geográficamente.

2.2. Consistencia Eventual

La consistencia eventual es un modelo en el que el sistema garantiza que, si no se realizan más actualizaciones, todos los accesos al dato finalmente devolverán el mismo valor. Esto significa que las escrituras pueden distribuirse de forma asincrónica, y las réplicas no se sincronizan inmediatamente.

- Ventajas: Ofrece alta disponibilidad y rendimiento, ya que no requiere sincronización inmediata de las réplicas.
- Desventajas: No garantiza que una lectura refleje la última escritura; es posible leer datos desactualizados durante un tiempo.

2.3. Consistencia Causal

La consistencia causal mantiene el orden de las operaciones que son causalmente relacionadas. Si una operación B depende de una operación A, entonces todos los nodos deben ver A antes de B. Este modelo es más fuerte que la consistencia eventual, pero más flexible que la consistencia fuerte.

- Ventajas: Ofrece un equilibrio entre la consistencia y la disponibilidad, asegurando que las operaciones relacionadas sean vistas en el orden correcto.
- Desventajas: Puede ser complejo de implementar y aún permite ciertos grados de inconsistencia temporal.

2.4. Consistencia Débil

La consistencia débil permite que las actualizaciones se propaguen sin ninguna garantía específica sobre cuándo o si serán visibles en todos los nodos. Este modelo es adecuado para aplicaciones donde la velocidad es más importante que la precisión inmediata, como en ciertos servicios de caché.

- Ventajas: Máxima disponibilidad y rendimiento.
- Desventajas: No hay garantía de que las lecturas reflejen las escrituras más recientes, lo que puede resultar en inconsistencias significativas.

3. Modelos de Disponibilidad en Bases de Datos NoSQL

La disponibilidad en bases de datos NoSQL es la capacidad de un sistema para estar operativo y responder a las solicitudes incluso en caso de fallos o particiones de red. Los modelos de disponibilidad en bases de datos NoSQL están diseñados para asegurar que el sistema siga sirviendo solicitudes de lectura y escritura, incluso en condiciones adversas.

3.1. Alta Disponibilidad

Un sistema de alta disponibilidad está diseñado para proporcionar un servicio casi continuo, minimizando el tiempo de inactividad. Esto se logra a través de la replicación de datos y la distribución del sistema a través de múltiples nodos o centros de datos.

- Características: 
  - Replicación de datos entre nodos para evitar puntos únicos de fallo.
  - Utilización de algoritmos de consenso, como Paxos o Raft, para coordinar actualizaciones entre nodos de manera consistente.
  - Diseño de sistemas tolerantes a fallos que pueden continuar operando incluso cuando uno o más nodos fallan.

3.2. Disponibilidad Eventual

La disponibilidad eventual es un enfoque en el que el sistema prioriza responder a las solicitudes de lectura y escritura, incluso si no todas las réplicas están sincronizadas. Este modelo se utiliza en aplicaciones donde es aceptable que los datos sean temporalmente inconsistentes, siempre que el sistema esté operativo.

4. Compromisos entre Consistencia y Disponibilidad

Debido al teorema CAP, las bases de datos NoSQL deben hacer compromisos entre consistencia y disponibilidad, especialmente en presencia de particiones de red. La elección del modelo de consistencia y disponibilidad depende de los requisitos específicos de la aplicación:

- Aplicaciones Financieras: Prefieren consistencia fuerte debido a la necesidad de precisión en las transacciones.
- Redes Sociales y Aplicaciones de Mensajería: A menudo utilizan consistencia eventual o débil para maximizar la disponibilidad y el rendimiento.
- Aplicaciones de Comercio Electrónico: Pueden optar por consistencia causal para garantizar que las operaciones relacionadas, como los pedidos y los pagos, se procesen en el orden correcto.

Conclusión

Los modelos de consistencia y disponibilidad en bases de datos NoSQL reflejan las diferentes necesidades y requisitos de las aplicaciones modernas. A medida que las aplicaciones distribuidas crecen en complejidad y escala, los compromisos entre consistencia, disponibilidad y tolerancia a particiones deben ser cuidadosamente evaluados para proporcionar un sistema eficiente, robusto y adaptable a las necesidades del usuario.

 

Ejemplo práctico de Bases de Datos Relacionales en Python:

# Importamos la librería SQLite3
import sqlite3

# Abrimos conexión a la base de datos SQLite
conexion = sqlite3.connect('ejemplo.db')

# Creamos una tabla llamada ALUMNOS con cuatro columnas: ID, NOMBRE, EDAD, CALIFICACION
conexion.execute('''CREATE TABLE ALUMNOS(
    ID INT PRIMARY KEY NOT NULL,
    NOMBRE TEXT NOT NULL,
    EDAD INT NOT NULL,
    CALIFICACION INT NOT NULL
);''')

# Insertamos datos en la tabla ALUMNOS
conexion.execute("INSERT INTO ALUMNOS (ID, NOMBRE, EDAD, CALIFICACION) \
VALUES (1, 'Juan', 20, 90)")

conexion.execute("INSERT INTO ALUMNOS (ID, NOMBRE, EDAD, CALIFICACION) \
VALUES (2, 'Maria', 19, 85)")

conexion.execute("INSERT INTO ALUMNOS (ID, NOMBRE, EDAD, CALIFICACION) \
VALUES (3, 'Pedro', 21, 95)")

# Hacemos una consulta SELECT en la tabla de ALUMNOS
registros = conexion.execute("SELECT id, nombre, edad, calificacion from ALUMNOS")
for fila in registros:
    print("ID = ", fila[0])
    print("NOMBRE = ", fila[1])
    print("EDAD = ", fila[2])
    print("CALIFICACION = ", fila[3])

# Cerramos la conexión a la base de datos
conexion.close()

Ejemplo práctico de Base de Datos No Relacional en Python:

# Importamos la librería pymongo
from pymongo import MongoClient

# Abrimos conexión con el servidor MongoDB en localhost en el puerto 27017
cliente = MongoClient('localhost', 27017)

# Accedemos a la base de datos que hemos creado previamente llamada ESCUELA
db = cliente.ESCUELA

# Accedemos a la colección ALUMNOS dentro de la base de datos ESCUELA
coleccion = db.ALUMNOS

# Insertamos un nuevo registro en la colección ALUMNOS
nuevo_alumno = {"nombre": "Luis", "edad": 22, "calificacion": 80}
resultado = coleccion.insert_one(nuevo_alumno)
print(resultado.inserted_id)

# Hacemos una consulta SELECT de todos los registros en la colección ALUMNOS
registros = coleccion.find()
for registro in registros:
    print(registro)

# Actualizamos uno de los registros en la colección ALUMNOS
coleccion.update_one({"nombre": "Luis"}, {"$set": {"calificacion": 90}})

# Hacemos una consulta SELECT con un filtro para obtener registros con edad mayor a 20
registros = coleccion.find({"edad": {"$gt": 20}})
for registro in registros:
    print(registro)

# Eliminamos un registro de la colección ALUMNOS
coleccion.delete_one({"nombre": "Luis"})

# Cerramos la conexión con el servidor MongoDB
cliente.close()

En este ejemplo estamos utilizando la base de datos NoSQL MongoDB y la librería PyMongo para realizar la conexión y las operaciones CRUD (Create, Read, Update, Delete) en una colección llamada ALUMNOS. Los datos se almacenan en formato JSON y se realiza la consulta de los registros mediante la función find(). También se muestra cómo realizar actualizaciones y eliminaciones de registros mediante las funciones update_one() y delete_one() respectivamente.