Breve introducción a las bases de datos

Breve introducción a las bases de datos, tanto relacionales como no relacionales o NoSQL. En general, el software de base de datos proporciona funcionalidades para el almacenamiento y replicación de datos, prevención de redundancia en los datos, seguridad y recuperación de datos y optimización del rendimiento.

En ingeniería de software, los sistemas de gestión  de bases de datos sirven para almacenar y gestionar datos de forma estructurada, lo que facilita el acceso a la información y su manipulación. En la actualidad, se utilizan dos modelos principales para la gestión de datos utilizando bases de datos, las bases de datos relacionales y las no relacionales o NoSQL. Las segundas incluyen a su vez varios enfoques basados en diferentes modelos de datos, como las bases de datos documentales, las bases de datos orientadas a objetos, las bases de datos jerárquicas, los almacenes de grafos o los almacenes de pares clave-valor. Cada enfoque tiene sus fortalezas y debilidades particulares y la elección de un modelo concreto dependerá de cada aplicación. En general, el software de base de datos proporciona funcionalidades para el almacenamiento y replicación de datos, prevención de redundancia en los datos, seguridad y recuperación de datos y optimización del rendimiento.

Descargar esta intro en PDF

¿Qué son los sistemas de gestión de bases de datos?

Las bases de datos son colecciones organizadas de información que se almacenan y gestionan en un sistema informático. Están diseñadas para gestionar eficazmente grandes volúmenes de datos estructurados o no estructurados, y proporcionan una forma de almacenar y acceder a los datos para su procesamiento.

Las bases de datos son por lo general el elemento central del back-end de un sistema software. Cuando hablamos del back-end, nos referimos a la parte del sistema responsable de gestionar los datos y procesar las peticiones del front-end o interfaz de usuario. Por lo tanto, incluye la lógica del servidor, la base de datos y la lógica de aplicación, elementos que en conjunto proporcionan la funcionalidad del sistema.

A menudo se hace referencia al back-end como el lado del servidor del sistema, ya que es responsable de ejecutar código y realizar operaciones que no son visibles para el usuario. Como acabamos de indicar, desde el punto de vista de la ingeniería software se organiza en varias capas, como la capa de servidor, la capa de base de datos y la capa de aplicación, cada una responsable de un conjunto específico de tareas.

El back-end es clave para proveer la funcionalidad y garantizar el rendimiento de un sistema software. Debe diseñarse e implementarse de manera que sea escalable, seguro y fiable, para garantizar que el sistema pueda gestionar un gran número de usuarios y solicitudes, proporcionando la funcionalidad o los servicios esperados y manteniendo al mismo tiempo la coherencia e integridad de los datos. Para conseguir estas propiedades, la selección del sistema de gestión de bases de datos tiene una importancia fundamental.

Una base de datos puede considerarse como un gran archivador electrónico que almacena información de forma organizada. Cada base de datos suele constar de una o varias tablas, colecciones de documentos, grafos u objetos, dependiendo del tipo de base de datos. Cada uno de estos elementos representa una entidad o concepto específico, como clientes, pedidos o productos. A su vez, estos elementos se componen de registros que representan instancias específicas de la entidad. Por ejemplo, las tablas de las bases de datos relacionales se componen de filas y columnas, donde cada fila representa un único registro o instancia, y cada columna representa un atributo o propiedad específica de la entidad. Los documentos de las bases datos orientadas a documentos se corresponden con los registros del modelo relacional. Éstos se componen, por ejemplo, de campos para definir propiedades específicas de la entidad. En las bases orientadas a objetos, cada objeto modela un registro, y los atributos de ese objeto modelan las propiedades de las instancias.

Las bases de datos se utilizan en una amplia gama de aplicaciones en el ámbito de los negocios, las finanzas, la sanidad, la educación, el ocio, las ciencias, la ingeniería y muchos otros. Son esenciales para gestionar grandes volúmenes de datos, permitir un procesamiento eficaz de los mismos, proporcionar seguridad, garantizar su integridad y coherencia y facilitar su análisis y la elaboración de informes.

Tipos de bases de datos

En la actualidad, podemos identificar dos grandes tipos de sistemas de bases de datos: relacionales y no relacionales:

  • Bases de datos relacionales Son la solución más habitual de sistema de base de datos. Se basan en el modelo relacional, que organiza los datos en tablas con filas y columnas. Las relaciones entre tablas se definen mediante campos compartidos por dichas tablas, que se utilizan para combinarlas. Las bases de datos relacionales utilizan por lo general el lenguaje SQL (Structured Query Language) para manipular y consultar los datos.
  • Bases de datos no relacionales o NoSQL Se trata de bases de datos que se caracterizan por su no adhesión al modelo relacional. Es decir, las bases de datos NoSQL no se construyen principalmente sobre tablas y, como resultado, no suelen utilizar SQL para la manipulación de datos. Están diseñadas para manejar grandes volúmenes de datos no estructurados o semiestructurados y se basan en modelos de datos no relacionales como las parejas clave-valor, los documentos, los grafos o los objetos. Las bases de datos NoSQL se utilizan a menudo para big data, aplicaciones web en tiempo real y otros campos de aplicación en los que se requiere alta escalabilidad y rendimiento.

Las bases de datos relacionales y las no relacionales se diferencian en diversos aspectos, como el modelo de datos, el lenguaje utilizado para las consultas, su grado de escalabilidad, su flexibilidad a la hora de gestionar la información, la manera de tratar la consistenciaA continuación enumeramos las principales diferencias.

Modelo de datos:

  • Las bases de datos relacionales utilizan un esquema tabular en el que los datos se organizan en tablas con columnas predefinidas y relaciones entre ellas definidas por claves foráneas. Los datos se almacenan en las filas de estas tablas.
  • Las bases de datos NoSQL utilizan otras estructuras de datos como colecciones de documentos, grafos, objetos o simples pares clave-valor. Esto proporciona mayor flexibilidad a la hora de almacenar y gestionar la información.

Lenguaje de consultas:

  • Las bases de datos relacionales utilizan SQL (Structured Query Language) como lenguaje de consulta estándar.
  • Las bases de datos NoSQL pueden tener o no un lenguaje de consulta, pero suelen utilizar interfaces del programador (APIs) o lenguajes específicos para acceder a los datos, que además están fuertemente influenciados por el modelo de datos subyacente.

