TEI – Tema 34. El modelo relacional. Definiciones y conceptos básicos. Arquitectura. Diseño. Normalización. Manipulación: álgebra y cálculo relacional. Modelo entidad– relación. El lenguaje SQL. Normas y estándares para la interoperabilidad entre gestores de bases de datos relacionales. Principales SGBD comerciales. SGBD de código abierto.

Técnico/a Especialista Informática Servicio Andaluz de Salud JUNTA DE ANDALUCÍA
Tema 34: El Modelo Relacional y Bases de Datos – SAS Oposiciones

📊 Tema 34: El Modelo Relacional

Definiciones, conceptos básicos, arquitectura, diseño, normalización y SQL aplicados al SAS

1. Introducción y Contextualización

Bienvenido a uno de los temas más fundamentales y técnicamente exigentes del temario. Las bases de datos relacionales son la columna vertebral de todos los sistemas de información del SAS. Desde que un médico accede a la Historia Clínica Digital en Diraya, hasta que se genera una receta electrónica en Receta XXI, pasando por el análisis de datos en el Business Intelligence Corporativo… todo funciona sobre potentes sistemas gestores de bases de datos relacionales.

Este tema no es teórico ni abstracto: es pura aplicación práctica. Cada concepto que veremos aquí tiene su reflejo directo en los sistemas que gestionarás como Técnico Especialista del SAS. Y las preguntas de examen lo reflejan: normalización, arquitectura ANSI/SPARC, sentencias SQL, propiedades ACID, diferencias entre SGBD relacionales y NoSQL… son contenidos recurrentes en las convocatorias.

🎯 ¿Por qué este tema es crítico para la oposición?

Analizando los exámenes de 2019-2025, este tema aparece en TODAS las convocatorias con un mínimo de 3-5 preguntas directas. Además, se relaciona con otros temas como seguridad (ENS en BBDD), desarrollo de sistemas (tema 14-18), y arquitecturas corporativas (tema 22). Un dominio sólido de este tema te puede dar entre 4-6 puntos en el examen.

💡 Contexto SAS: El Ecosistema de Bases de Datos del SSPA

El Servicio Andaluz de Salud gestiona más de 100 millones de actos asistenciales al año para 8,5 millones de usuarios. Esta ingente cantidad de información se almacena, procesa y distribuye mediante bases de datos relacionales de misión crítica:

  • Diraya: Historia Clínica Digital sobre Oracle Database RAC (alta disponibilidad, clustering)
  • BPS (Base de Datos de Usuarios): PostgreSQL con más de 8,5M de registros activos
  • Receta XXI: Oracle con replicación en tiempo real entre 8 CPDs autonómicos
  • BI Corporativo: Datawarehouse Oracle con procesos ETL diarios (ODI)
  • Sistemas departamentales: MySQL/MariaDB para aplicaciones no críticas

Como Técnico Especialista, trabajarás con estas bases de datos: optimizando consultas, diseñando esquemas, implementando copias de seguridad, monitorizando rendimiento con AWR, resolviendo incidencias de bloqueos… Este tema es tu día a día.

1.1. Objetivos de Aprendizaje

Al finalizar este tema, serás capaz de:

  • Explicar el modelo relacional y sus fundamentos teóricos (Codd, 1970)
  • Describir la arquitectura ANSI/SPARC de tres niveles aplicada a SGBD reales
  • Diseñar bases de datos relacionales usando el modelo entidad-relación
  • Aplicar las formas normales (1FN-5FN) para eliminar redundancias
  • Dominar SQL: DDL, DML, DCL, TCL y consultas complejas
  • Diferenciar SGBD relacionales de NoSQL (MongoDB, HBase)
  • Conocer los principales SGBD comerciales (Oracle, SQL Server) y opensource (PostgreSQL, MariaDB)
  • Comprender las propiedades ACID y su importancia en entornos sanitarios
  • Trabajar con estándares de interoperabilidad (ODBC, JDBC, SQL:2016)

1.2. Esquema General del Tema

El tema sigue una progresión lógica desde los fundamentos teóricos hasta la aplicación práctica:

  1. Teoría del modelo relacional: Definiciones, conceptos, álgebra relacional
  2. Arquitectura: Niveles de abstracción, diccionario de datos, independencia
  3. Diseño: Modelo E-R, transformación a tablas, claves
  4. Normalización: Dependencias funcionales, formas normales 1FN-5FN
  5. Manipulación: Álgebra y cálculo relacional, SQL práctico
  6. Implementación: SGBD comerciales, opensource, comparativas
  7. Aplicación SAS: Casos reales en sistemas corporativos

⚠️ Errores Comunes en el Examen

  • Confundir niveles ANSI/SPARC: El diccionario de datos está en el nivel conceptual, no en el físico
  • Normalización incompleta: Saber qué elimina cada forma normal (1FN→atomicidad, 2FN→dependencias parciales, 3FN→transitivas)
  • Sentencias SQL: Diferenciar DDL (CREATE) de DML (SELECT) y DCL (GRANT)
  • ACID vs BASE: Transacciones relacionales (ACID) vs NoSQL (BASE)
  • SGBD relacionales vs NoSQL: MongoDB y HBase NO son relacionales

2. El Modelo Relacional: Fundamentos Teóricos

2.1. Orígenes e Historia

El modelo relacional fue propuesto por Edgar Frank Codd en 1970 en su artículo seminal «A Relational Model of Data for Large Shared Data Banks» publicado en Communications of the ACM. Codd, investigador de IBM, revolucionó la gestión de datos al proponer un modelo basado en la teoría matemática de relaciones (conjuntos) que permitía mayor independencia de datos y flexibilidad que los modelos anteriores (jerárquico y en red).

📖 Contexto Histórico

Antes del modelo relacional, los SGBD utilizaban modelos navegacionales (jerárquico de IBM y en red de CODASYL) donde el programador debía conocer la estructura física de almacenamiento. El modelo relacional introdujo la independencia de datos: los cambios en la estructura física no afectan a las aplicaciones.

2.2. Conceptos Fundamentales

2.2.1. Relación (Tabla)

Una relación es un conjunto de tuplas (filas) que comparten los mismos atributos (columnas). Matemáticamente, es un subconjunto del producto cartesiano de los dominios de sus atributos. En términos prácticos: una tabla con filas y columnas donde cada celda contiene un valor atómico.

Propiedades de una relación:

  • No hay filas duplicadas (cada tupla es única)
  • El orden de las filas es irrelevante
  • El orden de las columnas es irrelevante
  • Cada atributo toma valores de un dominio específico
  • Todos los valores son atómicos (no divisibles)

💡 Ejemplo SAS: Tabla PACIENTES en Diraya

PACIENTES
---------------------------------------------------------------------------
| CIP        | DNI       | NOMBRE         | APELLIDOS      | FECHA_NAC  |
---------------------------------------------------------------------------
| 0001234567 | 12345678A | Juan           | García López   | 1985-03-15 |
| 0001234568 | 87654321B | María          | Pérez Ruiz     | 1992-07-22 |
| 0001234569 | 11223344C | Antonio        | Martín Sánchez | 1978-11-30 |
---------------------------------------------------------------------------

Características:
- CIP es la clave primaria (identifica unívocamente cada paciente)
- No hay dos filas idénticas
- Cada valor es atómico (no hay listas en una celda)
- El orden de las filas no tiene significado

2.2.2. Atributo y Dominio

Un atributo es una propiedad o característica de una entidad. Cada atributo tiene asociado un dominio, que es el conjunto de valores válidos que puede tomar. Por ejemplo:

  • Atributo: EDAD → Dominio: Enteros entre 0 y 120
  • Atributo: SEXO → Dominio: {‘H’, ‘M’, ‘O’}
  • Atributo: FECHA_NACIMIENTO → Dominio: Fechas válidas en formato ISO 8601

2.2.3. Tupla (Fila o Registro)

Una tupla es una instancia específica de una relación: un conjunto ordenado de valores, uno por cada atributo. Representa un hecho del mundo real. En Diraya, cada fila de la tabla PACIENTES es una tupla que representa a un paciente concreto del SAS.

2.2.4. Claves

Las claves son fundamentales para identificar tuplas y establecer relaciones entre tablas:

Tipo de Clave Definición Ejemplo SAS
Superclave Conjunto de atributos que identifica unívocamente una tupla (puede tener atributos redundantes) {CIP, DNI, NOMBRE}
Clave Candidata Superclave mínima (sin atributos redundantes) {CIP} o {DNI}
Clave Primaria (PK) Clave candidata elegida para identificar tuplas. No admite nulos. CIP en tabla PACIENTES
Clave Alternativa Clave candidata no elegida como primaria DNI en tabla PACIENTES
Clave Foránea (FK) Atributo que referencia a la PK de otra tabla (establece relaciones) CIP_PACIENTE en tabla CITAS (referencia a PACIENTES.CIP)

🎯 Concepto Clave para el Examen

La distinción entre clave candidata y clave primaria es recurrente en preguntas. Recuerda: todas las claves primarias son claves candidatas, pero no todas las claves candidatas son elegidas como primarias. Una tabla puede tener múltiples claves candidatas pero solo UNA clave primaria.

2.3. Integridad Referencial

La integridad referencial garantiza que las relaciones entre tablas sean coherentes. Se implementa mediante claves foráneas que deben cumplir:

  • Una clave foránea debe referenciar una clave primaria existente o ser NULL (si se permite)
  • No se puede eliminar una tupla referenciada (o se propaga la eliminación en cascada)
  • No se puede insertar una tupla con FK que no exista en la tabla referenciada

💡 Ejemplo SAS: Integridad Referencial en Receta XXI

-- Tabla padre: PACIENTES
PACIENTES (CIP, DNI, NOMBRE, APELLIDOS)
PK: CIP

-- Tabla hija: RECETAS
RECETAS (ID_RECETA, CIP_PACIENTE, FECHA_PRESCRIPCION, MEDICAMENTO)
PK: ID_RECETA
FK: CIP_PACIENTE → PACIENTES.CIP

-- Integridad Referencial:
1. No se puede crear una receta con CIP_PACIENTE='9999999999' si ese CIP no existe
2. No se puede eliminar un paciente si tiene recetas asociadas (o se eliminan en cascada)
3. Si CIP_PACIENTE admite NULL, significa "receta sin paciente asignado" (raro en sanidad)

2.4. Restricciones de Integridad

El modelo relacional define varios tipos de restricciones para mantener la consistencia:

Restricción Descripción Ejemplo SQL
Integridad de Dominio Los valores de un atributo deben pertenecer a su dominio EDAD INTEGER CHECK (EDAD >= 0 AND EDAD <= 120)
Integridad de Entidad La clave primaria no puede ser NULL CIP VARCHAR(10) PRIMARY KEY
Integridad Referencial Las claves foráneas deben referenciar valores existentes FOREIGN KEY (CIP_PACIENTE) REFERENCES PACIENTES(CIP)
Restricciones Semánticas Reglas de negocio específicas CHECK (FECHA_ALTA >= FECHA_INGRESO)

📌 Dato Importante del Modelo Relacional

El modelo relacional se basa en la teoría de conjuntos y el cálculo de predicados de primer orden. Esto significa que las operaciones sobre relaciones (álgebra relacional) tienen fundamento matemático sólido, garantizando propiedades como clausura, completitud y minimalidad. Esto diferencia al modelo relacional de los modelos navegacionales anteriores.

3. Arquitectura de SGBD: Modelo ANSI/SPARC

La arquitectura de tres niveles ANSI/SPARC (American National Standards Institute / Standards Planning And Requirements Committee) fue propuesta en 1975 para estandarizar la arquitectura de los sistemas de bases de datos. Define tres niveles de abstracción que proporcionan independencia de datos.

3.1. Los Tres Niveles de Abstracción

┌─────────────────────────────────────────────────────┐ │ NIVEL EXTERNO (VISTAS) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Vista 1 │ │ Vista 2 │ │ Vista N │ │ │ │ Médicos │ │ Farmacia │ │ Analítica│ │ │ └──────────┘ └──────────┘ └──────────┘ │ └───────────────────────┬─────────────────────────────┘ │ Mapeo Externo/Conceptual ┌───────────────────────▼─────────────────────────────┐ │ NIVEL CONCEPTUAL (LÓGICO) │ │ │ │ ┌────────────────────────────────────┐ │ │ │ ESQUEMA LÓGICO GLOBAL │ │ │ │ Tablas, Relaciones, Constraints │ │ │ │ Diccionario de Datos │ │ │ └────────────────────────────────────┘ │ └───────────────────────┬─────────────────────────────┘ │ Mapeo Conceptual/Interno ┌───────────────────────▼─────────────────────────────┐ │ NIVEL INTERNO (FÍSICO) │ │ │ │ ┌────────────────────────────────────┐ │ │ │ Ficheros, Índices B-Tree │ │ │ │ Tablespaces, Segmentos, Bloques │ │ │ │ Estrategias de Almacenamiento │ │ │ └────────────────────────────────────┘ │ └───────────────────────┬─────────────────────────────┘ │ ┌───────────────────────▼─────────────────────────────┐ │ ALMACENAMIENTO FÍSICO │ │ Discos, SAN, NAS, Sistemas de Ficheros │ └─────────────────────────────────────────────────────┘

3.1.1. Nivel Externo (Vistas de Usuario)

Es el nivel más alto de abstracción. Define cómo ven los datos los diferentes grupos de usuarios. Cada vista es una "ventana" personalizada sobre la base de datos que muestra solo los datos relevantes para un usuario o aplicación específica.

Características:

  • Múltiples vistas para diferentes usuarios
  • Personalización según perfiles (médicos, enfermeros, administrativos)
  • Seguridad: oculta datos sensibles a usuarios no autorizados
  • Simplicidad: muestra solo los datos necesarios

💡 Ejemplo SAS: Vistas en Diraya

-- Vista para MÉDICOS (nivel externo)
CREATE VIEW VISTA_MEDICO_PACIENTES AS
SELECT CIP, NOMBRE, APELLIDOS, FECHA_NACIMIENTO, 
       ALERGIAS, ANTECEDENTES, TRATAMIENTO_ACTUAL
FROM PACIENTES
WHERE MEDICO_ASIGNADO = CURRENT_USER;

-- Vista para FARMACIA (nivel externo)
CREATE VIEW VISTA_FARMACIA_RECETAS AS
SELECT R.ID_RECETA, P.CIP, P.NOMBRE, R.MEDICAMENTO, 
       R.POSOLOGIA, R.FECHA_PRESCRIPCION
FROM RECETAS R
JOIN PACIENTES P ON R.CIP_PACIENTE = P.CIP
WHERE R.ESTADO = 'ACTIVA';

-- Vista para DIRECCIÓN (nivel externo - datos agregados)
CREATE VIEW VISTA_ESTADISTICAS_DIRECCION AS
SELECT CENTRO, COUNT(*) AS TOTAL_PACIENTES, 
       AVG(EDAD) AS EDAD_MEDIA, 
       COUNT(CASE WHEN CRONICO='S' THEN 1 END) AS PACIENTES_CRONICOS
FROM PACIENTES
GROUP BY CENTRO;

Ventajas:

  • El médico solo ve "sus" pacientes (seguridad)
  • Farmacia no ve datos clínicos innecesarios (privacidad)
  • Dirección ve agregaciones, no datos individuales (RGPD)
  • Si cambia la estructura de PACIENTES, las vistas pueden seguir funcionando

3.1.2. Nivel Conceptual (Esquema Lógico)

Es el nivel intermedio que describe la estructura completa de la base de datos de forma independiente de cómo se almacena físicamente. Define:

  • Todas las entidades (tablas) y sus atributos
  • Relaciones entre entidades (claves foráneas)
  • Restricciones de integridad (PK, FK, CHECK, UNIQUE)
  • Vistas, índices, triggers, procedimientos almacenados
  • Diccionario de datos (metadatos sobre la estructura)

🎯 Pregunta Recurrente en Examen

¿Dónde se encuentra la definición de un tipo de datos "integer" según el modelo ANSI/SPARC?

Respuesta correcta: En el Diccionario de Datos (nivel conceptual)

El diccionario de datos almacena metadatos: definiciones de tipos de datos, estructuras de tablas, restricciones, usuarios, privilegios, estadísticas. Es parte del nivel conceptual, NO del físico ni del externo.

Ejemplo de Diccionario de Datos en Oracle:

-- Consultar metadatos de tabla (Diccionario de Datos)
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'PACIENTES';

-- Consultar restricciones
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'PACIENTES';

Resultado:
CONSTRAINT_NAME       CONSTRAINT_TYPE  SEARCH_CONDITION
PK_PACIENTES          P (Primary Key)  -
FK_CENTRO             R (Foreign Key)  -
CHK_FECHA_NACIMIENTO  C (Check)        FECHA_NACIMIENTO < SYSDATE

3.1.3. Nivel Interno (Esquema Físico)

Es el nivel más bajo, describe cómo se almacenan físicamente los datos en los dispositivos de almacenamiento. Define:

  • Estructuras de almacenamiento: ficheros, tablespaces (Oracle), filegroups (SQL Server)
  • Organización de registros: secuencial, indexada, hash
  • Índices: B-Tree, Bitmap, Hash, Full-Text
  • Métodos de acceso: scan secuencial, acceso por índice
  • Compresión, particionado de tablas
  • Clustering, replicación física

💡 Ejemplo SAS: Nivel Físico en Oracle RAC (Diraya)

-- Creación de Tablespace (almacenamiento físico)
CREATE TABLESPACE DIRAYA_DATA
DATAFILE '/oradata/diraya/diraya_data01.dbf' SIZE 10G AUTOEXTEND ON
MAXSIZE 100G;

-- Creación de tabla en ese tablespace
CREATE TABLE PACIENTES (
    CIP VARCHAR2(10) PRIMARY KEY,
    DNI VARCHAR2(9),
    NOMBRE VARCHAR2(50),
    APELLIDOS VARCHAR2(100)
)
TABLESPACE DIRAYA_DATA
STORAGE (INITIAL 1M NEXT 1M PCTINCREASE 0);

-- Índice B-Tree sobre DNI (acceso rápido por DNI)
CREATE INDEX IDX_PACIENTES_DNI ON PACIENTES(DNI)
TABLESPACE DIRAYA_INDEX;

