Almacenar datos de experimentos de forma permanente en una base de datos
Hasta ahora, hemos estado gestionando los datos de las muestras en un array en el servidor Express. El problema es que, si apagamos y encendemos el servidor, todos los datos desaparecen. Esto se debe a que los arrays solo existen en la memoria.
En un laboratorio, si escribimos los resultados en una nota adhesiva, esta puede volar con el viento, pero si los escribimos en un cuaderno de laboratorio, se conservarán de forma permanente. Una base de datos es el cuaderno de laboratorio del desarrollo web: incluso si el servidor se apaga o la computadora se reinicia, los datos permanecerán seguros.
Archivos vs. bases de datos
Anteriormente, aprendimos cómo leer y escribir archivos CSV con Node.js. Si los archivos también pueden almacenar datos, ¿por qué necesitamos una base de datos?
| Archivo (CSV, JSON) | Base de datos | |
|---|---|---|
| Búsqueda | Lee todo el archivo y filtra manualmente | Busca instantáneamente según las condiciones especificadas |
| Acceso simultáneo | Si varios programas escriben al mismo tiempo, se produce un conflicto | Maneja el acceso simultáneo de forma segura |
| Volumen de datos | Se vuelve lento con decenas de miles de registros | Procesa rápidamente millones de registros |
| Aplicación de estructura | Puede almacenar cualquier formato (riesgo de errores) | Aplica tipos de columna (INT, VARCHAR, etc.) |
Si tienes 10 muestras de experimento, una hoja de cálculo es suficiente. Sin embargo, si quieres encontrar "solo las muestras de sangre registradas en marzo de 2024 con un OD de 1.0 o más" en 100.000 registros de datos de muestra, será una tarea ardua con un archivo, pero con una base de datos, se puede hacer con una sola línea.
SQL: el lenguaje para comunicarse con una base de datos
SQL (Structured Query Language) es el lenguaje que utilizamos para decirle a la base de datos: "dame estos datos", "guarda esto" o "borra esto".
SQL es uno de los lenguajes de programación más fáciles de aprender. Se lee como una frase en inglés:
SELECT name, od FROM samples WHERE status = 'fail';Esta línea significa "obtener el nombre y el valor de OD de las filas en la tabla 'samples' donde el estado es 'fallido'". Al igual que PubMed busca artículos utilizando combinaciones de palabras clave, SQL busca datos utilizando combinaciones de condiciones.
Tabla: la estructura de los datos
En una base de datos, los datos se almacenan en una tabla. Tiene una estructura similar a una hoja de cálculo de Excel:
Tabla samples
┌────┬──────────────┬──────┬────────┬────────────┐
│ id │ name │ od │ status │ created_at │
├────┼──────────────┼──────┼────────┼────────────┤
│ 1 │ Blood-A │ 1.85 │ pass │ 2026-03-01 │
│ 2 │ Tissue-B │ 0.42 │ fail │ 2026-03-02 │
│ 3 │ Serum-C │ 2.10 │ pass │ 2026-03-03 │
│ 4 │ Plasma-D │ 0.15 │ fail │ 2026-03-03 │
└────┴──────────────┴──────┴────────┴────────────┘Glosario:
- Fila = Un registro. Toda la información de una muestra.
- Columna = Un elemento. Tipo de dato como nombre, valor de OD, estado.
- Esquema = El diseño de la tabla. Qué columnas hay y cuál es el tipo de dato de cada columna.
CRUD: Las 4 operaciones básicas de los datos
El núcleo de todos los sistemas de información es CRUD: crear, leer, actualizar, eliminar. Un LIMS de laboratorio es, en última instancia, una combinación de estas cuatro operaciones.
CREAR: Crear una tabla
CREATE TABLE samples (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
od DECIMAL(5, 2),
status VARCHAR(10) DEFAULT 'pending',
created_at DATE
);INT— Entero (id, número de muestra)VARCHAR(100)— Cadena de texto de máximo 100 caracteres (nombre de la muestra)DECIMAL(5, 2)— Número con decimales (valor de OD: 2 decimales)AUTO_INCREMENT— El número se incrementa automáticamente cuando se agrega una nueva filaPRIMARY KEY— Esta columna es el identificador único de cada filaNOT NULL— No se permiten valores vacíos
Es como crear un espacio en el protocolo que diga "Temperatura de reacción: ___°C, tiempo: ___ minutos". Definir la estructura primero ayuda a evitar que se introduzcan datos incorrectos más adelante.
INSERT — Insertar datos
INSERT INTO samples (name, od, status, created_at) VALUES
('Blood-A', 1.85, 'pass', '2026-03-01'),
('Tissue-B', 0.42, 'fail', '2026-03-02'),
('Serum-C', 2.10, 'pass', '2026-03-03');id es AUTO_INCREMENT, por lo que, aunque no se introduzca manualmente, se asignarán automáticamente los valores 1, 2 y 3.
SELECT — Obtener datos (el comando más utilizado)
-- Consultar todo
SELECT * FROM samples;
-- Solo columnas concretas
SELECT name, od FROM samples;
-- Consulta con una condición
SELECT * FROM samples WHERE status = 'fail';
-- Solo OD mayor o igual que 1.0, ordenado de mayor a menor OD
SELECT name, od FROM samples WHERE od >= 1.0 ORDER BY od DESC;
-- Contar los registros
SELECT COUNT(*) FROM samples WHERE status = 'pass';La fortaleza de SQL reside en esta combinación de condiciones. No es necesario abrir un archivo y compararlo elemento por elemento con un bucle "for"; simplemente se especifican las condiciones y la base de datos encuentra los datos de la manera más eficiente.
UPDATE — Modificación de datos
-- Actualizar el OD de la muestra con id 2 usando el valor vuelto a medir
UPDATE samples SET od = 0.98, status = 'pass' WHERE id = 2;Si omite la condición WHERE, se modificarán todas las filas. Es como si, al intentar modificar solo el resultado de una muestra en un cuaderno de laboratorio, se sobrescribiera todo. Asegúrese de verificar WHERE en UPDATE y DELETE.
DELETE — Eliminar datos
-- Eliminar una muestra concreta
DELETE FROM samples WHERE id = 4;
-- Eliminar todas las muestras con estado fail (¡cuidado!)
DELETE FROM samples WHERE status = 'fail';Base de datos relacional: conexión entre tablas
El nombre "relacional" indica que las tablas pueden establecer relaciones entre sí. Si conectamos la tabla de muestras con la tabla de investigadores:
Tabla researchers Tabla samples
┌────┬──────────┐ ┌────┬──────────┬───────────────┐
│ id │ name │ │ id │ name │ researcher_id │
├────┼──────────┤ ├────┼──────────┼───────────────┤
│ 1 │ Ana │◄─────────│ 1 │ Blood-A │ 1 │
│ 2 │ Carlos │◄─────────│ 2 │ Tissue-B │ 2 │
└────┴──────────┘ │ 3 │ Serum-C │ 1 │
└────┴──────────┴───────────────┘researcher_id es la clave para conectar las dos tablas. Con esta estructura:
SELECT samples.name, researchers.name
FROM samples
JOIN researchers ON samples.researcher_id = researchers.id
WHERE researchers.name = 'Ana';"Muestra solo las muestras registradas por el investigador Kim" — Es similar a usar VLOOKUP en Excel, pero funciona en cuestión de segundos, incluso con millones de registros.
¿Qué base de datos usar?
| Producto | Características | Situaciones adecuadas |
|---|---|---|
| MySQL | La base de datos de código abierto más utilizada | Servicios web (WordPress, la mayoría de los sitios web) |
| PostgreSQL | Funciones avanzadas, fuerte en consultas complejas | Servicios centrados en el análisis, Supabase |
| SQLite | No requiere instalación, un solo archivo es toda la base de datos | Aplicaciones locales, prototipos, proyectos personales |
Proyectos como BioPlayground utilizan Supabase (basado en PostgreSQL). La sintaxis SQL es más del 90% igual tanto en MySQL como en PostgreSQL, por lo que si aprendes una, puedes adaptarte fácilmente a la otra.
¡Pruébalo tú mismo! (Ejemplo atenuado)
Completa los espacios en blanco para completar la consulta SQL para buscar muestras que fallaron en el control de calidad.
name, odFROMstatus = 'fail'ORDER BY od ;
Errores comunes y soluciones
P: Aparece el error Table 'database.samples' doesn't exist
No ha ejecutado CREATE TABLE o está conectado a una base de datos diferente. Verifique la lista de tablas de la base de datos actual con SHOW TABLES;.
P: Quería modificar solo una fila con UPDATE, pero se modificaron todas
Omitió la condición WHERE. UPDATE samples SET status = 'pass' cambia el estado a "pass" en todas las filas. Asegúrese de agregar una condición como WHERE id = 2. Antes de realizar operaciones importantes, ejecute primero SELECT con la misma condición WHERE para verificar qué filas se verán afectadas.
P: ¿Cuál es la diferencia entre VARCHAR y TEXT?
VARCHAR(100) almacena hasta 100 caracteres y especifica la longitud. TEXT tiene muy pocas restricciones de longitud. Para datos cortos como nombres de muestras o estados, VARCHAR es apropiado; para notas de experimentos o descripciones largas, TEXT es más adecuado.
P: ¿Las sentencias SQL deben estar en mayúsculas?
No. SELECT y select son lo mismo. El uso de mayúsculas es solo una convención. Escribir las palabras clave SQL en mayúsculas y los nombres de tablas/columnas en minúsculas facilita la lectura del código.
P: ¿Existe alguna herramienta GUI para ver MySQL en lugar de la terminal?
Aunque la forma básica de conectarse a MySQL es a través de la terminal con mysql -u root -p, el uso de un cliente GUI permite verificar visualmente la estructura de la tabla y los datos.
| Herramienta | Características | Precio |
|---|---|---|
| Sequel Ace | Ligero y rápido. Óptimo para la administración básica de consultas/tablas (solo para Mac) | Gratuito |
| TablePlus | Interfaz de usuario elegante. Admite varias bases de datos, como MySQL, PostgreSQL y SQLite | Parcialmente gratuito |
| MySQL Workbench | Herramienta oficial de MySQL. Tiene muchas funciones, pero es pesada | Gratuito |
Recomendamos comenzar con Sequel Ace (Mac) o MySQL Workbench (todas las plataformas). Después de familiarizarse con la escritura directa de comandos SQL, puede usar la GUI como ayuda para verificar los datos de un vistazo.