Escalabilidad:

  • Las bases de datos relacionales suelen necesitar un escalado vertical, es decir, añadir más recursos a un único servidor para mejorar el rendimiento cuando aumenta la cantidad de información a gestionar. Un mayor volumen de información requiere más disco, más memoria, mayores capacidades de procesamiento en el servidor.
  • Las bases de datos NoSQL son escalables horizontalmente y pueden distribuirse en varios servidores. Los datos se suelen distribuir en clusters, y el aumento de la información a gestionar se compensa añadiendo más servidores en paralelo, que se hacen cargo de los nuevos datos.

Flexibilidad:

  • Las bases de datos relacionales tienen reglas estrictas de integridad de datos y requieren esquemas predefinidos, lo que las hace menos flexibles para adaptarse a necesidades cambiantes en los datos.
  • Las bases de datos NoSQL son más flexibles y pueden manejar datos no estructurados o semiestructurados, lo que las hace más adecuadas para manejar tipos de datos complejos y esquemas de datos en evolución.

Grado de cumplimiento de las propiedades ACID (Atomicidad, Consistencia, aIslamiento, Durabilidad):

  • Las bases de datos relacionales suelen ser estrictas en el cumplimiento de las propiedades ACID, lo que garantiza la coherencia de los datos y la integridad de las transacciones.
  • Las bases de datos NoSQL sacrifican en alguna medida las propiedades ACID, o alguna de dichas propiedades, en aras de un mayor rendimiento y escalabilidad. Por ejemplo, es habitual que ofrezcan consistencia en último término en vez de consistencia en todo momento, lo que significa que los cambios en los datos pueden tardar algún tiempo en propagarse por todo el sistema.

En definitiva, los sistemas relacionales son más adecuados para aplicaciones con datos bien definidos y estructurados, con menores requisitos de escalabilidad y cuyas transacciones cumplen las propiedades ACID:

  • Atomicidad Una transacción es atómica si se trata como una unidad de trabajo indivisible. Esto significa que, o bien todas las operaciones de la transacción se completan con éxito, o bien no se completa ninguna. Si una transacción falla o se interrumpe, todos sus cambios se revierten a su estado original y la base de datos se mantiene sin cambios.
  • Consistencia Una transacción mantiene la consistencia si transforma la base de datos de un estado válido a otro estado válido. Esto significa que la base de datos debe estar en un estado coherente tanto antes como después de que se ejecute cada transacción.
  • Aislamiento Una transacción se considera que cumple la propiedad de aislamiento si se ejecuta aislada de otras transacciones. Esto significa que los cambios realizados por una transacción no deben ser visibles para otras transacciones hasta que se éstos se completen.
  • Durabilidad Una vez completada una transacción, sus cambios deben ser permanentes y sobrevivir a cualquier fallo posterior del sistema. Esto significa que los cambios se almacenan en un medio de almacenamiento no volátil, como un disco duro, para garantizar que puedan recuperarse en caso de fallo del sistema.

Por otro lado, las bases de datos NoSQL son más adecuadas para manejar grandes volúmenes de datos no estructurados, que requieren alta escalabilidad y flexibilidad, con menores requisitos de consistencia, aislamiento o atomicidad. Las propiedades asociadas a este modelo serían(En inglés, en contraposición a las propiedades ACID, estas propiedades se conocen como BASE: Basic Availability, Soft state, Eventual consistency)):

  • Disponibilidad básica Se garantiza que se genera una respuesta para cada petición a la base de datos, aunque la respuesta puede ser una notificación de que falló la ejecución de la petición.
  • Estado laxo El estado del sistema puede cambiar a lo largo del tiempo, incluso aunque no se haga ninguna petición, para con ello garantizar la propiedad de consistencia en último término.
  • Consistencia en último término La base de datos podría estar en algún momento en un estado inconsistente, pero se garantiza que tarde o temprano la base de datos pasará a un estado consistente.

Dentro de las bases de datos no relacionales, podemos encontrar a su vez diversos enfoques:

  • Bases de datos orientadas a documentos Organizan los datos en colecciones de documentos en vez de en tablas. Un documento puede almacenar datos estructurados y no estructurados, e incluso puede contener estructuras anidadas. De hecho, se imponen pocas restricciones a los datos almacenados, siempre que cumplan el requisito básico de ser expresables como documentos. Dos documentos diferentes de una colección no tienen por qué tener la misma estructura o las mismas propiedades.
  • Bases de datos orientadas a objetos Están diseñadas para almacenar y gestionar objetos, que son instancias de clases en un lenguaje de programación orientado a objetos como Java o C. Pueden utilizarse para almacenar estructuras de datos complejas y relaciones entre objetos.
  • Bases de datos orientadas a columnas Almacenan los datos en columnas en lugar de en filas, lo que puede agilizar la consulta de grandes conjuntos de datos. Suelen utilizarse para big data, inteligencia empresarial y análisis de datos.
  • Bases de datos jerárquicas Organizan los datos en forma de árbol, con relaciones padre-hijo entre los elementos de datos. Este tipo de base de datos se utiliza a menudo en grandes aplicaciones empresariale.
  • Almacenes de grafos Las relaciones entre datos se representan como grafos. Cuando los elementos de datos (los nodos del grado) comparten múltiples relaciones, éstas se indican mediante enlaces entre dichos nodos. Las bases de datos de grafos pueden considerarse especialmente optimizadas para datos con muchas relaciones (p. ej., en aplicaciones de redes sociales, recomendadores de contenido, detección de fraude, gestión logística, gestión de redes informáticas, etc.).
  • Almacenes de pares clave-valor Muy relacionados con las bases de datos orientadas a documentos, permiten almacenar valores asociados a una clave, valores que pueden consistir en estructuras complejas. Al igual que en los almacenes de documentos, no es necesario aplicar un esquema a los valores, pero cuando se inserta un nuevo valor, un almacén clave-valor requiere que se especifique la clave concreta asociada y debe conocerse la clave para acceder al valor.

Cada tipo de sistema de base de datos tiene sus propios puntos fuertes y débiles, y la elección del sistema de base de datos para una aplicación concreta depende de las necesidades específicas de dicha aplicación. A lo largo de las secciones siguientes analizamos con más detalle estos dos tipos de sistemas de bases de datos y ofrecemos ejemplos sencillos de los más utilizados en la actualidad.

Bases de datos relacionales