-- Particionado por rango (mejora rendimiento)
CREATE TABLE CITAS (
    ID_CITA NUMBER PRIMARY KEY,
    CIP_PACIENTE VARCHAR2(10),
    FECHA_CITA DATE,
    CENTRO VARCHAR2(50)
)
PARTITION BY RANGE (FECHA_CITA) (
    PARTITION CITAS_2023 VALUES LESS THAN (TO_DATE('2024-01-01','YYYY-MM-DD')),
    PARTITION CITAS_2024 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD')),
    PARTITION CITAS_2025 VALUES LESS THAN (MAXVALUE)
);

Ventajas en el SAS:

  • Los tablespaces permiten distribuir datos en diferentes discos (rendimiento)
  • Los índices aceleran consultas críticas (buscar paciente por DNI)
  • El particionado mejora el mantenimiento (purgar citas antiguas sin afectar actuales)

3.2. Independencia de Datos

La arquitectura de tres niveles proporciona dos tipos de independencia de datos, fundamentales para la evolución de los sistemas:

3.2.1. Independencia Lógica

Capacidad de modificar el esquema conceptual sin cambiar los esquemas externos (vistas) ni las aplicaciones. Por ejemplo:

  • Añadir una nueva tabla al esquema conceptual
  • Añadir un atributo a una tabla existente
  • Crear una nueva restricción de integridad

💡 Ejemplo SAS: Independencia Lógica en Diraya

Supongamos que el SAS decide añadir un nuevo atributo ALERGIAS_FARMACOLOGICAS a la tabla PACIENTES. Los médicos seguirán viendo sus vistas sin cambios:

-- Cambio en el nivel conceptual:
ALTER TABLE PACIENTES ADD (ALERGIAS_FARMACOLOGICAS VARCHAR2(500));

-- Las vistas existentes siguen funcionando sin modificación:
CREATE VIEW VISTA_MEDICO_BASICA AS
SELECT CIP, NOMBRE, APELLIDOS, FECHA_NACIMIENTO
FROM PACIENTES
WHERE MEDICO_ASIGNADO = CURRENT_USER;

-- Nueva vista para médicos que necesitan ver alergias:
CREATE VIEW VISTA_MEDICO_ALERGIAS AS
SELECT CIP, NOMBRE, APELLIDOS, ALERGIAS_FARMACOLOGICAS
FROM PACIENTES
WHERE MEDICO_ASIGNADO = CURRENT_USER;

Resultado: Las aplicaciones que usan VISTA_MEDICO_BASICA no se ven afectadas. Solo las nuevas aplicaciones usan VISTA_MEDICO_ALERGIAS.

3.2.2. Independencia Física

Capacidad de modificar el esquema interno (físico) sin cambiar el esquema conceptual ni las aplicaciones. Por ejemplo:

  • Cambiar la organización de ficheros (añadir un nuevo datafile)
  • Crear o eliminar índices para mejorar rendimiento
  • Cambiar la ubicación física de los datos (migrar a otro disco)
  • Modificar métodos de acceso (cambiar de B-Tree a Hash)

💡 Ejemplo SAS: Independencia Física en Oracle RAC

El equipo de infraestructura del SAS decide migrar el tablespace DIRAYA_DATA de discos SAS a SSD para mejorar el rendimiento:

-- 1. Crear nuevo datafile en SSD
ALTER TABLESPACE DIRAYA_DATA 
ADD DATAFILE '/ssd/diraya/diraya_data02.dbf' SIZE 20G;

-- 2. Mover datos del datafile antiguo al nuevo (online)
ALTER DATABASE DATAFILE '/oradata/diraya/diraya_data01.dbf' OFFLINE;
-- ...proceso de migración física...

-- 3. Las consultas SQL siguen funcionando igual:
SELECT * FROM PACIENTES WHERE CIP = '0001234567';
-- El optimizador usa automáticamente el nuevo almacenamiento

Resultado: Ni las aplicaciones ni los usuarios notan el cambio. Solo mejora el tiempo de respuesta de las consultas.

3.3. Arquitectura de SGBD Modernos

Los SGBD actuales implementan la arquitectura ANSI/SPARC con componentes adicionales:

┌────────────────────────────────────────────────────────┐ │ ARQUITECTURA SGBD MODERNO │ ├────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ APLICACIONES Y USUARIOS │ │ │ │ (JDBC, ODBC, OCI, ADO.NET) │ │ │ └─────────────────┬────────────────────────────┘ │ │ │ │ │ ┌─────────────────▼────────────────────────────┐ │ │ │ PROCESADOR DE CONSULTAS │ │ │ │ - Parser (análisis sintáctico) │ │ │ │ - Optimizador de consultas │ │ │ │ - Generador de código │ │ │ └─────────────────┬────────────────────────────┘ │ │ │ │ │ ┌─────────────────▼────────────────────────────┐ │ │ │ GESTOR DE TRANSACCIONES │ │ │ │ - Control de concurrencia (locks) │ │ │ │ - Gestor de recuperación (log) │ │ │ │ - Gestor de buffers (caché) │ │ │ └─────────────────┬────────────────────────────┘ │ │ │ │ │ ┌─────────────────▼────────────────────────────┐ │ │ │ GESTOR DE ALMACENAMIENTO │ │ │ │ - Gestor de ficheros │ │ │ │ - Gestor de índices │ │ │ │ - Gestor de espacios (tablespaces) │ │ │ └─────────────────┬────────────────────────────┘ │ │ │ │ │ ┌─────────────────▼────────────────────────────┐ │ │ │ SISTEMA OPERATIVO Y HARDWARE │ │ │ │ (Discos, SAN, NAS, Sistema de Ficheros) │ │ │ └──────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────┘

📌 Dato Importante para el Examen

La arquitectura ANSI/SPARC NO es solo teórica. Todos los SGBD modernos (Oracle, PostgreSQL, SQL Server) la implementan. Conocer los tres niveles y sus mapeos te permite responder preguntas sobre:

  • Dónde se define el tipo de dato "integer" → Diccionario de Datos (nivel conceptual)
  • Qué nivel ve el usuario final → Nivel externo (vistas)
  • Dónde se optimizan los índices → Nivel interno (físico)
  • Qué cambia si se añade un atributo → Nivel conceptual (no afecta al físico necesariamente)

4. Diseño de Bases de Datos: Modelo Entidad-Relación

El modelo entidad-relación (E-R) propuesto por Peter Chen en 1976 es una herramienta gráfica para diseñar bases de datos relacionales. Permite modelar el mundo real mediante entidades, atributos y relaciones, facilitando la comunicación entre analistas, diseñadores y usuarios.

4.1. Conceptos del Modelo E-R

4.1.1. Entidades

Una entidad es un objeto distinguible del mundo real sobre el que se desea almacenar información. Ejemplos en el SAS:

  • PACIENTE: Persona que recibe asistencia sanitaria
  • MÉDICO: Profesional sanitario
  • CITA: Encuentro programado entre paciente y médico
  • CENTRO_SALUD: Instalación sanitaria

Una entidad se representa gráficamente como un rectángulo con el nombre de la entidad en su interior.

4.1.2. Atributos

Los atributos son propiedades que describen una entidad. Se clasifican en:

  • Simples: No divisibles (NOMBRE, EDAD)
  • Compuestos: Divisibles en partes (DIRECCION → CALLE, NUMERO, CP, CIUDAD)
  • Monovaluados: Un solo valor (FECHA_NACIMIENTO)
  • Multivaluados: Conjunto de valores (TELEFONOS: {666111222, 955123456})
  • Derivados: Se calculan a partir de otros (EDAD se deriva de FECHA_NACIMIENTO)

Los atributos se representan como óvalos conectados a la entidad. El atributo clave (identificador único) se subraya.

4.1.3. Relaciones

Una relación es una asociación entre dos o más entidades. Se representa como un rombo conectado a las entidades relacionadas.

Cardinalidad de Relaciones:

Cardinalidad Significado Ejemplo SAS
1:1 (Uno a Uno) Una instancia de A se relaciona con una de B, y viceversa PACIENTE (1) - tiene - (1) HISTORIA_CLINICA
1:N (Uno a Muchos) Una instancia de A se relaciona con muchas de B MÉDICO (1) - atiende - (N) PACIENTES
N:M (Muchos a Muchos) Varias instancias de A se relacionan con varias de B PACIENTE (N) - asignado - (M) TRATAMIENTOS

💡 Ejemplo SAS: Modelo E-R Simplificado de Diraya

┌──────────────┐ ┌──────────────┐ │ PACIENTE │ │ MÉDICO │ ├──────────────┤ ├──────────────┤ │ CIP │◄─────────┤ ID_MEDICO │ │ DNI │ 1:N │ DNI │ │ NOMBRE │ atiende │ NOMBRE │ │ APELLIDOS │ │ ESPECIALIDAD │ │ FECHA_NAC │ │ COLEGIADO │ └──────────────┘ └──────────────┘ │ │ │ N │ N │ │ ▼ ▼ ┌──────────────────────────────────────┐ │ CITA │ ├──────────────────────────────────────┤ │ ID_CITA │ │ CIP_PACIENTE (FK) │ │ ID_MEDICO (FK) │ │ FECHA_HORA │ │ MOTIVO │ │ ESTADO (PROGRAMADA/REALIZADA) │ └──────────────────────────────────────┘ │ │ 1:N │ ▼ ┌──────────────────────────────────────┐ │ PRESCRIPCION │ ├──────────────────────────────────────┤ │ ID_PRESCRIPCION │ │ ID_CITA (FK) │ │ MEDICAMENTO │ │ POSOLOGIA │ │ DURACION │ └──────────────────────────────────────┘ Interpretación: - Un MÉDICO atiende a muchos PACIENTES (1:N) - Un PACIENTE puede tener muchas CITAS (1:N) - Un MÉDICO puede tener muchas CITAS (1:N) - CITA es una "entidad débil" que necesita PACIENTE y MÉDICO - Una CITA puede generar muchas PRESCRIPCIONES (1:N)

4.2. Transformación del Modelo E-R a Tablas Relacionales

Una vez diseñado el modelo E-R, se transforma al modelo relacional mediante reglas estándar:

4.2.1. Regla 1: Entidades → Tablas

Cada entidad se convierte en una tabla. Los atributos de la entidad se convierten en columnas. El identificador único (clave) se convierte en clave primaria.

-- Entidad PACIENTE
PACIENTE (CIP, DNI, NOMBRE, APELLIDOS, FECHA_NACIMIENTO, SEXO, DIRECCION)
PK: CIP

CREATE TABLE PACIENTES (
    CIP VARCHAR(10) PRIMARY KEY,
    DNI VARCHAR(9) UNIQUE,
    NOMBRE VARCHAR(50) NOT NULL,
    APELLIDOS VARCHAR(100) NOT NULL,
    FECHA_NACIMIENTO DATE NOT NULL,
    SEXO CHAR(1) CHECK (SEXO IN ('H','M','O')),
    DIRECCION VARCHAR(200)
);

4.2.2. Regla 2: Relaciones 1:1 → Clave Foránea

Se añade la clave primaria de una entidad como clave foránea en la otra (o viceversa). Se elige la entidad con participación total.

-- Relación 1:1: PACIENTE - HISTORIA_CLINICA
PACIENTES (CIP, DNI, NOMBRE, ...)
HISTORIAS_CLINICAS (ID_HC, CIP_PACIENTE, FECHA_APERTURA, ...)

-- CIP_PACIENTE es FK que referencia PACIENTES.CIP
-- Cada HC pertenece a un único paciente
-- Cada paciente tiene una única HC

CREATE TABLE HISTORIAS_CLINICAS (
    ID_HC INTEGER PRIMARY KEY,
    CIP_PACIENTE VARCHAR(10) UNIQUE NOT NULL,
    FECHA_APERTURA DATE,
    FOREIGN KEY (CIP_PACIENTE) REFERENCES PACIENTES(CIP)
);

4.2.3. Regla 3: Relaciones 1:N → Clave Foránea en el Lado N

Se añade la clave primaria del lado "1" como clave foránea en el lado "N".

-- Relación 1:N: MÉDICO atiende PACIENTES
MEDICOS (ID_MEDICO, DNI, NOMBRE, ESPECIALIDAD, ...)
PACIENTES (CIP, DNI, NOMBRE, ID_MEDICO_ASIGNADO, ...)

-- ID_MEDICO_ASIGNADO es FK en PACIENTES que referencia MEDICOS

CREATE TABLE MEDICOS (
    ID_MEDICO INTEGER PRIMARY KEY,
    DNI VARCHAR(9) UNIQUE,
    NOMBRE VARCHAR(100) NOT NULL,
    ESPECIALIDAD VARCHAR(50)
);

CREATE TABLE PACIENTES (
    CIP VARCHAR(10) PRIMARY KEY,
    DNI VARCHAR(9) UNIQUE,
    NOMBRE VARCHAR(50) NOT NULL,
    ID_MEDICO_ASIGNADO INTEGER,
    FOREIGN KEY (ID_MEDICO_ASIGNADO) REFERENCES MEDICOS(ID_MEDICO)
);

4.2.4. Regla 4: Relaciones N:M → Tabla Intermedia

Se crea una nueva tabla con las claves primarias de ambas entidades como claves foráneas. La clave primaria de la tabla intermedia suele ser la combinación de ambas FK.

-- Relación N:M: PACIENTES - TRATAMIENTOS
PACIENTES (CIP, DNI, NOMBRE, ...)
TRATAMIENTOS (ID_TRATAMIENTO, NOMBRE_TRATAMIENTO, DESCRIPCION, ...)

-- Tabla intermedia: PACIENTES_TRATAMIENTOS
PACIENTES_TRATAMIENTOS (CIP, ID_TRATAMIENTO, FECHA_INICIO, FECHA_FIN, DOSIS)

CREATE TABLE TRATAMIENTOS (
    ID_TRATAMIENTO INTEGER PRIMARY KEY,
    NOMBRE_TRATAMIENTO VARCHAR(100) NOT NULL,
    DESCRIPCION VARCHAR(500)
);

CREATE TABLE PACIENTES_TRATAMIENTOS (
    CIP VARCHAR(10),
    ID_TRATAMIENTO INTEGER,
    FECHA_INICIO DATE NOT NULL,
    FECHA_FIN DATE,
    DOSIS VARCHAR(100),
    PRIMARY KEY (CIP, ID_TRATAMIENTO),
    FOREIGN KEY (CIP) REFERENCES PACIENTES(CIP),
    FOREIGN KEY (ID_TRATAMIENTO) REFERENCES TRATAMIENTOS(ID_TRATAMIENTO)
);

🎯 Concepto Clave para el Examen

Las relaciones N:M SIEMPRE se resuelven con una tabla intermedia (también llamada "tabla de unión" o "tabla asociativa"). No se pueden implementar directamente con claves foráneas simples en el modelo relacional. Esta tabla intermedia puede tener atributos propios (FECHA_INICIO, DOSIS en el ejemplo anterior).

4.3. Entidades Débiles

Una entidad débil es aquella que no puede existir sin una entidad fuerte relacionada. Su clave primaria está formada por:

  • La clave primaria de la entidad fuerte (FK)
  • Un discriminador parcial (atributo propio)

💡 Ejemplo SAS: Entidad Débil - EPISODIOS_HC

-- HISTORIA_CLINICA (entidad fuerte)
HISTORIAS_CLINICAS (ID_HC, CIP_PACIENTE, FECHA_APERTURA)

-- EPISODIO_HC (entidad débil)
-- Depende de HISTORIA_CLINICA: sin HC no hay episodios
EPISODIOS_HC (ID_HC, NUMERO_EPISODIO, FECHA, DIAGNOSTICO, TRATAMIENTO)

-- La PK de EPISODIO_HC es compuesta: (ID_HC, NUMERO_EPISODIO)
-- ID_HC es FK que referencia HISTORIAS_CLINICAS
-- NUMERO_EPISODIO es el discriminador parcial (1º episodio, 2º episodio...)

CREATE TABLE EPISODIOS_HC (
    ID_HC INTEGER,
    NUMERO_EPISODIO INTEGER,
    FECHA DATE NOT NULL,
    DIAGNOSTICO VARCHAR(500),
    TRATAMIENTO VARCHAR(500),
    PRIMARY KEY (ID_HC, NUMERO_EPISODIO),
    FOREIGN KEY (ID_HC) REFERENCES HISTORIAS_CLINICAS(ID_HC)
        ON DELETE CASCADE  -- Si se elimina la HC, se eliminan sus episodios
);