Los sistemas de gestión de bases de datos relacionales son sistemas con una robusta base teórica desarrollada a lo largo de la última mitad del siglo pasado. En concreto, se basan en el álgebra relacional, una teoría que utiliza estructuras algebraicas con una semántica bien fundamentada para modelar datos y definir consultas sobre ellos. Los datos se almacenan como tablas bidimensionales con filas y columnas, y los valores de los datos deben pertenecer a un tipo de datos de los definidos en el sistema (datos fuertemente tipados) (p. ej., números enteros, números reales, caracteres, cadenas de caracteres, fechas, blobs no interpretados). Las tablas pueden unirse y transformarse en nuevas tablas de acuerdo con las reglas del álgebra relacional. En la actualidad siguen siendo los sistemas de bases de datos más utilizados, existiendo multitud de propuestas en el mercado. Entre las más populares se encuentran mySQL,  PostgreSQL, MariaDB y Oracle Database.

Un ejemplo sencillo de base de datos relacional podría ser una base de datos utilizada para almacenar información sobre los empleados de una empresa. La base de datos podría tener una tabla llamada Empleados con columnas como IDE (ID Empleado), Nombre, Apellido, Email, Departamento y Salario. La columna IDE podría utilizarse como clave primaria de la tabla, lo que garantizaría que cada empleado tiene un identificador único. En otras palabras, es posible identificar unívocamente cada empleado de la empresa por su ID de empleado (es decir, por su clave primaria).

La base de datos también podría tener una segunda tabla llamada Departamentos, con columnas como IDDepartamento y NombreDepartamento. La columna IDDepartamento podría utilizarse como clave primaria de esta tabla (cada departamento diferente tiene un ID propio).

Para establecer una relación entre las dos tablas, la columna Departamento de la tabla Empleados podría ser una clave foránea que hiciera referencia a la columna IDDepartamento de la tabla Departamentos. Esto permitiría una relación de uno a varios entre departamentos y empleados, en la que cada departamento podría tener varios empleados, pero cada empleado sólo podría pertenecer a un departamento.

Podemos utilizar las sentencias SQL siguientes para crear las dos tablas descrita

-- crea la tabla Empleados 
CREATE TABLE Empleados (  
  IDE INT PRIMARY KEY, -- número entero  
  Nombre VARCHAR(50), -- cadena de 50 caracteres max.  
  Apellido VARCHAR(50),  
  Email VARCHAR(100),  
  Departamento INT,  
  Salario DECIMAL(10, 2) -- número de 10 cifras max., 2 decimales 
); 
-- crea la tabla Departamentos 
CREATE TABLE Departamentos (  
  IDDepartamento INT PRIMARY KEY,  
  NombreDepartamento VARCHAR(100) 
);

Como acabamos de decir, queremos que la columna Departamento de la tabla Empleados sea una clave foránea que hace referencia a la columna IDDepartamento definida para la tabla Departamentos. A continuación se muestra la sentencia SQL para añadir esta restricción de clave foránea (la columna Departamento de un empleado tiene que ser uno de los valores de IDDepartamento, y se corresponde con el ID del departamento en el que está ubicado el empleado):

-- añadir restricción de clave foránea a la tabla Empleados
ALTER TABLE Empleados
ADD FOREIGN KEY (Departamento)
REFERENCES Departamentos(IDDepartamento);

Podemos insertar filas en las bases de datos recién creadas mediante la sentencia INSERT:

-- añadimos departamentos a la tabla Departamentos
INSERT INTO Departamentos VALUES (1, 'Ventas');
INSERT INTO Departamentos VALUES (2, 'Marketing');
INSERT INTO Departamentos VALUES (3, 'HR');
-- añadimos empleados a la tabla Empleados
INSERT INTO Empleados VALUES 
 (1, 'Juan', 'Alonso', 'jalonso@ejemplo.com', 1, 50000.00);
INSERT INTO Empleados VALUES 
 (2, 'Juana', 'Alonso', 'juanaalonso@ejemplo.com', 2, 60000.00);
INSERT INTO Empleados VALUES 
 (3, 'Antonio', 'Iglesias', 'iglesias@ejemplo.com', 1, 45000.00);
INSERT INTO Empleados VALUES 
 (4, 'Alicia', 'Castillo', 'aliciac@ejemplo.com', 3, 55000.00);

Con ello, tendremos una base de datos con las tablas Departamentos y Empleados siguientes:

IDDepartamento NombreDepartamento
1 Ventas
2 Marketing
3 HR
Tabla Departamentos

 

IDE Nombre Apellido Email Departamento Salario
1 Juan Alonso jalonso@example.com 1 50000
2 Juana Alonso juana@example.com 2 60000
3 Antonio Iglesias iglesias@example.com 1 45000
4 Alicia Castillo alicia@example.com 3 55000
Tabla Empleados

Con esta estructura, es posible consultar y manipular fácilmente los datos mediante sentencias SQL. Por ejemplo, se podría utilizar una consulta para obtener todos los empleados de un departamento concreto, o para calcular el salario medio de cada departamento. Para recuperar todos los empleados de un departamento en particular (en este caso, departamento con IDDepartamento igual a 3):

SELECT * 
FROM Empleados 
WHERE Departamento = 3;

Esta sentencia SQL utiliza el operador SELECT para generar una tabla con todas las filas de la tabla Empleados en la que la columna Departamento es igual a 3:

IDE Nombre Apellido Email Departamento Salario
4 Alicia Castillo alicia@example.com 3 55000
SELECT * FROM Empleados WHERE Departamento = 3

Podríamos modificar la cláusula WHERE para filtrar por un identificador de departamento diferente. También podemos utilizar la relación (de clave foránea) entre Departamento e IDDepartamento para obtener los nombres y apellidos de los empleados que pertenezcan a determinado departamento, especificado por su nombre:

SELECT Empleados.Nombre, Empleados.Apellido 
FROM Empleados 
JOIN Departamentos
ON Empleados.Departamento = Departamentos.IDDepartamento
WHERE Departamentos.NombreDepartamento = 'Ventas';

Esta sentencia  utiliza la cláusula JOIN para combinar los datos de las tablas Empleados y Departamentos, según los valores de la columna Departamento de la tabla Empleados y la columna IDDepartamento de la tabla Departamentos. De la tabla combinada resultante, seleccionamos las filas con NombreDepartamento igual a «Ventas» y de ellas las columnas Nombre y Apellido. El resultado de esta consulta sería una tabla con los nombres y apellidos de los empleados que trabajan en el departamento de «Ventas»:

Nombre Apellido
Juan Alonso
Antonio Iglesias
FROM Empleados JOIN Departamentos ON Empleados.Departamento = Departamentos.IDDepartamento WHERE Departamentos.NombreDepartamento = ‘Ventas’

Para calcular el salario medio de cada Departamento podemos utilizar el código SQL siguiente:

SELECT Departamentos.NombreDepartamento, AVG(Empleados.Salario) AS PromedioSalario
FROM Empleados
JOIN Departamentos ON Empleados.Departamento = Departamentos.IDDepartamento
GROUP BY Departamentos.NombreDepartamento;

Esta sentencia también utiliza la cláusula JOIN para combinar los datos de las tablas Empleados y Departamentos. Además, utilizamos la función AVG para calcular el salario medio de cada departamento y la cláusula GROUP BY para agrupar los resultados por nombre de departamento. Como resultado, obtendríamos la tabla siguiente:

NombreDepartamento PromedioSalario
HR 55000
Marketing 60000
Ventas 47500
SELECT Departamentos.NombreDepartamento, AVG(Empleados.Salario) AS PromedioSalario FROM Empleados JOIN Departamentos ON Empleados.Departamento = Departamentos.IDDepartamento GROUP BY Departamentos.NombreDepartamento

Bases de datos no relacionales o NoSQL

Como comentamos antes, existen varios enfoques para la definición y gestión de datos en sistemas NoSQL: pueden tener o no un lenguaje de consulta, existen diferentes APIs para acceder a la información almacenada, se basan en distintos modelos para la organización de los datos, etc. A continuación presentamos algunos ejemplos de los diferentes enfoques NoSQL enumerados anteriormente.

Bases de datos orientadas a documentos

En esta introducción, vamos a utilizar https://www.mongodb.com/esMongoDB para presentar el funcionamiento básico de estas bases de datos. MongoDB es una base de datos documental NoSQL de código abierto muy utilizada en la actualidad. Está diseñada para almacenar y gestionar datos no estructurados, semiestructurados y estructurados de forma flexible y escalable. MongoDB almacena los datos en documentos, que son similares a los objetos serializados en formato JavaScript Object Notation (JSON), y permite almacenar estructuras de datos complejas con estructuras anidadas y subdocumentos. JSON es un formato de archivo estándar abierto y un formato de intercambio de datos que utiliza texto legible por humanos para almacenar y transmitir objetos de datos consistentes en pares atributo-valor y matrices u otros valores serializables.

MongoDB es conocido sobre todo por su escalabilidad, rendimiento y alta disponibilidad. Se utiliza en una gran variedad de sistemas informáticos, y se usa sobre todo en aplicaciones web y móviles, sistemas de gestión de contenidos, sistemas de análisis de datos en tiempo real y aplicaciones del Internet de las Cosas (IoT). MongoDB es compatible con varios lenguajes de programación y proporciona un lenguaje de consulta flexible que permite realizar consultas complejas y combinar datos y documentos.

Para crear en MongoDB una colección llamada Empleados similar a la del apartado anterior, incluyendo datos de ejemplo, podemos utilizar los siguientes fragmentos de código:

db.createCollection("Empleados");
db.Empleados.insertMany([
 "IDEmpleado": 1, 
 "Nombre": "Juan", 
 "Apellido": "Alonso", 
 "Email": "jalonso@ejemplo.com", 
 "Departamento": "Ventas", 
 "Salario": 50000.00 
 ,
 "IDEmpleado": 2, 
 "Nombre": "Juana", 
 "Apellido": "Alonso", 
 "Email": "juanaalonso@ejemplo.com", 
 "Departamento": "Marketing", 
 "Salario": 60000.00 
 ,
 "IDEmpleado": 3, 
 "Nombre": "Antonio", 
 "Apellido": "Iglesias", 
 "Email": "iglesias@ejemplo.com", 
 "Departamento": "Ventas", 
 "Salario": 45000.00 
 ,
 "IDEmpleado": 4, 
 "Nombre": "Alicia", 
 "Apellido": "Castillo", 
 "Email": "aliciac@ejemplo.com", 
 "Departamento": "HR", 
 "Salario": 55000.00 
]);

Este fragmento de código crea una colección Empleados con cuatro documentos de ejemplo (los cuatro empleados del ejemplo de base de datos relacional de la sección ). Hay que tener en cuenta que MongoDB utiliza un esquema flexible, por lo que cada documento (cada empleado de nuestro ejemplo) podría tener diferentes campos y tipos de datos.

Para crear una colección llamada Departamentos con los datos del ejemplo de la sección podemos utilizar el código siguiente:

db.createCollection("Departamentos");
db.Departamentos.insertMany([
 "IDDepartamento": 1, 
 "NombreDepartamento": "Ventas"
 ,
 "IDDepartamento": 2, 
 "NombreDepartamento": "Marketing"
 ,
 "IDDepartamento": 3, 
 "NombreDepartamento": "HR"
]);

Este código de MongoDB crea una colección Departamentos con tres documentos. Podemos ver que, a diferencia de la base de datos relacional, MongoDB no impone relaciones estrictas entre colecciones, por lo que no necesitamos crear una restricción de clave foránea. En su lugar, podemos utilizar consultas para vincular entre sí datos de diferentes colecciones si es necesario.

Para recuperar todos los empleados en el departamento «Ventas» podemos escribir:

db.Empleados.find("Departamento": "Ventas")

Este código de MongoDB utiliza el método find() para recuperar todos los documentos de la colección Empleados en los que el campo Departamento sea igual a «Ventas». Se puede proporcionar otro valor al argumento del método find() para recuperar todos los empleados de un departamento diferente, o utilizar otros operadores de consulta para filtrar los resultados en función de varios criterios. Además, se puede especificar qué campos incluir o excluir de los resultados utilizando el parámetro projection. También sería posible ordenar los resultados utilizando el parámetro sort, entre otras opciones.

A continuación se muestra un ejemplo de código MongoDB para recuperar los correos electrónicos de todos los empleados del departamento «Ventas»:

db.Empleados.find("Departamento": "Ventas", "Email": 1)

Como se ha indicado anteriormente, el segundo argumento que se pasa al método find() es un parámetro opcional projection, que especifica qué campos incluir en los resultados. En este caso, sólo incluimos el campo Email (con valor 1 o true para indicar que debemos incluir este campo en los resultados), y excluimos todos los demás campos. Se puede modificar dicho valor para incluir o excluir otros campos, o utilizar otros operadores de consulta para filtrar los resultados en función de diferentes criterios.