Interpretación: Un episodio no tiene sentido sin su historia clínica. La numeración de episodios es relativa a cada HC (HC #1 tiene episodios 1, 2, 3... y HC #2 también tiene episodios 1, 2, 3...).

5. Normalización: Eliminación de Redundancias y Anomalías

La normalización es un proceso de diseño que organiza las tablas de una base de datos para reducir redundancias y dependencias no deseadas, evitando así anomalías de actualización, inserción y eliminación. Se basa en la teoría de dependencias funcionales.

🎯 Definición Clave para el Examen

¿Qué es la normalización en un SGBD?

Respuesta correcta: El proceso de reducir la redundancia y mejorar la estructura de las tablas mediante la aplicación de reglas (formas normales) basadas en dependencias funcionales.

La normalización NO es: optimizar consultas (eso son índices), encriptar datos (eso es seguridad), ni hacer copias de seguridad (eso es backup).

5.1. Dependencias Funcionales

Una dependencia funcional X → Y (se lee "X determina funcionalmente a Y") significa que conociendo el valor de X, podemos determinar unívocamente el valor de Y.

Ejemplo: En la tabla PACIENTES:

  • CIP → NOMBRE (conociendo el CIP, determinamos el nombre del paciente)
  • CIP → APELLIDOS, FECHA_NACIMIENTO, DIRECCION
  • DNI → NOMBRE (el DNI también determina al paciente)

Tipos de dependencias funcionales:

  • Dependencia funcional completa: Y depende de todo X, no de parte de X
  • Dependencia funcional parcial: Y depende solo de parte de X (cuando X es compuesto)
  • Dependencia funcional transitiva: X → Y y Y → Z, entonces X → Z (pero Z no depende directamente de X)

💡 Ejemplo SAS: Dependencias Funcionales en Tabla MAL DISEÑADA

-- Tabla NO normalizada: CITAS_PACIENTES
CITAS_PACIENTES (ID_CITA, CIP, NOMBRE_PACIENTE, DIRECCION_PACIENTE, 
                 FECHA_CITA, ID_MEDICO, NOMBRE_MEDICO, ESPECIALIDAD)

Dependencias funcionales identificadas:
1. ID_CITA → CIP, FECHA_CITA, ID_MEDICO  (la cita determina paciente, fecha y médico)
2. CIP → NOMBRE_PACIENTE, DIRECCION_PACIENTE  (el paciente determina su nombre y dirección)
3. ID_MEDICO → NOMBRE_MEDICO, ESPECIALIDAD  (el médico determina su nombre y especialidad)

Dependencias TRANSITIVAS problemáticas:
- ID_CITA → CIP → NOMBRE_PACIENTE  (la cita determina el nombre del paciente transitivamente)
- ID_CITA → ID_MEDICO → NOMBRE_MEDICO  (la cita determina el nombre del médico transitivamente)

Problemas (anomalías):
- REDUNDANCIA: El NOMBRE_PACIENTE se repite en todas las citas del mismo paciente
- ANOMALÍA DE ACTUALIZACIÓN: Si cambia el nombre de un paciente, hay que actualizar N filas
- ANOMALÍA DE INSERCIÓN: No puedo insertar un médico si no tiene citas asignadas
- ANOMALÍA DE ELIMINACIÓN: Si elimino la última cita de un paciente, pierdo sus datos

5.2. Formas Normales

Las formas normales son niveles progresivos de normalización. Cada forma normal cumple las restricciones de la anterior más restricciones adicionales:

Forma Normal Requisitos Qué Elimina
1FN Todos los atributos son atómicos (valores simples, no listas) Atributos multivaluados y compuestos
2FN Está en 1FN + No hay dependencias funcionales parciales Dependencias parciales de la clave
3FN Está en 2FN + No hay dependencias funcionales transitivas Dependencias transitivas entre atributos no clave
FNBC Está en 3FN + Todo determinante es clave candidata Dependencias donde el determinante no es superclave
4FN Está en FNBC + No hay dependencias multivaluadas Dependencias multivaluadas no triviales
5FN Está en 4FN + No hay dependencias de reunión Dependencias de reunión no triviales

5.2.1. Primera Forma Normal (1FN)

Definición: Una tabla está en 1FN si todos los atributos contienen valores atómicos (no hay listas, conjuntos ni atributos compuestos).

💡 Ejemplo SAS: Violación de 1FN

-- Tabla NO en 1FN (violación: atributo multivaluado TELEFONOS)
PACIENTES_MAL
CIP         NOMBRE        TELEFONOS                    ALERGIAS
----------  ------------  ---------------------------  --------------------------
0001234567  Juan García   666111222, 955123456         Penicilina, Ibuprofeno
0001234568  María Pérez   677333444                    Ninguna

Problema: TELEFONOS es un atributo multivaluado (lista de teléfonos)
Problema: ALERGIAS es un atributo multivaluado (lista de alergias)

-- Solución: Convertir a 1FN (atributos atómicos)
PACIENTES
CIP         NOMBRE        
----------  ------------
0001234567  Juan García   
0001234568  María Pérez   

TELEFONOS_PACIENTE
CIP         TELEFONO
----------  -----------
0001234567  666111222
0001234567  955123456
0001234568  677333444

ALERGIAS_PACIENTE
CIP         ALERGIA
----------  -----------
0001234567  Penicilina
0001234567  Ibuprofeno

5.2.2. Segunda Forma Normal (2FN)

Definición: Una tabla está en 2FN si está en 1FN y no tiene dependencias funcionales parciales (todos los atributos no clave dependen de la clave primaria completa, no de parte de ella).

🎯 Importante

La 2FN solo aplica a tablas con clave primaria compuesta. Si la PK es simple (un solo atributo), la tabla ya está automáticamente en 2FN si cumple 1FN.

💡 Ejemplo SAS: Violación de 2FN

-- Tabla NO en 2FN (clave compuesta: CIP, ID_CITA)
CITAS_DETALLES (CIP, ID_CITA, FECHA_CITA, NOMBRE_PACIENTE, DIRECCION_PACIENTE)

Dependencias funcionales:
- (CIP, ID_CITA) → FECHA_CITA  (OK: dependencia completa)
- CIP → NOMBRE_PACIENTE        (MAL: dependencia parcial)
- CIP → DIRECCION_PACIENTE     (MAL: dependencia parcial)

Problema: NOMBRE_PACIENTE y DIRECCION_PACIENTE dependen solo de CIP (parte de la PK)
Consecuencia: Redundancia (el nombre se repite en todas las citas del paciente)

-- Solución: Descomponer en dos tablas
CITAS (CIP, ID_CITA, FECHA_CITA)
PACIENTES (CIP, NOMBRE_PACIENTE, DIRECCION_PACIENTE)

Ahora está en 2FN:
- En CITAS: FECHA_CITA depende de la clave completa (CIP, ID_CITA)
- En PACIENTES: NOMBRE y DIRECCION dependen de la clave completa (CIP)

5.2.3. Tercera Forma Normal (3FN)

Definición: Una tabla está en 3FN si está en 2FN y no hay dependencias funcionales transitivas entre atributos no clave.

🎯 Pregunta Recurrente en Examen

En el proceso de normalización, una tabla está en tercera forma normal (3FN) si cumple que:

Respuesta correcta: No existe ninguna dependencia funcional transitiva entre atributos no clave.

Explicación: La 3FN elimina dependencias transitivas. Por ejemplo, si X → Y y Y → Z (siendo Y y Z no clave), entonces X → Z transitivamente. La solución es crear una tabla separada para Y y Z.

💡 Ejemplo SAS: Violación de 3FN

-- Tabla NO en 3FN (tiene dependencia transitiva)
PACIENTES (CIP, NOMBRE, DIRECCION, CODIGO_POSTAL, CIUDAD, PROVINCIA)

Dependencias funcionales:
- CIP → NOMBRE, DIRECCION, CODIGO_POSTAL  (OK: dependen de la clave)
- CODIGO_POSTAL → CIUDAD, PROVINCIA       (PROBLEMA: dependencia transitiva)

Dependencia transitiva:
CIP → CODIGO_POSTAL → CIUDAD
CIP → CODIGO_POSTAL → PROVINCIA

Problema: CIUDAD y PROVINCIA dependen transitivamente de CIP a través de CODIGO_POSTAL
Consecuencia: Si hay 1000 pacientes en Sevilla 41001, "Sevilla" se repite 1000 veces

-- Solución: Descomponer eliminando la dependencia transitiva
PACIENTES (CIP, NOMBRE, DIRECCION, CODIGO_POSTAL)
FOREIGN KEY (CODIGO_POSTAL) REFERENCES CODIGOS_POSTALES(CODIGO_POSTAL)

CODIGOS_POSTALES (CODIGO_POSTAL, CIUDAD, PROVINCIA)

Ahora está en 3FN:
- PACIENTES: Todos los atributos dependen directamente de CIP
- CODIGOS_POSTALES: CIUDAD y PROVINCIA dependen directamente de CODIGO_POSTAL

5.3. Ventajas y Desventajas de la Normalización

Ventajas Desventajas
Elimina redundancia: Los datos no se repiten innecesariamente Más tablas: El esquema se vuelve más complejo
Evita anomalías: No hay problemas de actualización, inserción o eliminación Más JOINs: Las consultas necesitan unir más tablas (puede afectar rendimiento)
Integridad de datos: Los datos son más consistentes Complejidad: Diseño y mantenimiento más difíciles
Espacio en disco: Menor espacio de almacenamiento Rendimiento: En sistemas OLAP puede ser mejor desnormalizar

📌 Dato Importante: ¿Hasta qué forma normal normalizar?

En la práctica, la mayoría de bases de datos OLTP (transaccionales) se diseñan en 3FN o FNBC. Las formas normales superiores (4FN, 5FN) son menos comunes y solo necesarias en casos específicos.

En sistemas OLAP (análisis/reporting), a menudo se desnormaliza intencionadamente (modelo estrella, copo de nieve) para mejorar el rendimiento de consultas complejas. Es el caso del BI Corporativo del SAS.

6. Manipulación de Datos: Álgebra y Cálculo Relacional

El modelo relacional proporciona dos lenguajes formales para manipular datos:

  • Álgebra Relacional: Lenguaje procedimental (especifica CÓMO obtener el resultado)
  • Cálculo Relacional: Lenguaje declarativo (especifica QUÉ resultado obtener)

Ambos lenguajes son equivalentes en potencia expresiva (teorema de Codd). SQL se basa principalmente en el cálculo relacional, pero incluye elementos del álgebra.

6.1. Álgebra Relacional

El álgebra relacional consta de un conjunto de operadores que toman una o dos relaciones como entrada y producen una nueva relación como salida.

6.1.1. Operadores Unarios (sobre una sola relación)

Operador Símbolo Descripción Equivalente SQL
Selección σ (sigma) Selecciona filas que cumplen una condición WHERE
Proyección π (pi) Selecciona columnas específicas SELECT columna1, columna2
Renombrado ρ (rho) Renombra relación o atributos AS

💡 Ejemplo SAS: Operadores Unarios

PACIENTES (CIP, NOMBRE, APELLIDOS, EDAD, CIUDAD)

-- Selección: Pacientes mayores de 65 años
σ_EDAD>65 (PACIENTES)

Equivalente SQL:
SELECT * FROM PACIENTES WHERE EDAD > 65;

-- Proyección: Solo CIP y NOMBRE
π_CIP,NOMBRE (PACIENTES)

Equivalente SQL:
SELECT CIP, NOMBRE FROM PACIENTES;

-- Combinación de operadores: Nombre de pacientes mayores de 65
π_NOMBRE (σ_EDAD>65 (PACIENTES))

Equivalente SQL:
SELECT NOMBRE FROM PACIENTES WHERE EDAD > 65;

6.1.2. Operadores Binarios (sobre dos relaciones)

Operador Símbolo Descripción Equivalente SQL
Unión Tuplas que están en A o en B UNION
Intersección Tuplas que están en A y en B INTERSECT
Diferencia - Tuplas que están en A pero no en B EXCEPT / MINUS
Producto Cartesiano × Todas las combinaciones de tuplas de A y B CROSS JOIN
Join (Natural) Combina tuplas de A y B con atributos comunes iguales NATURAL JOIN

💡 Ejemplo SAS: Join en Álgebra Relacional

PACIENTES (CIP, NOMBRE, APELLIDOS)
CITAS (ID_CITA, CIP, FECHA, ID_MEDICO)

-- Join Natural: Pacientes con sus citas
PACIENTES ⋈ CITAS

Equivalente SQL:
SELECT P.CIP, P.NOMBRE, P.APELLIDOS, C.ID_CITA, C.FECHA, C.ID_MEDICO
FROM PACIENTES P
NATURAL JOIN CITAS C;

-- O explícitamente:
SELECT P.CIP, P.NOMBRE, P.APELLIDOS, C.ID_CITA, C.FECHA, C.ID_MEDICO
FROM PACIENTES P
INNER JOIN CITAS C ON P.CIP = C.CIP;

-- Join con condición: Pacientes con citas en 2025
σ_FECHA>='2025-01-01' (PACIENTES ⋈ CITAS)

Equivalente SQL:
SELECT P.CIP, P.NOMBRE, C.FECHA
FROM PACIENTES P
INNER JOIN CITAS C ON P.CIP = C.CIP
WHERE C.FECHA >= '2025-01-01';

6.2. Cálculo Relacional

El cálculo relacional es un lenguaje declarativo basado en la lógica de predicados. Existen dos variantes:

  • Cálculo Relacional de Tuplas: Variables son tuplas completas
  • Cálculo Relacional de Dominios: Variables son valores de atributos

SQL está basado en el cálculo relacional de tuplas. La sintaxis general es:

{ t | P(t) }

Donde:
- t es una variable de tupla
- P(t) es un predicado (condición lógica) sobre t
- El resultado son todas las tuplas t que satisfacen P(t)

💡 Ejemplo SAS: Cálculo Relacional vs SQL

-- Cálculo Relacional de Tuplas:
-- Pacientes mayores de 65 años
{ t | t ∈ PACIENTES ∧ t.EDAD > 65 }

Equivalente SQL:
SELECT * FROM PACIENTES WHERE EDAD > 65;

-- Cálculo Relacional: Nombres de pacientes con citas en 2025
{ t.NOMBRE | t ∈ PACIENTES ∧ ∃c (c ∈ CITAS ∧ c.CIP = t.CIP ∧ c.FECHA >= '2025-01-01') }

Explicación:
- t es una tupla de PACIENTES
- ∃c significa "existe una tupla c"
- c es una tupla de CITAS
- El predicado establece que c.CIP = t.CIP (join) y la fecha es 2025

Equivalente SQL:
SELECT DISTINCT P.NOMBRE
FROM PACIENTES P
WHERE EXISTS (
    SELECT 1 FROM CITAS C
    WHERE C.CIP = P.CIP AND C.FECHA >= '2025-01-01'
);

-- O con JOIN:
SELECT DISTINCT P.NOMBRE
FROM PACIENTES P
INNER JOIN CITAS C ON P.CIP = C.CIP
WHERE C.FECHA >= '2025-01-01';

📌 Diferencia Clave: Álgebra vs Cálculo

  • Álgebra Relacional: Procedimental. Especificas los pasos: selecciona, proyecta, une. Es como dar instrucciones paso a paso.
  • Cálculo Relacional: Declarativo. Especificas el resultado deseado mediante predicados lógicos. Es como describir el resultado que quieres.
  • SQL: Principalmente declarativo (basado en cálculo), pero incluye elementos procedimentales (orden de ejecución optimizado por el motor).

7. El Lenguaje SQL: Standard Query Language

SQL (Structured Query Language) es el lenguaje estándar para gestionar bases de datos relacionales. Fue desarrollado por IBM en los años 70 (proyecto System R) y estandarizado por ANSI/ISO desde 1986. La versión actual es SQL:2016, aunque la mayoría de SGBD implementan SQL:2011 con extensiones propias.

7.1. Características de SQL

  • Declarativo: Describes QUÉ resultado quieres, no CÓMO obtenerlo
  • Basado en conjuntos: Opera sobre conjuntos de tuplas, no tuplas individuales
  • No sensible a mayúsculas: SELECT = select = SeLeCt (por convención, palabras clave en mayúsculas)
  • Estandarizado: SQL ANSI/ISO, pero cada SGBD tiene dialectos propios
  • Multiparadigma: Incluye DDL, DML, DCL, TCL

7.2. Categorías de Sentencias SQL

🎯 Pregunta Recurrente en Examen

Señale cuál de las siguientes sentencias se cataloga dentro del lenguaje SQL como sentencia de DDL:

A) SELECT    B) REVOKE    C) CREATE    D) INSERT

Respuesta correcta: C) CREATE

Explicación:

  • DDL (Data Definition Language): CREATE, ALTER, DROP, TRUNCATE
  • DML (Data Manipulation Language): SELECT, INSERT, UPDATE, DELETE
  • DCL (Data Control Language): GRANT, REVOKE
  • TCL (Transaction Control Language): COMMIT, ROLLBACK, SAVEPOINT
Categoría Sentencias Función Ejemplo SAS
DDL
(Data Definition Language)
CREATE
ALTER
DROP
TRUNCATE
Definir estructura de BD (tablas, índices, vistas) CREATE TABLE PACIENTES (...)
DML
(Data Manipulation Language)
SELECT
INSERT
UPDATE
DELETE
Consultar y modificar datos SELECT * FROM PACIENTES WHERE EDAD > 65
DCL
(Data Control Language)
GRANT
REVOKE
Gestionar permisos de usuarios GRANT SELECT ON PACIENTES TO USUARIO_MEDICO
TCL
(Transaction Control Language)
COMMIT
ROLLBACK
SAVEPOINT
Gestionar transacciones BEGIN; UPDATE ...; COMMIT;

7.3. DDL: Data Definition Language

7.3.1. CREATE TABLE

-- Crear tabla PACIENTES en Diraya
CREATE TABLE PACIENTES (
    CIP VARCHAR(10) PRIMARY KEY,
    DNI VARCHAR(9) UNIQUE NOT NULL,
    NOMBRE VARCHAR(50) NOT NULL,
    APELLIDOS VARCHAR(100) NOT NULL,
    FECHA_NACIMIENTO DATE NOT NULL,
    SEXO CHAR(1) CHECK (SEXO IN ('H', 'M', 'O')),
    DIRECCION VARCHAR(200),
    CODIGO_POSTAL VARCHAR(5),
    TELEFONO VARCHAR(15),
    EMAIL VARCHAR(100),
    FECHA_ALTA DATE DEFAULT CURRENT_DATE,
    MEDICO_ASIGNADO INTEGER,
    CONSTRAINT FK_MEDICO FOREIGN KEY (MEDICO_ASIGNADO) 
        REFERENCES MEDICOS(ID_MEDICO) ON DELETE SET NULL,
    CONSTRAINT CHK_FECHA_NACIMIENTO CHECK (FECHA_NACIMIENTO < CURRENT_DATE),
    CONSTRAINT CHK_EMAIL CHECK (EMAIL LIKE '%@%.%')
);

-- Crear índice para acelerar búsquedas por DNI
CREATE INDEX IDX_PACIENTES_DNI ON PACIENTES(DNI);

-- Crear índice compuesto para búsquedas por apellidos y nombre
CREATE INDEX IDX_PACIENTES_NOMBRE ON PACIENTES(APELLIDOS, NOMBRE);

7.3.2. ALTER TABLE

-- Añadir columna
ALTER TABLE PACIENTES ADD COLUMN ALERGIAS VARCHAR(500);

-- Modificar tipo de datos
ALTER TABLE PACIENTES ALTER COLUMN TELEFONO TYPE VARCHAR(20);

-- Añadir restricción
ALTER TABLE PACIENTES ADD CONSTRAINT UQ_EMAIL UNIQUE (EMAIL);

-- Eliminar columna
ALTER TABLE PACIENTES DROP COLUMN DIRECCION;

7.3.3. DROP y TRUNCATE

-- Eliminar tabla (estructura y datos)
DROP TABLE PACIENTES_TEMPORAL;

-- Eliminar tabla si existe (evita error)
DROP TABLE IF EXISTS PACIENTES_TEMPORAL;