Si quisiéramos recuperar los correos electrónicos de todos los empleados del departamento «Ventas» y ordenarlos según el nombre del empleado, podríamos utilizar el siguiente fragmento de código:

db.Empleados.find(
 NombreDepartamento: "Ventas" ,
 _id: 0, Email: 1, Nombre: 1 
).sort( Nombre: 1 )

El campo NombreDepartamento se utiliza para especificar el Departamento, y el parámetro projection se utiliza para seleccionar sólo los campos Email y Nombre de los documentos. El campo _id se incluye por defecto en todos los documentos devueltos, por lo que si no lo necesitamos lo marcamos en el parámetro projection con el valor 0 o false.

El método sort se utiliza para ordenar los resultados por el campo Nombre en orden ascendente. Por defecto, MongoDB ordena los resultados en orden ascendente, por lo que no necesitaríamos especificar el orden de ordenación explícitamente como 1.

Este fragmento de código devolvería un objeto cursor que contiene los correos electrónicos y los nombres de todos los empleados del departamento «Ventas», ordenados por su nombre. Podemos iterar sobre el cursor para acceder a los resultados o manipularlos:

const cursor = db.Empleados.find("Departamento": "Ventas", "Email": 1);
while (cursor.hasNext()) 
 const Empleado = cursor.next();
 console.log(Empleado.Email);

Este código JavaScript asume que se está utilizando el controlador Node.js de MongoDB para ejecutar la consulta e iterar sobre el cursor. El método find() devuelve un cursor a los resultados, sobre los que se puede iterar usando los métodos hasNext() y next(). En cada iteración del bucle, el método next() devuelve el siguiente documento en el cursor como un objeto JavaScript, al que se puede acceder utilizando la notación de objetos para recuperar el campo Email (es decir, Empleado.Email). Este ejemplo simplemente presenta el correo electrónico por la consola, pero se podría hacer cualquier otra cosa con los datos, como almacenarlos en una matriz o pasarlos a una función.

Otros sistemas de bases de datos orientadas a documentos populares serían por ejemplo Amazon DynamoDB, el servicio de base de datos NoSQL totalmente administrado de Amazón Web Services (AWS), o Apache CouchDB, sistema de base de datos orientado a documentos que proporciona una API HTTP RESTful para el acceso a los datos.

Bases de datos orientadas a documentos

Un ejemplo de base de datos orientada a objetos es db4o. Se trata de un sistema de gestión de bases de datos orientado a objetos de código abierto que proporciona persistencia y recuperación nativa de objetos para aplicaciones escritas en Java y .NET/C. Almacena objetos directamente en la base de datos, en lugar de utilizar un modelo relacional o un modelo documental típico de los sistemas orientados a documentos. El hecho de trabajar de manera nativa con objetos proporciona además soporte para conceptos orientados a objetos como herencia, polimorfismo y encapsulación.

A continuación presentamos un ejemplo de cómo se puede crear una clase Java simple y dotar de persistencia a sus objetos utilizando db4o:

import com.db4o.*;
import com.db4o.query.*;
public class Persona 
  // Atributos de la clase Persona: nombre, edad y dirección.
  private String nombre;
  private int edad;
  private String direccion;
  // Constructor
  public Persona(String nombre, int edad, String direccion) 
    this.nombre = nombre;
    this.edad = edad;
    this.direccion = direccion;
  // getters
  public String getNombre()  return nombre; 
  public int getEdad()  return edad; 
  public String getAddress()  return direccion; 
  // setters
  public void setNombre(String nombre)  this.nombre = nombre; 
  public void setEdad(int edad)  this.edad = edad; 
  public void setAddress(String direccion)  this.direccion = direccion; 
  //
  // Programa principal: crea un objeto persona y lo almacena de manera 
  // persistente en una base de datos en un fichero
  //
  public static void main(String[] args) 
    // Abrir el archivo de base de datos db4o
    ObjectContainer db = 
    	Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "personas.db");
    // Crear un nuevo objeto persona y almacenarlo en la base de datos
    Persona persona1 = new Persona("Juan Alonso", 35, "Calle de la Luz 23");
    db.store(persona1);
    // Consultar la base de datos para todas las personas e imprimir sus nombres
    Query query = db.query();
    query.constrain(Persona.class);
    ObjectSet<Persona> personas = query.execute();
    while (personas.hasNext()) 
      Persona persona = personas.next();
      System.out.println(persona.getNombre());
    // Cierra la base de datos
    db.close();

Este código Java crea una sencilla clase llamada Persona con tres atributos (nombre, edad y direccion) y métodos para obtener y asignar valores a estos atributos (getters y setters). A continuación, crea un archivo de base de datos db4o, almacena un objeto Persona en la base de datos, consulta la base de datos para todas las personas e imprime sus nombres. Finalmente, cierra la base de datos. Este ejemplo demuestra lo fácil que es dotar de persistencia a objetos y consultar objetos en una base de datos orientada a objetos como db4o.

Bases de datos orientadas a columnas

En una base de datos orientada a columnas, los datos se almacenan verticalmente en columnas, en lugar de horizontalmente en filas como en una base de datos relacional tradicional donde los registros se almacenan en filas. Esto permite una consulta y un procesamiento más eficientes de grandes conjuntos de datos, especialmente para cargas de trabajo importantes.

Un ejemplo de base de datos orientada a columnas es Apache Cassandra. Cassandra es una base de datos no relacional altamente escalable y distribuida que está optimizada para cargas de trabajo intensivas de escritura. La utilizan muchas organizaciones que manejan datos a gran escala, como Facebook, Netflix y eBay.

En Cassandra, los datos se organizan en espacios de claves, similares a las bases de datos relacionales tradicionales. Cada espacio de claves contiene una o varias tablas, definidas por un conjunto de columnas y sus tipos de datos asociados. Los datos de una tabla se almacenan en columnas, que se agrupan a su vez en familias de columnas.

A continuación se muestra un ejemplo de cómo podría definirse una tabla en Cassandra utilizando su lenguaje de consultas (CQL, Cassandra Query Language):

CREATE TABLE user (
   idusuario uuid PRIMARY KEY,
   nombre text,
   apellido text,
   email text,
   edad int,
   poblacion text
) WITH compression = 
	'sstable_compression': 'LZ4Compressor', 'chunk_length_kb': '64';

En este ejemplo, la tabla de usuarios user tiene seis columnas: id_usuario, nombre, apellido, correo, edad y poblacion. La columna id_usuario es la clave principal de la tabla, que determina cómo se particionan y distribuyen los datos. A continuación presentamos una consulta sencilla para obtener los correos electrónicos de todos los usuarios de determinada población:

SELECT email FROM user WHERE poblacion = 'Baiona';

La sentencia SELECT lee una o varias columnas de una o varias filas de una tabla. Devuelve un conjunto de resultados con las filas que coinciden con la petición, donde cada fila contiene los valores de la selección correspondiente a la consulta. Además, pueden aplicarse al resultado funciones que incluyan agregaciones. Por ejemplo,

SELECT count (*) FROM user WHERE poblacion = 'Baiona';

Devuelve el número total de usuarios que hay en «Baiona».

Las bases de datos orientadas a columnas como Cassandra son adecuadas para cargas de trabajo analíticas que requieren la consulta de grandes conjuntos de datos. Pueden manejar grandes cargas de escritura y lectura y escalar horizontalmente añadiendo más nodos de procesamiento como los sistemas orientados a documentos. Sin embargo, pueden no ser tan eficientes para cargas de trabajo transaccionales que requieren actualizaciones o inserciones frecuentes de registros individuales. Podemos decir que las bases de datos orientadas a columnas comparten aspectos de las bases de datos relacionales y las bases de datos orientadas a documentos.

Otro sistema de gestión de datos de estas características sería Apache HBase, un sistema de base de datos distribuido que proporciona acceso de lectura/escritura en tiempo real a grandes conjuntos de datos.

Bases de datos jerárquicas

Un ejemplo de base de datos jerárquica sería el https://www.ibm.com/es-es/products/imsInformation Management System (IMS) de IBM. IMS es un sistema de gestión de bases de datos jerárquicas diseñado para aplicaciones de procesamiento de transacciones de alto rendimiento. Se utiliza principalmente en entornos mainframe a gran escala, como la banca, las finanzas y los seguros.

En una base de datos jerárquica como IMS, los datos se organizan en una estructura similar a un árbol, en la que cada registro tiene un padre y potencialmente varios hijos. Las relaciones padre-hijo modelan una jerarquía natural en los datos. Por ejemplo, en una aplicación bancaria, un registro de cliente puede ser el padre de varios registros de cuenta (cada cliente puede tener varias cuentas), y cada registro de cuenta puede ser el padre de varios registros de transacción (cada cuenta suele registrar un conjunto indeterminado de transacciones).

A continuación se muestra un ejemplo de cómo podría estructurarse una base de datos jerárquica en IMS:

CLIENTE
    +- CUENTA
          +- TRANSACCION
          +- TRANSACCION
          +- TRANSACCION
    +- CUENTA
          +- TRANSACCION
          +- TRANSACCION

En este ejemplo, el registro CLIENTE es el padre de nivel superior, y cada registro CUENTA es hijo del registro CLIENTE. Cada registro TRANSACCION es hijo de un registro CUENTA.

Las bases de datos jerárquicas como IMS son especialmente eficientes para manejar grandes cantidades de datos con requisitos de alto rendimiento. Sin embargo, pueden ser más difíciles de gestionar que otros modelos de bases de datos y pueden ser menos flexibles en términos de capacidades de consulta y elaboración de informes.

Bases de datos orientadas a grafos

Las bases de datos de grafos pueden considerarse bases de datos NoSQL especiales optimizadas para datos con muchas relaciones. Si no hay relaciones entre las entidades, tiene poco sentido utilizar este tipo de base de datos.

A continuación presentamos un sencillo ejemplo de uso utilizando https://neo4j.comNeo4j, quizá la plataforma más popular hoy en día para la gestión de grafos. Supongamos que estamos desarrollando una red social y queremos almacenar las relaciones entre las personas usuarias en un grafo. Mediante Neo4j, podemos representar las personas usuarias como nodos y las relaciones entre ellas como aristas. Para crear un nuevo nodo de usuario en Neo4j, usamos una consulta en lenguaje Cypher:

CREATE (:Usuario nombre: "Juan", edad: 30, genero: "masculino")

Cypher es un lenguaje de consulta declarativo utilizado en Neo4j, diseñado para facilitar la consulta y manipulación de datos en grafos con una sintaxis similar a la del lenguaje SQL. Da soporte a la creación de nodos y relaciones, así como al filtrado y búsqueda de nodos y relaciones específicos. La consulta Cypher anterior crea un nuevo nodo de usuario con las propiedades nombre, edad y genero.

También es posible crear relaciones entre nodos utilizando consultas Cypher. Por ejemplo, para crear una relación AMIGO_DE entre dos usuarios, podemos utilizar la siguiente consulta:

MATCH (u1:Usuario nombre: "Juan"), (u2:Usuario nombre: "María")
CREATE (u1)-[:AMIGO_DE]->(u2)

Esta consulta empareja los nodos de usuario con los nombres «Juan» y «María» y crea una relación AMIGO_DE entre ellos.

Una vez almacenados los datos en Neo4j, podemos realizar varios tipos de consultas y análisis sobre los datos. Por ejemplo, podemos usar Cypher para encontrar todos los usuarios que son amigos de un usuario en particular:

MATCH (u1:Usuario nombre: "Pepe")-[:AMIGO_DE]->(u2:Usuario)
RETURN u2.nombre

Esta consulta busca el nodo de usuario con el nombre «Pepe» y devuelve los nombres de todos los usuarios que son amigos suyos. De manera más genérica, las consultas de búsqueda de nodos relacionados tienen el formato:

MATCH (n:Label)-[r]->(m)
RETURN n, r, m

Donde «Label» es la etiqueta de los nodos que nos interesan, y «r» es la relación entre los nodos «n» y «m». La palabra clave MATCH especifica el patrón a comparar en el grafo, y la palabra clave RETURN especifica los datos a devolver.