-- Vaciar tabla (elimina datos, conserva estructura)
TRUNCATE TABLE LOG_ACCESOS;
-- TRUNCATE es más rápido que DELETE FROM porque no registra cada fila eliminada

7.4. DML: Data Manipulation Language

7.4.1. SELECT (Consultas)

-- Consulta básica
SELECT CIP, NOMBRE, APELLIDOS FROM PACIENTES;

-- Consulta con filtro
SELECT * FROM PACIENTES WHERE EDAD > 65;

-- Consulta con múltiples condiciones
SELECT * FROM PACIENTES 
WHERE EDAD > 65 AND CIUDAD = 'Sevilla';

-- Consulta con operadores lógicos y LIKE
SELECT * FROM PACIENTES 
WHERE (EDAD > 65 OR CRONICO = 'S') 
AND APELLIDOS LIKE 'García%';

-- Consulta con ORDER BY
SELECT * FROM PACIENTES 
ORDER BY APELLIDOS, NOMBRE;

-- Consulta con LIMIT (PostgreSQL) o TOP (SQL Server)
SELECT * FROM PACIENTES 
ORDER BY FECHA_NACIMIENTO DESC 
LIMIT 10;  -- Los 10 pacientes más jóvenes

-- Consulta con funciones agregadas
SELECT COUNT(*) AS TOTAL_PACIENTES FROM PACIENTES;
SELECT AVG(EDAD) AS EDAD_MEDIA FROM PACIENTES;
SELECT MAX(FECHA_NACIMIENTO) AS PACIENTE_MAS_JOVEN FROM PACIENTES;

-- Consulta con GROUP BY
SELECT CIUDAD, COUNT(*) AS TOTAL_PACIENTES
FROM PACIENTES
GROUP BY CIUDAD
ORDER BY TOTAL_PACIENTES DESC;

🎯 Pregunta Recurrente en Examen

Para realizar consultas sobre la Base de Datos se utiliza SQL. ¿Qué cláusula utilizaría en una transacción SQL para especificar una condición de búsqueda para un grupo o agregado?

A) GROUP BY    B) HAVING    C) WHERE    D) ORDER BY

Respuesta correcta: B) HAVING

Explicación:

  • WHERE: Filtra filas ANTES de agrupar
  • GROUP BY: Agrupa filas, no filtra grupos
  • HAVING: Filtra grupos DESPUÉS de agrupar (aplica sobre agregados)
  • ORDER BY: Ordena resultados, no filtra

💡 Ejemplo SAS: Diferencia entre WHERE y HAVING

-- WHERE: Filtra pacientes individuales antes de agrupar
SELECT CIUDAD, COUNT(*) AS TOTAL_PACIENTES
FROM PACIENTES
WHERE EDAD > 65  -- Filtra FILAS (pacientes mayores de 65)
GROUP BY CIUDAD;

-- HAVING: Filtra grupos de pacientes después de agrupar
SELECT CIUDAD, COUNT(*) AS TOTAL_PACIENTES
FROM PACIENTES
GROUP BY CIUDAD
HAVING COUNT(*) > 1000;  -- Filtra GRUPOS (ciudades con >1000 pacientes)

-- Combinación de WHERE y HAVING
SELECT CIUDAD, AVG(EDAD) AS EDAD_MEDIA
FROM PACIENTES
WHERE FECHA_ALTA >= '2023-01-01'  -- Solo pacientes dados de alta desde 2023
GROUP BY CIUDAD
HAVING AVG(EDAD) > 50;  -- Solo ciudades con edad media >50

Orden de ejecución SQL:
1. FROM (tablas)
2. WHERE (filtrar filas)
3. GROUP BY (agrupar)
4. HAVING (filtrar grupos)
5. SELECT (proyección)
6. ORDER BY (ordenar)
7. LIMIT/TOP (limitar resultados)

7.4.2. Joins (Consultas Multi-Tabla)

-- INNER JOIN: Solo pacientes con citas
SELECT P.CIP, P.NOMBRE, P.APELLIDOS, C.FECHA_CITA
FROM PACIENTES P
INNER JOIN CITAS C ON P.CIP = C.CIP_PACIENTE;

-- LEFT JOIN: Todos los pacientes, con o sin citas
SELECT P.CIP, P.NOMBRE, C.FECHA_CITA
FROM PACIENTES P
LEFT JOIN CITAS C ON P.CIP = C.CIP_PACIENTE;

-- RIGHT JOIN: Todas las citas (incluso si el paciente no existe - raro)
SELECT P.NOMBRE, C.FECHA_CITA
FROM PACIENTES P
RIGHT JOIN CITAS C ON P.CIP = C.CIP_PACIENTE;

-- FULL OUTER JOIN: Todos los pacientes y todas las citas
SELECT P.NOMBRE, C.FECHA_CITA
FROM PACIENTES P
FULL OUTER JOIN CITAS C ON P.CIP = C.CIP_PACIENTE;

-- Join de 3 tablas: Pacientes, Citas, Médicos
SELECT P.NOMBRE AS PACIENTE, M.NOMBRE AS MEDICO, C.FECHA_CITA
FROM PACIENTES P
INNER JOIN CITAS C ON P.CIP = C.CIP_PACIENTE
INNER JOIN MEDICOS M ON C.ID_MEDICO = M.ID_MEDICO
WHERE C.FECHA_CITA >= CURRENT_DATE
ORDER BY C.FECHA_CITA;

-- Self-Join: Pacientes que comparten médico
SELECT P1.NOMBRE AS PACIENTE1, P2.NOMBRE AS PACIENTE2, P1.MEDICO_ASIGNADO
FROM PACIENTES P1
INNER JOIN PACIENTES P2 ON P1.MEDICO_ASIGNADO = P2.MEDICO_ASIGNADO
WHERE P1.CIP < P2.CIP;  -- Evita duplicados (A-B y B-A)

7.4.3. INSERT, UPDATE, DELETE

-- INSERT: Insertar nuevo paciente
INSERT INTO PACIENTES (CIP, DNI, NOMBRE, APELLIDOS, FECHA_NACIMIENTO, SEXO)
VALUES ('0001234567', '12345678A', 'Juan', 'García López', '1985-03-15', 'H');

-- INSERT múltiple
INSERT INTO PACIENTES (CIP, DNI, NOMBRE, APELLIDOS, FECHA_NACIMIENTO, SEXO)
VALUES 
    ('0001234568', '87654321B', 'María', 'Pérez Ruiz', '1992-07-22', 'M'),
    ('0001234569', '11223344C', 'Antonio', 'Martín Sánchez', '1978-11-30', 'H');

-- INSERT desde consulta
INSERT INTO PACIENTES_CRONICOS (CIP, NOMBRE, PATOLOGIA)
SELECT CIP, NOMBRE, 'Diabetes'
FROM PACIENTES
WHERE DIAGNOSTICO_PRINCIPAL = 'E11';

-- UPDATE: Actualizar datos
UPDATE PACIENTES
SET TELEFONO = '955123456', EMAIL = 'juan.garcia@email.com'
WHERE CIP = '0001234567';

-- UPDATE con subconsulta
UPDATE PACIENTES
SET MEDICO_ASIGNADO = (SELECT ID_MEDICO FROM MEDICOS WHERE ESPECIALIDAD = 'Medicina Familiar' LIMIT 1)
WHERE MEDICO_ASIGNADO IS NULL;

-- DELETE: Eliminar registros
DELETE FROM CITAS
WHERE FECHA_CITA < '2023-01-01' AND ESTADO = 'CANCELADA';

-- DELETE con subconsulta
DELETE FROM PACIENTES
WHERE CIP IN (SELECT CIP FROM PACIENTES_BAJA WHERE FECHA_BAJA < '2020-01-01');

7.5. Transacciones y Propiedades ACID

Una transacción es un conjunto de operaciones SQL que se ejecutan como una unidad atómica. O se completan todas con éxito (COMMIT) o se deshacen todas (ROLLBACK).

🎯 Pregunta Recurrente en Examen

Las propiedades que definen las transacciones de las bases de datos relacionales son:

A) Atomicidad, Consistencia, Aislamiento, Durabilidad (ACID)
B) Concurrencia, Rendimiento, Fiabilidad
C) Abstracción, Autonomía, Escalabilidad
D) Atomicidad, Rendimiento, Escalabilidad, Durabilidad

Respuesta correcta: A) ACID

Propiedad ACID Descripción Ejemplo SAS
Atomicity
(Atomicidad)
Todo o nada. Una transacción se completa totalmente o no se completa Transferencia de paciente entre centros: se actualiza PACIENTES y se inserta en HISTORIAL_TRASLADOS. Si falla una operación, se deshacen ambas.
Consistency
(Consistencia)
La BD pasa de un estado válido a otro estado válido. Se respetan todas las restricciones de integridad No se puede crear una CITA con un CIP_PACIENTE que no existe (integridad referencial)
Isolation
(Aislamiento)
Las transacciones concurrentes no interfieren entre sí. Cada transacción ve una vista consistente de los datos Dos médicos consultan simultáneamente la HC de un paciente: cada uno ve una vista consistente sin interferencias
Durability
(Durabilidad)
Una vez confirmada (COMMIT), los cambios son permanentes incluso ante fallos del sistema Después de hacer COMMIT de una receta electrónica, aunque se caiga el servidor, la receta está grabada definitivamente

💡 Ejemplo SAS: Transacción en Diraya (Registro de Consulta Médica)

-- Inicio de transacción
BEGIN TRANSACTION;

-- 1. Registrar la consulta
INSERT INTO CONSULTAS (ID_CONSULTA, CIP_PACIENTE, ID_MEDICO, FECHA, MOTIVO)
VALUES (NEXTVAL('seq_consultas'), '0001234567', 12345, CURRENT_DATE, 'Revisión anual');

-- 2. Actualizar historia clínica
UPDATE HISTORIAS_CLINICAS
SET ULTIMA_CONSULTA = CURRENT_DATE, 
    NUMERO_CONSULTAS = NUMERO_CONSULTAS + 1
WHERE CIP_PACIENTE = '0001234567';

-- 3. Generar prescripciones si hay tratamiento
INSERT INTO PRESCRIPCIONES (ID_PRESCRIPCION, ID_CONSULTA, MEDICAMENTO, POSOLOGIA)
VALUES (NEXTVAL('seq_prescripciones'), CURRVAL('seq_consultas'), 'Ibuprofeno 600mg', '1 cada 8h');

-- 4. Registrar en log de auditoría (ENS)
INSERT INTO LOG_AUDITORIA (USUARIO, ACCION, TABLA, REGISTRO_AFECTADO, FECHA)
VALUES (CURRENT_USER, 'INSERT', 'CONSULTAS', CURRVAL('seq_consultas'), CURRENT_TIMESTAMP);

-- Si todo va bien: confirmar
COMMIT;

-- Si hay algún error: deshacer todo
-- ROLLBACK;

Propiedades ACID en este ejemplo:
- ATOMICITY: Las 4 operaciones se ejecutan completamente o no se ejecuta ninguna
- CONSISTENCY: Se respetan todas las FK (CIP_PACIENTE debe existir, ID_MEDICO debe existir)
- ISOLATION: Otro médico no ve la consulta hasta que se hace COMMIT
- DURABILITY: Después del COMMIT, aunque se caiga el servidor, la consulta está registrada

7.6. Niveles de Aislamiento

El estándar SQL define cuatro niveles de aislamiento que equilibran consistencia y concurrencia:

Nivel Dirty Read Non-Repeatable Read Phantom Read Uso SAS
READ UNCOMMITTED Reportes no críticos, estadísticas aproximadas
READ COMMITTED No Nivel por defecto en PostgreSQL, consultas generales
REPEATABLE READ No No Nivel por defecto en MySQL, transacciones financieras
SERIALIZABLE No No No Máxima consistencia, receta electrónica, registros médicos críticos

📌 Dato Importante: Control de Concurrencia en el SAS

En sistemas críticos como Diraya o Receta XXI, se utiliza SERIALIZABLE o REPEATABLE READ para garantizar la consistencia de datos sanitarios. Esto es especialmente importante en:

  • Dispensación de medicamentos (evitar doble dispensación)
  • Actualización de historia clínica por múltiples profesionales
  • Gestión de citas (evitar doble reserva de hueco)

En sistemas de reporting (BI Corporativo), se puede usar READ UNCOMMITTED para mejorar el rendimiento, ya que no se requiere consistencia absoluta en datos analíticos agregados.

8. Interoperabilidad y Estándares de Conexión

La interoperabilidad entre diferentes SGBD es crucial en entornos heterogéneos como el SAS, donde coexisten Oracle (Diraya), PostgreSQL (BPS), MySQL (aplicaciones departamentales) y SQL Server (algunas aplicaciones legacy).

8.1. Estándares de Conectividad

8.1.1. ODBC (Open Database Connectivity)

ODBC es un estándar definido por Microsoft para acceso a bases de datos. Proporciona una API común que permite a las aplicaciones conectarse a diferentes SGBD usando un driver específico.

Arquitectura ODBC:

┌───────────────────────────────────┐ │ APLICACIÓN │ │ (Python, C#, Java, etc.) │ └─────────────┬─────────────────────┘ │ API ODBC ┌─────────────▼─────────────────────┐ │ GESTOR DE DRIVERS ODBC │ │ (Driver Manager) │ └─────────────┬─────────────────────┘ │ ┌─────────┴─────────┬───────────────┬────────────┐ │ │ │ │ ┌───▼────┐ ┌───────▼────┐ ┌──────▼─────┐ ┌──▼─────┐ │ Driver │ │ Driver │ │ Driver │ │Driver │ │ Oracle │ │PostgreSQL │ │ MySQL │ │SQL Srv │ └───┬────┘ └───────┬────┘ └──────┬─────┘ └──┬─────┘ │ │ │ │ ┌───▼─────────┐ ┌──────▼──────┐ ┌─────▼──────┐ ┌─▼───────┐ │ Oracle │ │ PostgreSQL │ │ MySQL │ │SQL Server│ │ Database │ │ Database │ │ Database │ │ Database │ └─────────────┘ └─────────────┘ └────────────┘ └──────────┘

💡 Ejemplo SAS: Conexión ODBC desde Python a Diraya (Oracle)

import pyodbc

# Configurar DSN (Data Source Name) en odbc.ini
# [DIRAYA_PROD]
# Driver = /usr/lib/oracle/21/client64/lib/libsqora.so
# Server = diraya-db.sspa.juntadeandalucia.es
# Port = 1521
# Database = DIRAYA

# Conectar a Diraya usando ODBC
conexion = pyodbc.connect(
    'DSN=DIRAYA_PROD;'
    'UID=usuario_consultas;'
    'PWD=contraseña_segura'
)

cursor = conexion.cursor()

# Consultar pacientes del centro
cursor.execute("""
    SELECT CIP, NOMBRE, APELLIDOS, EDAD
    FROM PACIENTES
    WHERE CENTRO_SALUD = 'CS001' AND EDAD > 65
""")

# Procesar resultados
for row in cursor.fetchall():
    print(f"CIP: {row.CIP}, Paciente: {row.NOMBRE} {row.APELLIDOS}, Edad: {row.EDAD}")

cursor.close()
conexion.close()

8.1.2. JDBC (Java Database Connectivity)

JDBC es el estándar de Java para acceso a bases de datos. Es similar a ODBC pero está diseñado específicamente para Java y es multiplataforma.

💡 Ejemplo SAS: Conexión JDBC a PostgreSQL (BPS)

import java.sql.*;

public class ConsultaBPS {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://bps-db.sspa.juntadeandalucia.es:5432/bps_prod";
        String usuario = "usuario_consultas";
        String password = "contraseña_segura";
        
        try {
            // Cargar driver JDBC de PostgreSQL
            Class.forName("org.postgresql.Driver");
            
            // Conectar a BPS
            Connection conexion = DriverManager.getConnection(url, usuario, password);
            
            // Preparar consulta
            String sql = "SELECT cip, dni, nombre, apellidos FROM pacientes WHERE provincia = ?";
            PreparedStatement stmt = conexion.prepareStatement(sql);
            stmt.setString(1, "Sevilla");
            
            // Ejecutar consulta
            ResultSet rs = stmt.executeQuery();
            
            // Procesar resultados
            while (rs.next()) {
                System.out.println("CIP: " + rs.getString("cip") + 
                                 ", Paciente: " + rs.getString("nombre") + " " + rs.getString("apellidos"));
            }
            
            // Cerrar recursos
            rs.close();
            stmt.close();
            conexion.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

8.1.3. ADO.NET (Microsoft)

ADO.NET es la tecnología de Microsoft para acceso a datos desde aplicaciones .NET (C#, VB.NET). Proporciona proveedores específicos para SQL Server, Oracle, PostgreSQL, etc.

8.1.4. OCI (Oracle Call Interface)

OCI es la API nativa de Oracle para acceso a bases de datos Oracle desde C/C++. Es más eficiente que ODBC para aplicaciones que solo trabajan con Oracle.

8.2. Estándares SQL

El estándar SQL ha evolucionado desde 1986:

  • SQL-86/SQL-87: Primera estandarización (ANSI/ISO)
  • SQL-89: Integridad referencial
  • SQL-92 (SQL2): Mayor madurez, ampliamente implementado
  • SQL:1999 (SQL3): Triggers, procedimientos almacenados, recursividad
  • SQL:2003: XML, ventanas (window functions), secuencias
  • SQL:2008: Mejoras en window functions, TRUNCATE
  • SQL:2011: Datos temporales, mejoras en window functions
  • SQL:2016: JSON, pattern matching, polimorfismo

📌 Problema de la Estandarización

Aunque existe un estándar SQL, ningún SGBD lo implementa completamente y todos tienen extensiones propias:

  • Oracle: PL/SQL, ROWNUM, CONNECT BY (jerarquías)
  • PostgreSQL: PL/pgSQL, tipos de datos avanzados (JSON, XML, arrays), extensiones (PostGIS)
  • MySQL/MariaDB: Sintaxis simplificada, LIMIT (no estándar), funciones propias
  • SQL Server: T-SQL, TOP, OUTPUT, funciones ventana extendidas

Esto dificulta la portabilidad de código SQL entre SGBD. Las aplicaciones del SAS que usan múltiples SGBD deben lidiar con estas diferencias.

8.3. Database Links y Bases de Datos Federadas

🎯 Pregunta Recurrente en Examen

Se decide utilizar como Sistema de Gestión de Base de Datos, Oracle. Se deberá utilizar la funcionalidad de Database Link para:

A) Integrar enlaces web en los campos de la base de datos
B) Acceder a datos de otra base de datos Oracle remota
C) Crear vínculos entre tablas de la misma base de datos
D) Establecer conexiones con bases de datos no relacionales