Otros sistemas de almacenes de grafos serían FlockDB o InfiniteGraph. FlockDB es un sistema de base de datos de grafos distribuidos desarrollado por Twitter y diseñado para almacenar y consultar grafos a gran escala con miles de millones de nodos y aristas. FlockDB utiliza un modelo de datos de grafos sencillo que representa los nodos como enteros únicos de 64 bits y las aristas como relaciones unidireccionales entre nodos. InfiniteGraph está diseñado para almacenar y consultar grafos a gran escala. A diferencia de otras bases de datos de grafos, InfiniteGraph utiliza un modelo de hipergrafo que permite conectar nodos a cualquier número de otros nodos mediante aristas que pueden tener cualquier número de puntos finales. Esto proporciona un modelo de datos muy flexible que puede representar relaciones complejas entre entidades.

Almacenes de pares clave-valor

Redis es un popular almacén de estructuras de datos en memoria que soporta varias estructuras de datos, incluyendo pares clave-valor. Presentamos a continuación un sencillo ejemplo de gestión de pares clave-valor utilizando Redis.

Vamos a suponer que tenemos una aplicación Web en la que es necesario almacenar y recuperar sesiones de usuario. Podemos almacenar estos datos de sesión en forma de pares clave-valor con Redis. Para ello utilizamos el comando SET, que define un valor para una clave dada:

SET session:<session_id> <session_data>

session_id es un identificador único para la sesión (la clave), y session_data son los datos asociados a la sesión (el valor asociado a la clave). Por ejemplo, si deseamos almacenar una sesión con el identificador «12345» y los datos

"user_id": "123", "username": "Juan"

podemos utilizar el siguiente comando:

SET session:12345 '"user_id": "123", "username": "Juan"'

Para recuperar una sesión de usuario con Redis, podemos utilizar el comando GET:

GET session:<session_id>

Por ejemplo, para recuperar la sesión con ID «12345», podemos utilizar el comando:

GET session:12345

Este comando devolverá los datos de la sesión (el valor asociado a la clave «12345») como una cadena en formato JSON.

Además de operaciones básicas como SET y GET, Redis proporciona muchos otros comandos para gestionar pares clave-valor, incluyendo operaciones para incrementar o decrementar valores numéricos, añadir valores a valores ya existentes, etc. En resumen, Redis proporciona una forma sencilla y rápida de gestionar pares clave-valor, muy adecuada para aplicaciones que requieren un alto rendimiento y escalabilidad.

Otros esquemas para la gestión de partes clave-valor serían por ejemplo Couchbase, un sistema de gestión de datos que proporciona almacenamiento distribuido clave-valor con capacidades de consulta, o MemcacheDB, basado en un modelo de datos en el que los datos se almacenan como pares clave-valor y se distribuyen entre varios nodos de un clúster. Ofrece una API sencilla para consultar y actualizar datos utilizando lenguajes de programación populares como Java, Python y Ruby.

Recapitulación

Los sistemas de bases de datos son un componente crucial de los sistemas informáticos actuales, ya que se utilizan para almacenar, gestionar y recuperar grandes cantidades de datos. Una base de datos es un conjunto de datos organizados y almacenados en un formato predefinido, lo que facilita su acceso y manipulación. Existen varios tipos de sistemas de bases de datos. En este texto hemos analizado brevemente las bases de datos relacionales, las bases de datos orientadas a documentos, las bases de datos orientadas a objetos, las orientadas a columnas, las orientadas a grafos, los almacenes de pares clave-valor y las bases de datos jerárquicas. Cada tipo de base de datos tiene sus puntos fuertes y débiles, dependiendo de los requisitos específicos de cada aplicación.

Las bases de datos relacionales son el tipo más común de base de datos. Basadas en el modelo relacional, con una fundamentación teórica muy asentada y robusta, los datos se almacenan en tablas cuyas filas representan registros de datos. Se utilizan para muchos tipos de aplicaciones diferentes, desde soluciones a pequeña escala hasta grandes sistemas empresariales. Las bases de datos orientadas a documentos, por su parte, están diseñadas para manejar datos no estructurados y pueden ser más flexibles y escalables que las bases de datos relacionales. Las bases de datos orientadas a objetos se utilizan para almacenar objetos y explotar las propiedades del paradigma de objetos (herencia, polimorfismo y encapsulamiento). Las bases de datos orientadas a columnas combinan propiedades de las bases de datos relacionales y las NoSQL, las orientadas a grafos explotan las relaciones entre las entidades almacenadas, los almacenes de claves-valor con su modelo de datos sencillo son muy adecuadas en aplicaciones que requieren alta disponibilidad y acceso a los datos en tiempo real, y finalmente las bases de datos jerárquicas organizan los datos en una estructura similar a un árbol.

Las bases de datos modernas suelen implementarse mediante software especializado, como MySQL, Oracle, MongoDB, db4o, Neo4j, Redis, IMS o Cassandra, entre otros. En general, cualquier sistema de gestión de bases de datos proporciona diversas funciones además del almacemamiento y recuperación de información, como replicación de datos, copias de seguridad y recuperación ante errores, u optimización del rendimiento. Una base de datos bien diseñada ayuda a mejorar el rendimiento de las aplicaciones, reducir la redundancia de datos y aumentar la seguridad.

A continuación se proponen algunas referencias básicas para profundizar en el campo de las bases de datos.

  • «Database System Concepts» de Abraham Silberschatz, Henry F. Korth y S. Sudarshan es un libro de texto muy utilizado sobre sistemas de bases de datos, que abarca temas como el diseño de bases de datos relacionales, el procesamiento y la optimización de consultas, el control de la concurrencia y la gestión de transacciones.
  • «An Introduction to Database Systems» de C. J. Date proporciona una introducción completa a la teoría y la práctica de los sistemas de bases de datos, incluido el diseño de bases de datos relacionales, la normalización y SQL.
  • «Database Management Systems» de Raghu Ramakrishnan y Johannes Gehrke cubre una amplia gama de temas relacionados con los sistemas de bases de datos, incluido el diseño de bases de datos relacionales, el procesamiento y la optimización de consultas, la gestión de transacciones y las bases de datos distribuidas.
  • «Modern Database Management» de Jeffrey A. Hoffer, Ramesh Venkataraman y Heikki Topi cubre los aspectos básicos de los sistemas de bases de datos, el diseño de bases de datos, la normalización y SQL, así como temas más avanzados como las bases de datos distribuidas, el almacenamiento de datos y la inteligencia empresarial.
  • «Database Systems: A Practical Approach to Design, Implementation and Management» de Thomas Connolly y Carolyn Begg ofrece un enfoque práctico de los sistemas de bases de datos y abarca temas como el diseño de bases de datos, SQL, la gestión de transacciones y la seguridad de las bases de datos.
  • «Fundamentals of Database Systems» de Ramez Elmasri y Shamkant B. Navathe es un libro de texto que también cubre los fundamentos de los sistemas de bases de datos, el diseño de bases de datos, normalización, SQL, gestión de transacciones y control de concurrencia.
  • «NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence» de Martin Fowler y Pramod Sadalage es una excelente introducción al mundo de las bases de datos NoSQL. El libro ofrece una visión clara y concisa de los diferentes tipos de bases de datos no relacionales, incluidas las orientadas a documentos, las de clave-valor, las orientadas a columnas y las de grafos, y explica cuándo y por qué pueden ser adecuadas para determinadas aplicaciones. Los autores también tratan temas imp rtantes como la coherencia, la disponibilidad y la tolerancia a las particiones, y explican cómo se abordan en las bases de datos no relacionales
  • «Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement» de Eric Redmond y Jim R. Wilson es una guía completa sobre el mundo de las bases de datos no relacionales. El libro adopta un enfoque práctico, ofreciendo a los lectores la oportunidad de trabajar con siete bases de datos no relacionales diferentes a lo largo de siete semanas. Los autores ofrecen una breve introducción a cada base de datos, junto con ejemplos prácticos de cómo utilizarlas.