Respuesta correcta: B) Acceder a datos de otra base de datos Oracle remota

💡 Ejemplo SAS: Database Link entre Diraya Central y Diraya Hospital

-- En servidor central de Diraya, crear database link a BD de hospital
CREATE DATABASE LINK DIRAYA_HOSPITAL_SEVILLA
CONNECT TO usuario_replicacion IDENTIFIED BY password_seguro
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=diraya-hosp-sev.sspa.local)(PORT=1521))
       (CONNECT_DATA=(SERVICE_NAME=DIRAYA_HOSP)))';

-- Consultar datos del hospital remoto desde central
SELECT CIP, NOMBRE, APELLIDOS, ULTIMA_CONSULTA
FROM PACIENTES@DIRAYA_HOSPITAL_SEVILLA
WHERE CENTRO = 'HOSPITAL_VIRGEN_DEL_ROCIO';

-- Join entre tabla local y tabla remota
SELECT L.CIP, L.NOMBRE, R.DIAGNOSTICO, R.FECHA
FROM PACIENTES L
INNER JOIN EPISODIOS@DIRAYA_HOSPITAL_SEVILLA R ON L.CIP = R.CIP
WHERE R.FECHA >= SYSDATE - 30;

Ventajas del Database Link:
- Acceso transparente a datos remotos (como si fueran locales)
- Soporta transacciones distribuidas (two-phase commit)
- Útil para consolidación de datos de múltiples centros
- Permite ETL distribuido (extraer datos de hospitales a BI Central)

8.3.1. Bases de Datos Federadas

Una base de datos federada permite consultar datos de múltiples SGBD heterogéneos como si fueran una sola base de datos. Se distinguen dos tipos:

🎯 Pregunta Recurrente en Examen

Un Sistema de Gestión de Bases de Datos Federadas débilmente acoplado se caracteriza por:

A) El administrador global del sistema federado tiene todo el control sobre la creación y el acceso a los sistemas de base de datos componente
B) Soporta uno o más esquemas federados
C) Los usuarios son los responsables de la creación y el mantenimiento de las federaciones mediante la utilización de vistas
D) Todas son correctas

Respuesta correcta: C)

Explicación:

  • Fuertemente acoplado: Administrador global controla todo, esquema federado único
  • Débilmente acoplado: Usuarios crean y mantienen vistas federadas, más flexibilidad, menos control centralizado
Característica Fuertemente Acoplado Débilmente Acoplado
Control Administrador global Usuarios individuales
Esquema federado Único, gestionado centralmente Múltiples, creados por usuarios (vistas)
Autonomía de BD componentes Baja (control centralizado) Alta (cada BD es independiente)
Flexibilidad Baja Alta
Complejidad Alta para el administrador Alta para los usuarios

9. Principales SGBD Comerciales

Los SGBD comerciales son productos propietarios desarrollados por grandes empresas tecnológicas. Se caracterizan por soporte profesional, herramientas avanzadas de administración, optimizaciones de rendimiento y cumplimiento de estándares.

9.1. Oracle Database

Oracle es el SGBD relacional líder del mercado empresarial. Desarrollado por Oracle Corporation desde 1979, es la base de datos más utilizada en sistemas críticos de misión.

Características principales:

  • Alta disponibilidad: Oracle RAC (Real Application Clusters), Data Guard
  • Escalabilidad: Particionado, paralelismo masivo (MPP)
  • Seguridad: TDE (cifrado transparente), VPD (políticas de seguridad a nivel fila), audit avanzado
  • Rendimiento: Optimizador basado en costes, índices avanzados (B-Tree, Bitmap, Function-based)
  • PL/SQL: Lenguaje procedural potente
  • Herramientas: Enterprise Manager, AWR (Automatic Workload Repository), ASH (Active Session History)

💡 Uso en el SAS: Oracle Database

Sistemas críticos sobre Oracle:

  • Diraya (Historia Clínica Digital): Oracle 19c RAC (alta disponibilidad), 2 nodos activo-activo, SAN compartido
  • Receta XXI: Oracle 19c con Data Guard (replicación síncrona), failover automático
  • BI Corporativo: Oracle 19c (Datawarehouse), particionado por fecha, compresión avanzada

Configuración típica Oracle RAC en Diraya:

-- 2 nodos Oracle RAC (activo-activo)
Nodo 1: diraya-rac01.sspa.local (192.168.10.11)
Nodo 2: diraya-rac02.sspa.local (192.168.10.12)

-- SAN compartido (cabina EMC VNX)
ASM Disk Group: +DATA (10 TB RAID 10)
ASM Disk Group: +FRA (5 TB RAID 10, Fast Recovery Area)

-- Configuración alta disponibilidad
Oracle Clusterware: Gestión automática de failover
Oracle Data Guard: Réplica standby en CPD secundario (Granada)
RMAN: Backups incrementales diarios a cinta LTO-9

-- Rendimiento
AWR Reports: Análisis automático cada hora
SQL Tuning Advisor: Optimización de consultas lentas
Table Partitioning: HISTORICO_CONSULTAS particionado por mes
Compression: HCC (Hybrid Columnar Compression) en datos históricos

-- Seguridad (ENS MEDIO)
TDE (Transparent Data Encryption): Cifrado de tablespaces sensibles
VPD (Virtual Private Database): Políticas de seguridad a nivel fila
Audit: Registro de accesos a datos de salud (RGPD)

🎯 Pregunta Recurrente en Examen

El administrador de bases de datos utiliza una herramienta para identificar posibles cuellos de botella y optimizar la ejecución de consultas. ¿Cuál de las siguientes herramientas de Oracle ofrece información sobre recursos, tiempos de espera y estadísticas de ejecución de sentencias SQL?

A) RAC    B) AWR    C) RMAN    D) Data Guard

Respuesta correcta: B) AWR (Automatic Workload Repository)

Explicación:

  • AWR: Repositorio de métricas de rendimiento, diagnóstico de cuellos de botella
  • RAC: Alta disponibilidad (clustering), no diagnóstico de rendimiento
  • RMAN: Backups y recuperación, no rendimiento
  • Data Guard: Replicación y disaster recovery, no diagnóstico

9.2. Microsoft SQL Server

SQL Server es el SGBD de Microsoft, integrado con el ecosistema Windows Server. Popular en entornos corporativos que utilizan tecnologías Microsoft.

Características principales:

  • Integración con Windows: Active Directory, Windows Authentication
  • T-SQL: Transact-SQL (extensiones procedimentales de Microsoft)
  • Herramientas: SQL Server Management Studio (SSMS), Integration Services (SSIS - ETL)
  • Alta disponibilidad: Always On Availability Groups, Failover Clustering
  • BI integrado: Analysis Services (OLAP), Reporting Services (SSRS)

💡 Uso en el SAS: SQL Server (aplicaciones legacy)

Aunque el SAS ha migrado la mayoría de sistemas críticos a Oracle y PostgreSQL, aún existen algunas aplicaciones departamentales sobre SQL Server:

  • Sistema de Recursos Humanos: SQL Server 2019 Standard (aplicación legacy en proceso de migración)
  • Gestión de Inventario: SQL Server 2016 (algunas farmacias hospitalarias)

Estrategia del SAS: Migrar progresivamente a PostgreSQL (software libre) o consolidar en Oracle (sistemas críticos).

9.3. IBM Db2

Db2 es el SGBD de IBM, históricamente fuerte en entornos mainframe (z/OS) pero también disponible para Linux, Unix y Windows.

Características principales:

  • Rendimiento en mainframe: Optimizado para z/OS, procesamiento masivo de transacciones
  • Compatibilidad SQL: Alta adherencia al estándar SQL
  • Compresión: Compresión de datos avanzada (ahorro de espacio)
  • Replicación: Q Replication, SQL Replication

Uso en el SAS: No se utiliza actualmente. IBM Db2 es más común en sector financiero y grandes corporaciones con infraestructura mainframe.

9.4. Comparativa SGBD Comerciales

Característica Oracle Database Microsoft SQL Server IBM Db2
Licencia Por núcleo o por usuario Por núcleo o CALs Por núcleo o PVU
Coste Muy alto Medio-Alto Alto
Plataformas Linux, Unix, Windows Windows, Linux (desde 2017) z/OS, Linux, Unix, Windows
Lenguaje procedural PL/SQL T-SQL SQL PL
Alta disponibilidad RAC, Data Guard Always On, Failover Clustering HADR, pureScale
Mercado principal Empresas grandes, sector público Empresas medianas, entorno Microsoft Mainframes, banca, seguros

📌 Tendencia en el Sector Público: Migración a Software Libre

La Junta de Andalucía y el SAS tienen una política de migración progresiva a software libre para reducir dependencia de proveedores y costes de licencias. Esto explica:

  • BPS (Base de Datos de Usuarios) migró de Oracle a PostgreSQL
  • Aplicaciones departamentales nuevas usan PostgreSQL o MariaDB
  • Diraya y Receta XXI siguen en Oracle (sistemas críticos, migración compleja y costosa)

10. SGBD de Código Abierto (Open Source)

Los SGBD de código abierto son alternativas a los SGBD comerciales con licencias libres (GNU GPL, BSD, Apache). Ofrecen ventajas de coste, flexibilidad y comunidad activa, pero con menor soporte comercial (aunque existen empresas que ofrecen soporte profesional).

10.1. PostgreSQL

PostgreSQL es el SGBD open source más avanzado y completo. Desarrollado desde 1986 en la Universidad de Berkeley, es conocido por su robustez, cumplimiento de estándares SQL y extensibilidad.

Características principales:

  • Cumplimiento SQL: Mayor adherencia al estándar SQL que cualquier otro SGBD
  • ACID completo: Transacciones robustas, MVCC (Multi-Version Concurrency Control)
  • Tipos de datos avanzados: JSON, JSONB, XML, Arrays, Hstore, PostGIS (geoespacial)
  • Extensibilidad: Funciones propias en múltiples lenguajes (PL/pgSQL, Python, Perl, Java)
  • Rendimiento: Índices GiST, GIN, BRIN; particionado nativo; paralelismo de consultas
  • Replicación: Streaming replication, logical replication
  • Licencia: PostgreSQL License (similar a BSD, muy permisiva)

🎯 Pregunta Recurrente en Examen

¿Cuál de los siguientes Sistemas Gestores de Bases de Datos (SGBD) es de código abierto?

A) Microsoft SQL Server
B) Oracle Database
C) PostgreSQL
D) IBM DB2

Respuesta correcta: C) PostgreSQL

Otros SGBD open source que podrían aparecer: MySQL, MariaDB, SQLite

💡 Uso en el SAS: PostgreSQL

BPS (Base de Datos de Usuarios del SAS):

  • Versión: PostgreSQL 15.4
  • Configuración: Maestro-Esclavo con streaming replication (réplica síncrona)
  • Datos: 8,5 millones de registros de usuarios del SAS
  • Alta disponibilidad: Patroni + HAProxy para failover automático
  • Backup: pgBackRest con backups incrementales diarios
  • Monitorización: pgAdmin, Prometheus + Grafana
-- Configuración alta disponibilidad BPS
Servidor maestro: bps-master.sspa.local (192.168.20.10)
Servidor réplica: bps-replica.sspa.local (192.168.20.11)

-- Replicación streaming síncrona (datos críticos)
postgresql.conf (master):
wal_level = replica
synchronous_commit = on
synchronous_standby_names = 'bps-replica'
max_wal_senders = 10

-- Conexión aplicaciones a través de HAProxy (failover transparente)
haproxy.cfg:
frontend postgres
    bind *:5432
    default_backend postgres_backend

backend postgres_backend
    option tcp-check
    server bps-master 192.168.20.10:5432 check
    server bps-replica 192.168.20.11:5432 check backup

-- Si cae el master, HAProxy redirige automáticamente al replica
-- Patroni promueve el replica a master en <30 segundos

10.2. MySQL y MariaDB

MySQL es el SGBD open source más popular del mundo (aunque propiedad de Oracle desde 2010). MariaDB es un fork de MySQL creado por los desarrolladores originales para mantener la independencia.

Características principales:

  • Simplicidad: Fácil instalación y administración
  • Rendimiento web: Optimizado para aplicaciones web (LAMP stack: Linux, Apache, MySQL, PHP)
  • Motores de almacenamiento: InnoDB (transaccional, defecto), MyISAM (rápido, sin transacciones)
  • Replicación: Master-Slave, Master-Master, Group Replication (MySQL 8)
  • Licencia MySQL: GPL + licencia comercial dual
  • Licencia MariaDB: GPL puro

🎯 Pregunta Recurrente en Examen

De los siguientes, ¿cuál es un Sistema Gestor de Bases de Datos (SGBD)?

A) MariaDB
B) SQLighten (no existe, es SQLite)
C) DataForge (no existe)
D) MongoSQL (no existe, MongoDB es NoSQL)

Respuesta correcta: A) MariaDB

💡 Uso en el SAS: MariaDB

Aplicaciones departamentales no críticas:

  • Intranet corporativa: MariaDB 10.11 (CMS WordPress)
  • Gestión de turnos: MariaDB 10.9 (aplicación PHP interna)
  • Portal de formación: MariaDB 10.11 (Moodle)

Se prefiere MariaDB sobre MySQL por:

  • Licencia GPL pura (sin dependencia de Oracle)
  • Mayor rendimiento en algunas cargas
  • Compatibilidad total con MySQL (migración trivial)
  • Soporte comunitario activo

10.3. SQLite

SQLite es un SGBD embebido (sin proceso servidor). La base de datos completa está en un solo fichero. Es el SGBD más desplegado del mundo (smartphones, navegadores, aplicaciones embebidas).

Características principales:

  • Embebido: Sin servidor, la librería se enlaza con la aplicación
  • Ligero: Librería de ~600 KB
  • Autocontenido: BD completa en un solo fichero portable
  • Transacciones ACID: Soporta transacciones completas
  • Licencia: Dominio público (sin licencia, totalmente libre)

Uso en el SAS: Aplicaciones móviles (ClicSalud+ app en Android/iOS), cachés locales en estaciones de trabajo.

10.4. Comparativa SGBD Open Source vs Comerciales

Aspecto SGBD Comercial
(Oracle, SQL Server)
SGBD Open Source
(PostgreSQL, MariaDB)
Coste Alto (licencias + soporte) Bajo (solo soporte opcional)
Soporte Soporte profesional incluido Comunidad + soporte comercial opcional
Herramientas Herramientas avanzadas propietarias Herramientas open source (algunas muy buenas)
Rendimiento Altamente optimizado Excelente (PostgreSQL comparable a Oracle)
Escalabilidad Muy alta (RAC, Exadata) Alta (Patroni, Citus, Vitess)
Cumplimiento estándares Alto (con extensiones propias) Muy alto (PostgreSQL líder en SQL estándar)
Dependencia del proveedor Alta (vendor lock-in) Baja (comunidad, múltiples proveedores)
Transparencia Código cerrado Código abierto (auditable)

📌 Política de Software Libre en la Junta de Andalucía

El Decreto 72/2003 de la Junta de Andalucía establece medidas de impulso del software libre. El SAS sigue esta política:

  • Preferencia por SGBD open source en nuevos desarrollos
  • PostgreSQL como estándar para aplicaciones nuevas
  • MariaDB para aplicaciones web y CMS
  • Oracle solo para sistemas críticos donde está justificado

Ventajas estratégicas:

  • Ahorro de costes (licencias)
  • Independencia de proveedores
  • Transparencia y auditabilidad (seguridad ENS)
  • Soberanía tecnológica

11. Aplicación Práctica en el SAS

El modelo relacional y los SGBD son la base tecnológica de todos los sistemas de información del SAS. Entender esta arquitectura es fundamental para tu trabajo como Técnico Especialista.

11.1. Arquitectura de Bases de Datos del SAS

┌─────────────────────────────────────────────────────────────────┐ │ SISTEMAS DE INFORMACIÓN SAS │ │ (Capa Aplicación) │ └────────────────┬────────────────────────────────────────────────┘ │ ┌────────────┴─────────────┬──────────────┬──────────────┐ │ │ │ │ ┌───▼──────────┐ ┌──────────▼──────┐ ┌──▼──────────┐ ┌─▼──────────┐ │ DIRAYA │ │ RECETA XXI │ │ BPS │ │BI Corporat.│ │ (Hist.Clin.) │ │ (e-Prescr.) │ │ (Usuarios) │ │(Datawarehs)│ └───┬──────────┘ └──────────┬──────┘ └──┬──────────┘ └─┬──────────┘ │ │ │ │ ┌───▼──────────────┐ ┌────────▼────────┐ ┌─▼──────────┐ ┌─▼──────────┐ │ Oracle 19c │ │ Oracle 19c │ │PostgreSQL │ │ Oracle 19c │ │ RAC (HA) │ │ + Data Guard │ │ 15.4 │ │ (DWH) │ │ 2 Nodos │ │ (DR) │ │ Master- │ │ Particiondo│ └───┬──────────────┘ └────────┬────────┘ │ Replica │ └─┬─── Alto (licencias por CPU/usuario) Gratuito (soporte opcional de pago) Funcionalidades avanzadas Muy completas (BI, IA, particionado avanzado) Completas (la mayoría de necesidades cubiertas) Soporte oficial 24/7 con SLAs garantizados Comunitario (o soporte comercial opcional) Escalabilidad Máxima (clusters, RAC, sharding nativo) Alta (suficiente para la mayoría de casos) Herramientas de gestión Suite completa integrada Múltiples opciones open source Vendor lock-in Alto (dependencia del proveedor) Bajo (portabilidad, control total) Innovación Controlada por el proveedor Impulsada por la comunidad

⚖️ Decisión en el SAS

Criterios de selección SGBD en el SAS:

  • Sistemas críticos de misión: Oracle Database (Diraya, InterSAS) → Necesidad de máxima disponibilidad, soporte 24/7, capacidad de recuperación ante desastres garantizada
  • Sistemas corporativos importantes: PostgreSQL (BPS, catálogo de servicios) → Rendimiento profesional sin coste de licencias
  • Aplicaciones departamentales: MariaDB (intranets, portales) → Simplicidad y economía
  • Aplicaciones móviles/embebidas: SQLite (apps ClicSalud+) → Portabilidad y autonomía

Tendencia actual: Migración progresiva de Oracle a PostgreSQL en sistemas no críticos para reducir dependencias y costes (Plan de Transformación Digital SSPA 2022-2027).

11. Conclusiones: El Modelo Relacional en la Sanidad Digital

Vale, ya hemos recorrido todo el camino del modelo relacional, desde las ideas originales de Codd hasta los sistemas concretos que tenemos hoy en día en el SAS. Déjame recapitular lo más importante, porque en un examen de oposición no vas a tener tiempo de recordar cada detalle, pero sí necesitas tener muy claras las ideas clave.

11.1. Ideas Fundamentales que Debes Dominar

🎯 1. El Modelo Relacional es FUNDACIONAL

No es "una" forma de organizar datos, es LA forma dominante desde hace 50 años. Edgar Codd no inventó las bases de datos, pero sí revolucionó la forma de pensarlas: datos como matemáticas (relaciones, conjuntos, álgebra). Cuando en el examen te pregunten por "el modelo de datos más extendido", la respuesta es obvia: el relacional.

🎯 2. Arquitectura de Tres Niveles (ANSI-SPARC)

Esta es una de las preguntas recurrentes. Tienes que saberte de memoria:

  • Nivel externo: Vistas (lo que ve cada usuario)
  • Nivel conceptual: Esquema lógico completo (todas las tablas y relaciones)
  • Nivel interno: Almacenamiento físico (índices, particiones, ficheros)

Independencia de datos: Puedes cambiar un nivel sin afectar a los otros. En Diraya, puedes cambiar los índices (nivel interno) sin que afecte a las aplicaciones (nivel externo).

🎯 3. Normalización: 1FN, 2FN, 3FN (y FNBC si quieres brillar)

La normalización es una pregunta segura en el examen. Debes:

  • 1FN: Atributos atómicos (nada de listas en una celda)
  • 2FN: Depende de toda la clave (no de parte de ella)
  • 3FN: Sin dependencias transitivas (A→B→C implica redundancia)
  • FNBC: Forma normal de Boyce-Codd (refina 3FN para casos especiales)

En el SAS, la tabla Pacientes está en 3FN: CIP como clave, sin redundancias, sin datos derivados.

🎯 4. Integridad Referencial y Restricciones

Las claves foráneas (FOREIGN KEY) son el pegamento que mantiene coherente una base de datos. Si en la tabla CITAS tienes un CIP que no existe en PACIENTES, tienes un problema grave de integridad. El SGBD impide esto con restricciones:

  • ON DELETE CASCADE: Si borras un paciente, se borran sus citas
  • ON DELETE RESTRICT: No puedes borrar un paciente con citas
  • ON DELETE SET NULL: Si borras un paciente, las citas quedan sin paciente (raro en sanidad)

🎯 5. SQL: El Lenguaje Universal

SQL es el estándar ISO/IEC 9075. Todas las bases de datos relacionales lo hablan (con dialectos). Tienes que conocer:

  • DDL: CREATE, ALTER, DROP (estructura)
  • DML: SELECT, INSERT, UPDATE, DELETE (datos)
  • DCL: GRANT, REVOKE (permisos)
  • TCL: COMMIT, ROLLBACK (transacciones)

En el examen te pueden poner consultas SQL para interpretar o preguntar qué hace un JOIN concreto.

🎯 6. ACID: Transacciones Confiables

Las transacciones ACID son lo que hace que las bases de datos sean confiables:

  • Atomicidad: Todo o nada (si falla algo, se deshace todo)
  • Consistencia: La BD pasa de un estado válido a otro válido
  • Aislamiento: Las transacciones concurrentes no se interfieren
  • Durabilidad: Una vez confirmada (COMMIT), la transacción persiste incluso si hay un fallo

En Diraya, cuando un médico prescribe un medicamento, es una transacción ACID: se registra en la historia clínica Y en el sistema de recetas. Si falla algo, se deshace todo (ROLLBACK).

🎯 7. SGBD Comerciales vs Open Source

En el examen te preguntarán por SGBD concretos:

  • Comerciales: Oracle (el rey en el SAS), SQL Server (Microsoft), DB2 (IBM)
  • Open Source: PostgreSQL (el más avanzado), MySQL/MariaDB (el más popular), SQLite (embebido)

En el SAS: Oracle para sistemas críticos (Diraya), PostgreSQL para sistemas importantes (BPS), MariaDB para aplicaciones departamentales.

11.2. Retos Actuales y Futuros

El modelo relacional lleva 50 años siendo el estándar, pero no está exento de desafíos. Algunas tendencias que debes conocer (podrían aparecer en preguntas de "futuro" o "tendencias"):

  • NoSQL y Bases de Datos Multimodelo: MongoDB, Cassandra, Neo4j... Para datos no estructurados, grafos, series temporales. En el SAS, se están explorando bases de datos de grafos para redes de derivaciones entre centros sanitarios.
  • NewSQL: Bases de datos que combinan la escalabilidad de NoSQL con las garantías ACID del modelo relacional (CockroachDB, Google Spanner). Todavía no están en el SAS, pero podrían llegar.
  • Data Lakes y Big Data: Hadoop, Spark, data lakes... Para análisis masivos de datos sanitarios (BI Corporativo, Machine Learning). Coexisten con bases de datos relacionales tradicionales.
  • Bases de Datos en la Nube (DBaaS): Amazon RDS, Azure SQL Database, Google Cloud SQL... El SAS está explorando cloud híbrido (Plan de Transformación Digital 2022-2027).
  • Bases de Datos como Código (IaC): Terraform, Ansible, Kubernetes operators... Gestionar bases de datos como infraestructura como código (automatización, reproducibilidad).

A pesar de estos avances, el modelo relacional sigue siendo el corazón de los sistemas de información sanitarios. La historia clínica digital, la gestión de citas, las recetas electrónicas... todo se basa en bases de datos relacionales. Y esto no va a cambiar a corto plazo.

11.3. Aplicabilidad Directa en tu Puesto TFA-STI

Cuando apruebes la oposición (y la vas a aprobar, confía en mí) y te incorpores como Técnico Especialista en Informática en el SAS, el modelo relacional va a ser tu pan de cada día:

  • Soporte a aplicaciones clínicas: Diraya, InterSAS, BPS... todas usan bases de datos relacionales. Necesitarás entender cómo funcionan para diagnosticar problemas.
  • Gestión de incidencias: "Diraya va lento" → Probablemente un problema de consultas SQL mal optimizadas o índices faltantes.
  • Proyectos de migración: Migrar de Oracle a PostgreSQL (tendencia actual en el SAS) requiere entender profundamente el modelo relacional y SQL.
  • Seguridad y cumplimiento normativo: RGPD, ENS... Necesitas saber cómo se gestionan los permisos (GRANT/REVOKE), cómo se auditan los accesos, cómo se encriptan los datos.
  • Diseño de nuevas aplicaciones: Si participas en el desarrollo de nuevas herramientas (ej: portal de analíticas), necesitarás diseñar el modelo de datos (modelo E-R, normalización, SQL).

El modelo relacional no es "materia de examen". Es la base de tu trabajo diario. Cuanto mejor lo entiendas, más efectivo serás en tu puesto.

11.4. Estrategia de Estudio para Este Tema

Este tema es FUNDAMENTAL. No es de los que puedes estudiar por encima. Te recomiendo:

  1. Domina las definiciones formales: Relación, tupla, atributo, dominio, clave primaria, clave foránea, dependencia funcional... Memoriza las definiciones exactas.
  2. Practica normalización: Coge tablas desnormalizadas y normalízalas. Identifica dependencias funcionales, lleva a 1FN, 2FN, 3FN. Es una habilidad mecánica que se mejora con práctica.
  3. Escribe SQL a mano: No uses herramientas visuales. Escribe consultas SELECT con JOINs, GROUP BY, HAVING... a mano. En el examen no tendrás un IDE.
  4. Estudia los SGBD del SAS: Oracle (versión 19c en Diraya), PostgreSQL (versión 15 en BPS), MariaDB. Conoce sus características, ventajas, casos de uso.
  5. Repasa preguntas de exámenes anteriores: Este tema cae SIEMPRE. Mira las preguntas de 2019, 2023, 2025... Identifica patrones.

Tiempo de estudio estimado: 2 semanas (10-15 horas). Es un tema denso, pero estructurado. No lo dejes para el final.

12. Mapa Conceptual ASCII

Aquí tienes un diagrama que resume visualmente toda la estructura del tema. Úsalo para repasos rápidos:


╔════════════════════════════════════════════════════════════════════════════╗
║                         TEMA 34: MODELO RELACIONAL                         ║
║                         Bases de Datos Relacionales                        ║
╚════════════════════════════════════════════════════════════════════════════╝

┌─────────────────────────────────────────────────────────────────────────────┐
│ 1. CONCEPTOS FUNDAMENTALES (Edgar Codd, 1970)                             │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   Relación (Tabla)                  Tupla (Fila)           Atributo (Col.) │
│   ┌─────────────┐                   ┌──────────┐           ┌──────────┐   │
│   │ PACIENTES   │◄──────────────────┤ Registro │◄──────────┤ Campo    │   │
│   └─────────────┘                   └──────────┘           └──────────┘   │
│         │                                                                   │
│         ├─── Grado (nº de atributos)                                       │
│         └─── Cardinalidad (nº de tuplas)                                   │
│                                                                             │
│   Dominio: Conjunto de valores válidos para un atributo                    │
│   Esquema: Estructura lógica (tabla + atributos + restricciones)           │
│   Instancia: Datos concretos en un momento dado                            │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 2. ARQUITECTURA ANSI-SPARC (3 niveles de abstracción)                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌─────────────────────────────────────────────────────────────────────┐ │
│   │ NIVEL EXTERNO (Vistas - Lo que ven los usuarios)                    │ │
│   │  • Vista médicos: SELECT nombre, CIP FROM pacientes WHERE ...       │ │
│   │  • Vista enfermeras: SELECT CIP, alergias FROM pacientes WHERE ...  │ │
│   └─────────────────────────────────────────────────────────────────────┘ │
│                         ▲                                                   │
│                         │ Independencia lógica de datos                     │
│                         ▼                                                   │
│   ┌─────────────────────────────────────────────────────────────────────┐ │
│   │ NIVEL CONCEPTUAL (Esquema lógico completo)                          │ │
│   │  • Todas las tablas: PACIENTES, CITAS, MEDICOS, PRESCRIPCIONES...   │ │
│   │  • Relaciones (claves foráneas): CITAS.CIP → PACIENTES.CIP          │ │
│   │  • Restricciones: NOT NULL, UNIQUE, CHECK...                         │ │
│   └─────────────────────────────────────────────────────────────────────┘ │
│                         ▲                                                   │
│                         │ Independencia física de datos                     │
│                         ▼                                                   │
│   ┌─────────────────────────────────────────────────────────────────────┐ │
│   │ NIVEL INTERNO (Almacenamiento físico)                               │ │
│   │  • Ficheros: /data/oracle/diraya/pacientes01.dbf                    │ │
│   │  • Índices: CREATE INDEX idx_cip ON pacientes(CIP)                  │ │
│   │  • Particiones: PARTITION BY RANGE (fecha_alta)                     │ │
│   └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 3. DISEÑO: MODELO ENTIDAD-RELACIÓN → MODELO RELACIONAL                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ENTIDADES (Rectángulos)         RELACIONES (Rombos)                      │
│   ┌──────────┐                    ◇──────────◇                             │
│   │ PACIENTE │─────────1:N────────│ TIENE     │─────────N:1──────┐        │
│   └──────────┘                    ◇──────────◇                   │        │
│                                                                   ▼        │
│                                                           ┌──────────┐     │
│                                                           │   CITA   │     │
│                                                           └──────────┘     │
│                                                                             │
│   TRANSFORMACIÓN A TABLAS:                                                 │
│   • Entidades → Tablas (PACIENTES, CITAS)                                  │
│   • Relaciones 1:N → Clave foránea en tabla N (CITAS.CIP → PACIENTES.CIP) │
│   • Relaciones N:M → Tabla intermedia                                      │
│   • Atributos multivaluados → Tabla separada                               │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 4. NORMALIZACIÓN (Eliminar redundancias)                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   Tabla SIN normalizar (0FN):                                              │
│   ┌─────────────────────────────────────────────────────────────────────┐ │
│   │ CIP  | Nombre | Alergias          | Tel1  | Tel2  | Centro | Ciudad││ │
│   ├─────────────────────────────────────────────────────────────────────┤ │
│   │ 123  | Ana    | Penicilina,Polen  | 666.. | 777.. | H.Rocío | Sev. ││ │
│   └─────────────────────────────────────────────────────────────────────┘ │
│   Problemas: Atributos multivaluados, dependencias transitivas...          │
│                                                                             │
│   1FN (Atributos atómicos):                                                │
│   ┌──────────────────┐       ┌────────────────┐                           │
│   │ PACIENTES        │       │ ALERGIAS       │                           │
│   │ CIP (PK)         │◄──────│ CIP (FK)       │                           │
│   │ Nombre           │       │ Alergia        │                           │
│   │ Centro           │       └────────────────┘                           │
│   │ Ciudad           │                                                     │
│   └──────────────────┘                                                     │
│                                                                             │
│   2FN (Depende de TODA la clave):                                          │
│   ┌──────────────────┐       ┌────────────────┐                           │
│   │ PACIENTES        │       │ TELEFONOS      │                           │
│   │ CIP (PK)         │◄──────│ CIP (FK)       │                           │
│   │ Nombre           │       │ NumeroTel (PK) │                           │
│   │ CentroID (FK) ───┼───┐   └────────────────┘                           │
│   └──────────────────┘   │                                                 │
│                          │   ┌────────────────┐                           │
│                          └──►│ CENTROS        │                           │
│                              │ CentroID (PK)  │                           │
│                              │ Nombre         │                           │
│                              │ Ciudad         │                           │
│                              └────────────────┘                           │
│                                                                             │
│   3FN (Sin dependencias transitivas): Ya alcanzada en el diseño anterior   │
│   (Ciudad depende de Centro, no directamente de Paciente)                  │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 5. MANIPULACIÓN: ÁLGEBRA RELACIONAL (Operaciones teóricas)                │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   Operaciones Fundamentales:                                               │
│   • Selección (σ):        σ_condición(R) → Filtrar filas                  │
│   • Proyección (π):       π_atributos(R) → Seleccionar columnas           │
│   • Producto cartesiano (×): R × S → Todas las combinaciones              │
│   • Unión (∪):            R ∪ S → Unir resultados                          │
│   • Diferencia (-):       R - S → En R pero no en S                        │
│   • Join (⨝):             R ⨝_condición S → Unir tablas con condición     │
│                                                                             │
│   Ejemplo:                                                                  │
│   π_nombre,apellido(σ_ciudad='Sevilla'(PACIENTES ⨝ CENTROS))              │
│   = Nombres de pacientes de centros en Sevilla                             │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 6. SQL: LENGUAJE DE CONSULTA ESTÁNDAR (ISO/IEC 9075)                      │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   DDL (Definición):        DML (Manipulación):    DCL (Control):           │
│   • CREATE TABLE           • SELECT               • GRANT                  │
│   • ALTER TABLE            • INSERT               • REVOKE                 │
│   • DROP TABLE             • UPDATE                                        │
│   • CREATE INDEX           • DELETE               TCL (Transacciones):     │
│                                                    • COMMIT                 │
│   Ejemplo DDL:                                    • ROLLBACK               │
│   CREATE TABLE Pacientes (                        • SAVEPOINT              │
│     CIP CHAR(10) PRIMARY KEY,                                              │
│     Nombre VARCHAR(50) NOT NULL,                                           │
│     FechaNac DATE,                                                         │
│     CONSTRAINT chk_fecha CHECK (FechaNac < SYSDATE)                        │
│   );                                                                        │
│                                                                             │
│   Ejemplo DML:                                                              │
│   SELECT p.Nombre, c.Fecha                                                 │
│   FROM Pacientes p                                                         │
│   INNER JOIN Citas c ON p.CIP = c.CIP                                      │
│   WHERE c.Fecha >= SYSDATE                                                 │
│   ORDER BY c.Fecha;                                                        │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 7. INTEGRIDAD Y RESTRICCIONES                                             │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌──────────────────────────────────────────────────────────────────┐    │
│   │ Integridad de Entidad (Entity Integrity)                        │    │
│   │  → Clave primaria NOT NULL + UNIQUE                              │    │
│   │    CIP CHAR(10) PRIMARY KEY                                      │    │
│   └──────────────────────────────────────────────────────────────────┘    │
│                                                                             │
│   ┌──────────────────────────────────────────────────────────────────┐    │
│   │ Integridad Referencial (Referential Integrity)                  │    │
│   │  → Clave foránea apunta a registro existente                     │    │
│   │    FOREIGN KEY (CIP) REFERENCES Pacientes(CIP)                   │    │
│   │      ON DELETE CASCADE / RESTRICT / SET NULL                     │    │
│   └──────────────────────────────────────────────────────────────────┘    │
│                                                                             │
│   ┌──────────────────────────────────────────────────────────────────┐    │
│   │ Integridad de Dominio (Domain Integrity)                        │    │
│   │  → Valores dentro del dominio permitido                          │    │
│   │    CHECK (Edad BETWEEN 0 AND 150)                                │    │
│   └──────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 8. TRANSACCIONES ACID (Garantías de fiabilidad)                           │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐    │
│   │ ATOMICITY   │  │ CONSISTENCY │  │ ISOLATION   │  │ DURABILITY  │    │
│   │  Todo o     │  │  Estado     │  │  Transacc.  │  │  COMMIT →   │    │
│   │  nada       │  │  válido     │  │  aisladas   │  │  Persiste   │    │
│   └─────────────┘  └─────────────┘  └─────────────┘  └─────────────┘    │
│                                                                             │
│   Ejemplo en Diraya (Prescripción):                                        │
│   BEGIN TRANSACTION;                                                        │
│     INSERT INTO Prescripciones (...);      -- 1. Registrar receta          │
│     UPDATE HistoriaClinica SET ...;        -- 2. Actualizar historia       │
│     INSERT INTO RecetaXXI (...);           -- 3. Enviar a farmacia         │
│   COMMIT;  -- Si algo falla → ROLLBACK (todo se deshace)                   │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│ 9. SGBD EN EL SAS                                                          │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   COMERCIALES:                  OPEN SOURCE:                               │
│   ┌──────────────┐              ┌──────────────┐                          │
│   │ Oracle 19c   │              │ PostgreSQL15 │                          │
│   │ • Diraya     │              │ • BPS        │                          │
│   │ • InterSAS   │              │ • Catálogos  │                          │
│   │ • Nódulo     │              └──────────────┘                          │
│   └──────────────┘              ┌──────────────┐                          │
│   ┌──────────────┐              │ MariaDB 10   │                          │
│   │ SQL Server   │              │ • Intranets  │                          │
│   │ • Apps .NET  │              │ • Portales   │                          │
│   └──────────────┘              └──────────────┘                          │
│                                                                             │
│   DECISIÓN: Oracle (críticos) / PostgreSQL (importantes) / MariaDB (dept.) │
└─────────────────────────────────────────────────────────────────────────────┘