Estos libros son sólo algunos ejemplos de la amplia bibliografía disponible sobre sistemas de bases de datos. Dependiendo de tus intereses y necesidades específicas, puede que haya otros libros, artículos y recursos en línea más adecuados para ti.

También puedes encontrar en Internet buenos tutoriales y cursos para empezar:

  • W3Schools SQL Tutorial. W3Schools es un sitio web que ofrece tutoriales sobre diversas tecnologías de desarrollo web, incluido SQL. Su tutorial de SQL cubre los conceptos básicos de SQL, incluyendo la creación de tablas, inserción de datos, consulta de datos y modificación de datos.
  • SQLZoo es un tutorial en línea gratuito que ofrece ejercicios interactivos de SQL. El tutorial cubre los conceptos básicos de SQL, como las sentencias SELECT y las uniones, así como temas más avanzados como las subconsultas y las funciones agregadas.
  • MongoDB University ofrece cursos gratuitos en línea sobre diversos temas relacionados con MongoDB, como la administración de bases de datos, el modelado de datos y el desarrollo de aplicaciones con MongoDB. Estos cursos incluyen clases en vídeo, cuestionarios y ejercicios prácticos.
  • Cassandra Tutorial. Este tutorial de W3Schools sobre Cassandra presenta los aspectos básicos de esta base de datos orientada a columnas y del lenguaje de consultas CQL. Además, ofrece una comparación con HBase (otra base de datos orientada a columnas muy popular) y con los sistemas de bases de datos relacionales.
  • Getting started with Redis. Tutorial de Redis disponible en el sitio oficial de este almacén de estructuras en memoria. Cubre la instalación de Redis en diversos sistemas, el uso de su intérprete de comandos y la integración de Redis con los lenguajes de programación más populares.
  • Neo4j Tutorials. Página de tutoriales oficial de Neo4j. Ofrece tutoriales para ilustrar las capacidades de importación de datos y para configurar y usar una base de datos en diversos escenarios.
  • The db4o Tutorial es un curso gratuito en línea sobre este sistema de bases de datos orientado a objetos. Cubre los aspectos básicos de esta base de datos, el diseño de bases de datos y diversas tareas de programación con ejercicios prácticos de utilización de todas las funcionalidades ofrecidas por la API de db4o.
  • Cursos de bases de datos de Udemy. Udemy es una plataforma de aprendizaje en línea que ofrece una amplia gama de cursos, entre ellos cursos sobre sistemas de bases de datos.
  • Cursos de bases de datos de Coursera. Coursera es una plataforma de aprendizaje en línea que ofrece cursos de las mejores universidades y organizaciones. Hay varios cursos de bases de datos disponibles en esta plataforma: cursos sobre SQL, diseño de bases de datos y almacenamiento de datos, etc.
    •  

Referencias

  • Connolly, Thomas y Carolyn Begg (2014). Database Systems: A Practical Approach to Design, Implementation, and Management. Pearson.
  • Date, C. J. (2004). An Introduction to Database Systems. Addison-Wesley.
  • Elmasri, Ramez y Shamkant B. Navathe (2016). Fundamentals of Database Systems. Pearson. Fowler, Martin y Pramod Sadalage (2012). NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence. Addison-Wesley Professional.
  • Hoffer, Jeffrey A., Ramesh Venkataraman y Heikki Topi (2019). Modern Database Management. Pearson.
  • Ramakrishnan, Raghu y Johannes Gehrke (2003). Database Management Systems. McGraw-Hill.
  • Redmond, Eric y Jim R. Wilson (2012). Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement. Pragmatic Bookshelf.
  • Silberschatz, Abraham, Henry F Korth y S Sudarshan (2010). Database System Concepts. McGraw-Hill.
Descargar esta intro en PDF
Comparte tu aprecio
Manuel J. Fernández Iglesias
Manuel J. Fernández Iglesias

Ingeniero de Telecomunicación (1990) por la Universidad de Santiago de Compostela y Doctor Ingeniero de Telecomunicación (1997) por la Universidade de Vigo. Desde 1990 es profesor la Escuela de Ingenieros de Telecomunicación de Vigo. Tiene más de un centenar de publicaciones internacionales en el ámbito de las TIC, y participa regularmente en proyectos de investigación internacionales con empresas e instituciones del sector TIC, así como en proyectos internacionales de cooperación educativa. Entre 2005 y 2009 interrumpe esa dedicación para incorporarse a la administración gallega y al operador público gallego de telecomunicaciones Retegal S.A. Este nuevo reto le permite diseñar y dirigir el proceso de transición a la Televisión Digital Terrestre en Galicia, así como otros grandes proyectos en el campo de las infraestructuras de telecomunicación. Su actividad investigadora se centra en los servicios de telecomunicación, aplicando los resultados de su trabajo en campos como la educación, la atención a la dependencia, la recuperación de información, los sistemas de gestión de contenidos, o la representación de información multimedia. Su actividad docente se desarrolla de forma continuada en la EE de Ingenieros de Telecomunicación. Scopus ID: 6602607569; Researcher ID: I-1695-2013; Orcid: 0000-0003-4462-8724; LinkedIn

Artículos: 16