╔════════════════════════════════════════════════════════════════════════════╗
║ EXAMEN: Preguntas clave esperadas                                         ║
║  1. ¿Qué es una relación/tupla/atributo/dominio? (definiciones exactas)   ║
║  2. Arquitectura ANSI-SPARC (3 niveles + independencia de datos)          ║
║  3. Normalización: llevar tabla de 0FN a 3FN paso a paso                  ║
║  4. SQL: interpretar consulta con JOINs, GROUP BY, subconsultas           ║
║  5. ACID: definir cada propiedad + ejemplo en sanidad                     ║
║  6. SGBD: clasificar como comercial/open source (Oracle, PostgreSQL...)   ║
║  7. Integridad referencial: ON DELETE CASCADE vs RESTRICT                 ║
║  8. Modelo E-R: transformar diagrama a tablas relacionales                ║
╚════════════════════════════════════════════════════════════════════════════╝
        

13. Cuestionario de Preguntas Tipo Test

Aquí tienes 30 preguntas tipo test basadas en exámenes reales del SAS. El nivel de dificultad es similar al que encontrarás en la oposición. Todas las preguntas están acompañadas de su respuesta correcta y una breve explicación.

Instrucciones: Intenta responder todas las preguntas sin mirar las respuestas. Luego, comprueba tus resultados. Un opositor bien preparado debería acertar al menos 24/30 (80%).

Pregunta 1

Según el modelo relacional de Edgar Codd, una relación es:

A) Un vínculo entre dos tablas mediante claves foráneas
B) Un subconjunto del producto cartesiano de dominios
C) Una consulta SQL que une dos o más tablas
D) Un índice que acelera las búsquedas en una tabla

Respuesta correcta: B

Explicación: En la definición formal de Codd, una relación es un subconjunto del producto cartesiano de los dominios de sus atributos. Por ejemplo, si tenemos dominios D1={1,2,3} y D2={A,B}, el producto cartesiano D1×D2 = {(1,A), (1,B), (2,A), (2,B), (3,A), (3,B)}, y una relación sería un subconjunto de estos pares ordenados. La opción A describe una clave foránea (foreign key), que es un concepto diferente aunque relacionado.

Pregunta 2

En la arquitectura ANSI-SPARC de tres niveles, la independencia lógica de datos permite:

A) Cambiar el almacenamiento físico sin afectar a las aplicaciones
B) Modificar el esquema conceptual sin afectar a las vistas de usuario
C) Alterar las vistas de usuario sin cambiar el esquema conceptual
D) Optimizar consultas SQL automáticamente

Respuesta correcta: B

Explicación: La independencia lógica se da entre el nivel conceptual y el externo. Permite añadir o modificar tablas en el esquema conceptual (ej: añadir una nueva tabla ALERGIAS) sin afectar a las vistas de usuario existentes (ej: vista de médicos que muestra nombre y CIP de pacientes). La opción A describe la independencia física (entre nivel interno y conceptual).

Pregunta 3

Una tabla está en Primera Forma Normal (1FN) si:

A) No tiene dependencias funcionales transitivas
B) Todos los atributos no clave dependen de toda la clave primaria
C) Todos los atributos contienen valores atómicos (no divisibles)
D) Cada determinante es una clave candidata

Respuesta correcta: C

Explicación: La 1FN exige que cada celda contenga un valor atómico (no listas, no conjuntos). Por ejemplo, si en la columna "Alergias" tienes "Penicilina, Polen", NO está en 1FN. Debes crear una tabla separada ALERGIAS con una fila por cada alergia. La opción B describe 2FN, la opción A describe 3FN, y la opción D describe FNBC.

Pregunta 4

En el modelo Entidad-Relación, una relación de cardinalidad N:M (muchos a muchos) se transforma en el modelo relacional como:

A) Una clave foránea en una de las dos tablas
B) Una tabla intermedia con claves foráneas a ambas tablas
C) Dos tablas con claves primarias compuestas
D) Un atributo multivaluado en ambas tablas

Respuesta correcta: B

Explicación: Una relación N:M requiere una tabla intermedia. Ejemplo: MEDICOS ←→ PACIENTES (un médico atiende a muchos pacientes, un paciente es atendido por muchos médicos). Se crea una tabla ATENCIONES con claves foráneas: ATENCIONES(MedicoID, CIP, Fecha). La clave primaria compuesta sería (MedicoID, CIP, Fecha).

Pregunta 5

La operación de proyección (π) en álgebra relacional:

A) Filtra filas según una condición
B) Selecciona columnas específicas de una tabla
C) Une dos tablas basándose en una condición
D) Calcula el producto cartesiano de dos tablas

Respuesta correcta: B

Explicación: La proyección π selecciona columnas (atributos). Por ejemplo, π_nombre,apellido(PACIENTES) devuelve solo las columnas nombre y apellido. La operación que filtra filas es la selección (σ). La proyección puede eliminar duplicados automáticamente según la teoría de conjuntos.

Pregunta 6

En SQL, la cláusula HAVING se utiliza para:

A) Filtrar filas antes de agrupar
B) Filtrar grupos después de aplicar GROUP BY
C) Ordenar los resultados de una consulta
D) Definir alias para columnas calculadas

Respuesta correcta: B

Explicación: HAVING filtra grupos creados por GROUP BY. Ejemplo: SELECT Especialidad, COUNT(*) FROM Medicos GROUP BY Especialidad HAVING COUNT(*) > 10; (muestra solo especialidades con más de 10 médicos). WHERE filtra filas individuales ANTES de agrupar, HAVING filtra grupos DESPUÉS de agrupar.

Pregunta 7

La propiedad Atomicidad en transacciones ACID garantiza que:

A) Los datos son consistentes antes y después de la transacción
B) La transacción se ejecuta completamente o no se ejecuta en absoluto
C) Las transacciones concurrentes no interfieren entre sí
D) Los cambios confirmados persisten incluso tras un fallo del sistema

Respuesta correcta: B

Explicación: Atomicidad = "todo o nada". Si una transacción falla a mitad (ej: insertar prescripción en historia clínica funciona, pero fallar al enviar a RecetaXXI), se hace ROLLBACK y se deshacen TODOS los cambios. No queda "a medias". La opción C describe Aislamiento (Isolation), la D describe Durabilidad (Durability).

Pregunta 8

En SQL, la restricción ON DELETE CASCADE en una clave foránea significa que:

A) No se puede borrar la fila referenciada si existen filas dependientes
B) Al borrar la fila referenciada, se borran automáticamente las filas dependientes
C) Al borrar la fila referenciada, las claves foráneas en filas dependientes se ponen a NULL
D) El borrado se propaga solo un nivel de profundidad

Respuesta correcta: B

Explicación: CASCADE propaga el borrado. Ejemplo: Si borras un paciente (DELETE FROM Pacientes WHERE CIP='123') y la tabla CITAS tiene ON DELETE CASCADE, se borran automáticamente todas las citas de ese paciente. La opción A describe ON DELETE RESTRICT, la opción C describe ON DELETE SET NULL.

Pregunta 9

¿Cuál de los siguientes NO es un Sistema Gestor de Bases de Datos Relacionales (SGBDR)?

A) Oracle Database
B) PostgreSQL
C) MongoDB
D) MariaDB

Respuesta correcta: C

Explicación: MongoDB es una base de datos NoSQL de tipo documental (almacena documentos JSON). No es relacional, no usa SQL estándar, y no tiene esquema fijo. Oracle, PostgreSQL y MariaDB son SGBDR que usan el modelo relacional y SQL.

Pregunta 10

En el SAS, Diraya utiliza como SGBD:

A) PostgreSQL 15
B) Oracle Database 19c
C) MariaDB 10
D) Microsoft SQL Server 2019

Respuesta correcta: B

Explicación: Diraya (Historia de Salud Digital del SAS) usa Oracle Database 19c en configuración RAC (Real Application Cluster) para alta disponibilidad. Es el sistema más crítico del SAS, con >8 millones de historias clínicas. PostgreSQL se usa en sistemas menos críticos como BPS (Base de Datos de Usuarios).

Pregunta 11

Una tabla está en Segunda Forma Normal (2FN) si:

A) Todos los atributos son atómicos
B) Está en 1FN y todos los atributos no clave dependen de TODA la clave primaria
C) Está en 2FN y no tiene dependencias transitivas
D) Cada determinante es una clave candidata

Respuesta correcta: B

Explicación: La 2FN requiere: (1) estar en 1FN, (2) que no haya dependencias parciales (un atributo no clave depende solo de PARTE de la clave primaria compuesta). Ejemplo: si tienes una clave compuesta (CIP, Fecha) y el atributo NombrePaciente depende solo de CIP (no de Fecha), NO está en 2FN. Solución: separar en dos tablas.

Pregunta 12

El lenguaje SQL se divide en varios sublenguajes. El sublenguaje DCL (Data Control Language) incluye:

A) CREATE, ALTER, DROP
B) SELECT, INSERT, UPDATE, DELETE
C) GRANT, REVOKE
D) COMMIT, ROLLBACK, SAVEPOINT

Respuesta correcta: C

Explicación: DCL gestiona permisos y control de acceso. GRANT otorga permisos (ej: GRANT SELECT ON Pacientes TO medico_user), REVOKE los quita. La opción A es DDL (definición), la B es DML (manipulación), la D es TCL (transacciones).

Pregunta 13

En SQL, un INNER JOIN entre las tablas A y B devuelve:

A) Todas las filas de A, incluso si no tienen correspondencia en B
B) Todas las filas de B, incluso si no tienen correspondencia en A
C) Solo las filas que tienen correspondencia en ambas tablas
D) El producto cartesiano de A y B

Respuesta correcta: C

Explicación: INNER JOIN devuelve solo las filas que cumplen la condición de unión en AMBAS tablas. Ejemplo: PACIENTES INNER JOIN CITAS ON PACIENTES.CIP = CITAS.CIP devuelve solo pacientes que TIENEN citas programadas. Los pacientes sin citas NO aparecen (para incluirlos, usa LEFT JOIN).

Pregunta 14

Una clave primaria compuesta es:

A) Una clave primaria que puede contener valores NULL
B) Una clave primaria formada por dos o más atributos
C) Una clave foránea que referencia a varias tablas
D) Una clave que se genera automáticamente mediante secuencias

Respuesta correcta: B

Explicación: Una clave primaria compuesta (composite key) usa varios atributos para identificar unívocamente cada fila. Ejemplo: en la tabla HORARIOS_CONSULTA, la clave podría ser (MedicoID, DiaSemana, HoraInicio) porque un médico puede tener varias franjas horarias en distintos días/horas. Ninguno de los atributos individuales es único, pero la combinación sí lo es.

Pregunta 15

En el modelo relacional, una dependencia funcional X → Y significa que:

A) El atributo Y depende transitivamente de X
B) El valor de X determina unívocamente el valor de Y
C) X e Y son claves foráneas
D) X e Y deben tener el mismo dominio

Respuesta correcta: B

Explicación: Una dependencia funcional X → Y significa: "si conozco el valor de X, puedo determinar el valor de Y". Ejemplo: CIP → NombrePaciente (conociendo el CIP, sé el nombre del paciente). Las dependencias funcionales son la base de la normalización (2FN, 3FN, FNBC).

Pregunta 16

La propiedad Aislamiento (Isolation) en transacciones ACID se puede implementar mediante:

A) Backups periódicos
B) Niveles de aislamiento y bloqueos (locks)
C) Índices hash
D) Procedimientos almacenados

Respuesta correcta: B

Explicación: El aislamiento se implementa mediante niveles de aislamiento (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) y mecanismos de bloqueo (locks). Ejemplo: si la transacción A está modificando un registro, la transacción B se bloquea hasta que A haga COMMIT o ROLLBACK. Esto evita lecturas sucias, lecturas no repetibles y fantasmas.

Pregunta 17

¿Cuál de los siguientes SGBD es de código abierto (open source)?

A) Microsoft SQL Server
B) Oracle Database
C) PostgreSQL
D) IBM DB2

Respuesta correcta: C

Explicación: PostgreSQL es open source con licencia PostgreSQL License (similar a MIT/BSD). Otros SGBD open source: MySQL, MariaDB, SQLite. Oracle, SQL Server y DB2 son comerciales (licencias de pago). En el SAS, PostgreSQL se usa en sistemas no críticos (BPS, catálogos) para reducir costes de licencias.

Pregunta 18

En SQL, la restricción UNIQUE aplicada a una columna garantiza que:

A) La columna no puede contener valores NULL
B) No puede haber dos filas con el mismo valor en esa columna (excepto NULL)
C) La columna es la clave primaria de la tabla
D) La columna debe existir en otra tabla como clave foránea

Respuesta correcta: B

Explicación: UNIQUE permite valores NULL (a diferencia de PRIMARY KEY que no los permite), pero garantiza que no haya duplicados en valores no nulos. Ejemplo: en la tabla PACIENTES, el email podría ser UNIQUE (cada paciente tiene un email único), pero algunos pacientes podrían no tener email (NULL permitido).

Pregunta 19

Una tabla está en Tercera Forma Normal (3FN) si:

A) Todos los atributos son atómicos
B) Todos los atributos no clave dependen de toda la clave primaria
C) Está en 2FN y no tiene dependencias transitivas
D) Cada determinante es una clave candidata

Respuesta correcta: C

Explicación: La 3FN requiere: (1) estar en 2FN, (2) que no haya dependencias transitivas (A → B → C implica que C depende indirectamente de A). Ejemplo: si tienes CIP → CentroID → NombreCentro, el NombreCentro depende transitivamente de CIP a través de CentroID. Solución: separar CENTROS en su propia tabla. La opción D describe FNBC (Forma Normal de Boyce-Codd).

Pregunta 20

En el modelo Entidad-Relación, un atributo multivaluado (como "teléfonos" de un paciente) se transforma en el modelo relacional como:

A) Un atributo con valores separados por comas
B) Varios atributos (Telefono1, Telefono2, Telefono3...)
C) Una tabla separada con clave foránea a la entidad original
D) Un atributo de tipo array o lista

Respuesta correcta: C

Explicación: Los atributos multivaluados se convierten en tablas separadas para cumplir con la 1FN. Ejemplo: PACIENTES(CIP, Nombre) + TELEFONOS(CIP, NumeroTelefono). Si un paciente tiene 3 teléfonos, habrá 3 filas en TELEFONOS con el mismo CIP. Esto permite un número variable de valores sin desperdiciar espacio.

Pregunta 21

El estándar SQL está definido por:

A) W3C (World Wide Web Consortium)
B) ISO/IEC 9075
C) IEEE 802
D) IETF RFC 3986

Respuesta correcta: B

Explicación: SQL es un estándar ISO/IEC 9075, con versiones: SQL:1986 (primera), SQL:1992 (SQL2), SQL:1999 (SQL3), SQL:2003, SQL:2006, SQL:2008, SQL:2011, SQL:2016, SQL:2023 (última). Cada SGBD implementa el estándar con extensiones propietarias (PL/SQL en Oracle, T-SQL en SQL Server, PL/pgSQL en PostgreSQL).

Pregunta 22

En SQL, la cláusula GROUP BY se utiliza para:

A) Filtrar filas según una condición
B) Agrupar filas con valores iguales en columnas específicas para aplicar funciones agregadas
C) Ordenar los resultados de una consulta
D) Unir dos tablas basándose en una condición

Respuesta correcta: B

Explicación: GROUP BY agrupa filas para calcular agregados (COUNT, SUM, AVG, MAX, MIN). Ejemplo: SELECT Especialidad, COUNT(*) AS NumMedicos FROM Medicos GROUP BY Especialidad; (cuenta cuántos médicos hay por especialidad). Cada grupo se convierte en una fila en el resultado.

Pregunta 23

La operación de selección (σ) en álgebra relacional:

A) Selecciona columnas específicas de una tabla
B) Filtra filas que cumplen una condición
C) Une dos tablas basándose en una condición
D) Elimina filas duplicadas del resultado

Respuesta correcta: B

Explicación: La selección σ filtra filas (tuplas). Ejemplo: σ_ciudad='Sevilla'(CENTROS) devuelve solo los centros sanitarios de Sevilla. Es equivalente a la cláusula WHERE en SQL. La operación que selecciona columnas es la proyección (π).

Pregunta 24

En el SAS, la Base de Datos de Usuarios (BPS) utiliza como SGBD:

A) Oracle Database 19c
B) PostgreSQL 15
C) MariaDB 10
D) Microsoft SQL Server 2019

Respuesta correcta: B

Explicación: BPS (Base de Datos de Usuarios del SAS) usa PostgreSQL 15.4 en configuración maestro-esclavo con streaming replication. Contiene ~8,5 millones de registros de usuarios del SAS. Se eligió PostgreSQL por su madurez, rendimiento y economía (sin costes de licencias). Alta disponibilidad mediante Patroni + HAProxy para failover automático.

Pregunta 25

Un índice en una base de datos relacional:

A) Es una restricción que impide valores duplicados
B) Es una estructura de datos que acelera las búsquedas en una tabla
C) Es una tabla intermedia que representa una relación N:M
D) Es una vista materializada que se actualiza automáticamente

Respuesta correcta: B

Explicación: Un índice es una estructura auxiliar (típicamente B-Tree o Hash) que acelera las búsquedas, ordenamientos y uniones. Ejemplo: CREATE INDEX idx_cip ON Pacientes(CIP); permite buscar pacientes por CIP en tiempo logarítmico O(log n) en lugar de lineal O(n). Los índices ocupan espacio y ralentizan las inserciones, pero aceleran las consultas.

Pregunta 26

En SQL, un LEFT JOIN entre las tablas A y B devuelve:

A) Solo las filas que tienen correspondencia en ambas tablas
B) Todas las filas de A, y las correspondencias de B (NULL si no hay correspondencia)
C) Todas las filas de B, y las correspondencias de A (NULL si no hay correspondencia)
D) El producto cartesiano de A y B

Respuesta correcta: B

Explicación: LEFT JOIN devuelve TODAS las filas de la tabla izquierda (A), incluso si no tienen correspondencia en la tabla derecha (B). Ejemplo: PACIENTES LEFT JOIN CITAS ON PACIENTES.CIP = CITAS.CIP devuelve todos los pacientes, incluyendo aquellos SIN citas (con valores NULL en las columnas de CITAS).

Pregunta 27

La Forma Normal de Boyce-Codd (FNBC) es más restrictiva que la 3FN porque requiere que:

A) No haya dependencias parciales
B) No haya dependencias transitivas
C) Cada determinante sea una clave candidata
D) Todos los atributos sean atómicos

Respuesta correcta: C

Explicación: FNBC exige que para toda dependencia funcional X → Y, X debe ser una superclave (clave candidata o contenida en ella). Es más restrictiva que 3FN. Hay tablas en 3FN que no están en FNBC (casos raros con dependencias funcionales entre atributos clave). Ejemplo: si tienes (Profesor, Materia) → Aula y también Aula → Materia, hay problemas de dependencias cruzadas que FNBC elimina.

Pregunta 28

En SQL, la función agregada COUNT(*):

A) Cuenta solo las filas con valores no nulos
B) Cuenta el número total de filas en el resultado
C) Calcula la suma de todos los valores de una columna
D) Devuelve el valor máximo de una columna

Respuesta correcta: B

Explicación: COUNT(*) cuenta todas las filas, incluyendo aquellas con valores NULL en algunas columnas. COUNT(columna) cuenta solo filas con valores no nulos en esa columna. Ejemplo: SELECT COUNT(*) FROM Pacientes; devuelve el número total de pacientes (ej: 8.500.000 en Diraya).

Pregunta 29

¿Cuál de los siguientes NO es un nivel de aislamiento estándar en transacciones SQL?

A) READ UNCOMMITTED
B) READ COMMITTED
C) REPEATABLE READ
D) WRITE COMMITTED

Respuesta correcta: D

Explicación: Los niveles de aislamiento estándar SQL son: (1) READ UNCOMMITTED (lecturas sucias permitidas), (2) READ COMMITTED (solo lecturas confirmadas), (3) REPEATABLE READ (lecturas repetibles), (4) SERIALIZABLE (aislamiento total). "WRITE COMMITTED" no existe como nivel de aislamiento estándar. En el SAS, Diraya típicamente usa READ COMMITTED para balance entre consistencia y rendimiento.

Pregunta 30

En el modelo relacional, una clave candidata es:

A) Una clave foránea que puede convertirse en clave primaria
B) Un conjunto mínimo de atributos que identifica unívocamente cada tupla
C) Una clave primaria que se genera automáticamente
D) Un atributo que aparece en múltiples tablas

Respuesta correcta: B

Explicación: Una clave candidata es un conjunto de atributos que identifica unívocamente cada fila y es mínima (no se puede quitar ningún atributo sin perder la unicidad). Una tabla puede tener varias claves candidatas; una se elige como clave primaria, las demás son claves alternativas (alternate keys). Ejemplo: en PACIENTES, tanto CIP como NumSegSocial podrían ser claves candidatas (ambos identifican unívocamente al paciente).

📊 Evaluación de Resultados

  • 25-30 correctas (83-100%): ¡Excelente! Estás muy bien preparado. Sigue repasando los puntos débiles.
  • 20-24 correctas (67-80%): Buen nivel. Refuerza los conceptos de normalización, SQL avanzado y transacciones ACID.
  • 15-19 correctas (50-63%): Nivel aceptable, pero necesitas más estudio. Repasa las definiciones formales y practica SQL.
  • <15 correctas (<50%): Necesitas dedicar más tiempo a este tema. Empieza por las definiciones básicas y avanza gradualmente.

Consejo: Analiza tus errores. ¿Fallas en definiciones teóricas? ¿En SQL práctico? ¿En SGBD específicos del SAS? Adapta tu estudio según tus puntos débiles.

14. Estrategia de Estudio para Este Tema

Este tema es fundamental y recurrente en la oposición. No es de los que puedes estudiar por encima. El modelo relacional es la base de la mayoría de sistemas de información del SAS, y las preguntas sobre él aparecen en prácticamente todos los exámenes.

14.1. Planificación Temporal

Tiempo de estudio recomendado: 12-15 horas distribuidas en 2 semanas

📅 Planning Semanal Propuesto

Semana 1: Conceptos y Teoría

  • Día 1-2 (3-4h): Conceptos fundamentales (relación, tupla, atributo, dominio, claves). Arquitectura ANSI-SPARC. Leer apartados 1-2.
  • Día 3-4 (3-4h): Modelo E-R y transformación a relacional. Diseño de bases de datos. Leer apartado 3. Hacer ejercicios de transformación E-R → Relacional.
  • Día 5-7 (4-5h): Normalización (1FN, 2FN, 3FN, FNBC). Leer apartado 4. PRACTICAR con ejercicios de normalización (coge tablas desnormalizadas de ejemplos y normalízalas paso a paso).

Semana 2: SQL, SGBD y Práctica

  • Día 8-9 (3-4h): Álgebra relacional y SQL. Leer apartados 5-6. Escribir consultas SQL a mano (JOINs, GROUP BY, subconsultas).
  • Día 10-11 (3-4h): Integridad, transacciones ACID, restricciones. Leer apartados 7-8. Entender ON DELETE CASCADE vs RESTRICT.
  • Día 12-13 (3-4h): SGBD comerciales y open source (Oracle, PostgreSQL, MariaDB). Leer apartados 9-10. Memorizar qué SGBD usa cada sistema del SAS.
  • Día 14 (2h): SIMULACRO: Hacer el cuestionario de 30 preguntas sin mirar las respuestas. Cronometrar (60 minutos). Corregir y analizar errores.

14.2. Técnicas de Memorización

Este tema combina teoría formal (definiciones, propiedades) con práctica (SQL, normalización). Necesitas estrategias diferentes para cada parte:

Para Definiciones y Conceptos Teóricos:

  • Tarjetas Anki: Crea tarjetas con preguntas-respuestas.
    • Anverso: "¿Qué es una relación en el modelo relacional?"
    • Reverso: "Un subconjunto del producto cartesiano de dominios"
  • Acrónimos y Mnemotécnicos:
    • ACID: Atomicidad, Consistencia, Aislamiento (I), Durabilidad
    • 3 niveles ANSI: Externo, Conceptual, Interno (ECI = "es como imprescindible")
  • Mapas Mentales: Dibuja un mapa mental con el modelo relacional en el centro y ramas para: definiciones, arquitectura, diseño, normalización, SQL, SGBD. Usa colores y dibujos para facilitar la memoria visual.

Para Normalización y SQL (Habilidades Prácticas):

  • Práctica Mecánica: Normalizar tablas es una habilidad mecánica. Coge 10 tablas desnormalizadas y normalízalas paso a paso (0FN → 1FN → 2FN → 3FN). Repite hasta que lo hagas automáticamente.
  • Escribir SQL a Mano: No uses herramientas gráficas. Escribe consultas SELECT con JOINs, GROUP BY, HAVING, subconsultas... a mano en papel. En el examen no tendrás un IDE.
  • Explicar en Voz Alta: Coge una consulta SQL compleja y explícala en voz alta paso a paso: "Primero une PACIENTES con CITAS mediante un INNER JOIN en CIP, luego filtra por fecha >= hoy, luego agrupa por especialidad...". Esto refuerza la comprensión.

Para SGBD del SAS:

  • Tabla Resumen: Crea una tabla con los sistemas del SAS y sus SGBD:
    SistemaSGBDCriticidad
    DirayaOracle 19cCrítico
    BPSPostgreSQL 15Importante
    IntranetsMariaDB 10Departamental
    ClicSalud+ AppSQLiteEmbebido
  • Memoriza esta tabla. Es pregunta segura en el examen.

14.3. Errores Comunes a Evitar

  1. Confundir proyección (π) con selección (σ): Proyección selecciona COLUMNAS, selección filtra FILAS. No las confundas.
  2. Pensar que 1FN permite atributos multivaluados: ¡NO! La 1FN exige atributos atómicos. Si tienes "Alergias: Penicilina, Polen", NO está en 1FN.
  3. Creer que UNIQUE permite múltiples NULL: Depende del SGBD. SQL estándar permite múltiples NULL en columnas UNIQUE, pero algunos SGBD (SQL Server antiguo) no. En el examen, asume el estándar (permite NULL).
  4. Mezclar dependencias parciales (2FN) con transitivas (3FN): Parcial = depende de PARTE de la clave compuesta. Transitiva = depende de otro atributo no clave (A → B → C).
  5. Confundir INNER JOIN con LEFT JOIN: INNER devuelve solo coincidencias. LEFT devuelve TODAS las filas de la tabla izquierda (con NULL si no hay coincidencia).
  6. Olvidar que ON DELETE CASCADE borra en cascada: Si borras un paciente con ON DELETE CASCADE en CITAS, se borran TODAS sus citas. Si no quieres eso, usa RESTRICT.

14.4. Conexión con Otros Temas del Temario

Este tema NO está aislado. Se conecta con:

  • Tema 33: Sistemas de Gestión de Bases de Datos (SGBD): Profundiza en arquitecturas, motores, transacciones. El Tema 34 (modelo relacional) es la base teórica, el Tema 33 es la implementación práctica.
  • Tema 35-38: Seguridad (ENS, RGPD): Las restricciones de integridad, los permisos (GRANT/REVOKE), la auditoría de accesos... todo se implementa en bases de datos relacionales.
  • Tema 42: Sistemas de Información del SAS: Diraya, BPS, InterSAS... todos usan bases de datos relacionales. Entender el modelo relacional te ayuda a entender cómo funcionan estos sistemas.
  • Tema 14-20: Desarrollo de Software: Si participas en desarrollo de aplicaciones (Tema 18-20), necesitarás diseñar modelos de datos (E-R → Relacional → SQL).

Cuando estudies estos temas, recuerda lo aprendido en el Tema 34. Todo está interconectado.

14.5. Recursos Adicionales de Estudio

Además de este tema, te recomiendo:

  • Libros de Bases de Datos:
    • "Fundamentos de Bases de Datos" (Elmasri & Navathe) - Capítulos 3-9 (modelo relacional, normalización, SQL)
    • "Database System Concepts" (Silberschatz, Korth, Sudarshan) - Capítulos 2-7
  • Documentación Oficial:
    • Oracle 19c Documentation (docs.oracle.com) - SQL Language Reference
    • PostgreSQL 15 Documentation (postgresql.org) - Tutorial, SQL Language
  • Ejercicios Prácticos:
    • SQLZoo (sqlzoo.net) - Tutoriales interactivos de SQL
    • LeetCode Database (leetcode.com/problemset/database/) - Problemas de SQL con soluciones
  • Preguntas de Exámenes Anteriores del SAS:
    • Examen TFA-STI 2019 (preguntas 15-18, 22-25 sobre bases de datos)
    • Examen TFA-STI 2023 (preguntas 12-16, 20-23 sobre SQL y normalización)

14.6. Consejo Final

El modelo relacional es la base de TODO lo que harás como Técnico Especialista en Informática en el SAS. No lo estudies solo para aprobar el examen. Entiéndelo de verdad, practica SQL, normaliza tablas, diseña modelos de datos. Cuanto mejor lo domines, más efectivo serás en tu trabajo diario.

Y recuerda: la oposición es una maratón, no un sprint. Este tema requiere 12-15 horas de estudio repartidas en 2 semanas. No intentes aprenderlo todo en un día. Dedica tiempo cada día, repasa regularmente, y llegarás al examen con confianza.

¡Adelante! La plaza está más cerca de lo que crees. 💪

15. Referencias Normativas y Bibliográficas

15.1. Estándares Internacionales

  • ISO/IEC 9075:2023 - SQL (Structured Query Language): Estándar internacional del lenguaje SQL. Partes 1-14 (Foundation, SQL/Foundation, SQL/CLI, SQL/PSM, SQL/MED, SQL/OLB, SQL/Schemata, SQL/JRT, SQL/XML, SQL/MDA, SQL/PGQ, SQL/PROP, SQL/RPR, SQL/MDA).
  • ISO/IEC 2382-8:1998 - Database Management Systems: Vocabulario de sistemas de gestión de bases de datos.
  • ANSI-SPARC Architecture (1975): Arquitectura de tres niveles para sistemas de bases de datos (estándar de facto, no formal).

15.2. Bibliografía Técnica de Referencia

  • Codd, E.F. (1970). "A Relational Model of Data for Large Shared Data Banks". Communications of the ACM, 13(6), 377-387. [Artículo fundacional del modelo relacional]
  • Elmasri, R., & Navathe, S. (2015). "Fundamentos de Sistemas de Bases de Datos" (7ª ed.). Pearson Education. [Capítulos 3-9: Modelo relacional, diseño, normalización, SQL]
  • Silberschatz, A., Korth, H.F., & Sudarshan, S. (2019). "Database System Concepts" (7th ed.). McGraw-Hill. [Capítulos 2-7: Introducción, modelo relacional, SQL, diseño]
  • Date, C.J. (2003). "An Introduction to Database Systems" (8th ed.). Addison-Wesley. [Referencia clásica, muy completa]
  • Connolly, T., & Begg, C. (2014). "Database Systems: A Practical Approach" (6th ed.). Pearson. [Enfoque práctico con casos de estudio]

15.3. Documentación de SGBD

  • Oracle Database 19c Documentation: docs.oracle.com
    • SQL Language Reference
    • Database Concepts
    • Administrator's Guide
  • PostgreSQL 15 Documentation: postgresql.org/docs/15/
    • Tutorial
    • SQL Language
    • Server Administration
  • MariaDB 10 Documentation: mariadb.com/kb/en/
    • SQL Statements
    • Built-in Functions
    • Optimization and Tuning

15.4. Normativa y Estrategias del SAS

  • Plan de Transformación Digital del SSPA 2022-2027: Estrategia de migración a cloud híbrido, modernización de sistemas, adopción de tecnologías open source.
  • Política de Seguridad de Tecnologías de la Información y Comunicaciones del SAS: Incluye requisitos de seguridad para bases de datos (cifrado, control de acceso, auditoría).
  • Catálogo de Servicios TIC del SAS: Incluye servicios de bases de datos gestionadas (Oracle, PostgreSQL).
  • Esquema Nacional de Seguridad (ENS) - RD 311/2022: Medidas de seguridad aplicables a bases de datos (control de acceso, auditoría, cifrado, copias de seguridad).
  • RGPD (Reglamento UE 2016/679) y LOPDGDD (LO 3/2018): Protección de datos de salud (categoría especial) en bases de datos.

15.5. Recursos Online

  • SQLZoo: sqlzoo.net - Tutoriales interactivos de SQL
  • W3Schools SQL Tutorial: w3schools.com/sql/
  • PostgreSQL Tutorial: postgresqltutorial.com
  • Oracle Live SQL: livesql.oracle.com - Entorno SQL online de Oracle
  • Database Design Tutorial: vertabelo.com/blog/database-design-tutorial/

15.6. Artículos y Publicaciones Relevantes

  • Codd, E.F. (1974). "Recent Investigations in Relational Data Base Systems". Proceedings of IFIP Congress, 1017-1021.
  • Bernstein, P.A. (1976). "Synthesizing Third Normal Form Relations from Functional Dependencies". ACM TODS, 1(4), 277-298.
  • Fagin, R. (1977). "Multivalued Dependencies and a New Normal Form for Relational Databases". ACM TODS, 2(3), 262-278. [Sobre 4FN]
  • Gray, J., & Reuter, A. (1992). "Transaction Processing: Concepts and Techniques". Morgan Kaufmann. [Referencia sobre ACID y transacciones]

16. Etiquetas SEO y Palabras Clave

Palabras clave principales para este tema:

  • modelo relacional bases de datos
  • Edgar Codd teoría relacional
  • normalización 1FN 2FN 3FN FNBC
  • SQL estándar ISO/IEC 9075
  • arquitectura ANSI-SPARC tres niveles
  • transacciones ACID atomicidad consistencia aislamiento durabilidad
  • modelo entidad-relación E-R
  • álgebra relacional proyección selección join
  • integridad referencial claves foráneas
  • Oracle Database 19c SAS Diraya
  • PostgreSQL 15 BPS SAS
  • SGBD open source comerciales
  • dependencias funcionales normalización
  • diseño bases de datos sanitarias
  • oposición técnico especialista informática SAS
  • bases de datos Servicio Andaluz Salud
  • SQL SELECT INSERT UPDATE DELETE
  • DDL DML DCL TCL SQL
  • índices B-Tree optimización consultas
  • historia clínica digital Diraya SSPA

Long-tail keywords (frases de búsqueda específicas):

  • "diferencia entre 2FN y 3FN normalización bases de datos"
  • "arquitectura ANSI-SPARC independencia datos"
  • "propiedades ACID transacciones bases de datos"
  • "transformar modelo entidad-relación a tablas relacionales"
  • "ON DELETE CASCADE vs RESTRICT SQL"
  • "diferencia INNER JOIN LEFT JOIN SQL"
  • "SGBD Oracle vs PostgreSQL ventajas desventajas"
  • "bases de datos SAS Diraya InterSAS BPS"
  • "normalización bases de datos sanitarias RGPD"
  • "preparación oposición técnico informática SAS bases de datos"