Vamos a dedicarle un poco de tiempo a repasar lo que ya hemos visto. Paso a paso, vamos a desmenuzar todo lo que pasa aquí. Más adelante habrá un montón de cosas que se basan en esto, así que mejor que lo tengas clarísimo y sepas qué hace cada comando.
Repasemos de nuevo nuestro ejemplo con estudiantes y cursos. Desde el principio. Desde la creación de las tablas hasta entender qué pasa en cada paso. ¿Listo?
Ahora vamos a crear la tabla students, que va a guardar info sobre los estudiantes, y la vamos a conectar con la tabla courses usando una clave foránea. Así vas a ver cómo se usan las claves foráneas para modelar relaciones entre entidades.
Creando la tabla students
La tabla students va a guardar info sobre los estudiantes: su identificador único, nombre y fecha de nacimiento. La vamos a crear usando el comando CREATE TABLE.
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- Clave única para cada registro
name TEXT NOT NULL, -- Nombre del estudiante (campo obligatorio)
birth_date DATE -- Fecha de nacimiento del estudiante
);
¿Qué está pasando aquí?
student_id SERIAL PRIMARY KEY: Es el identificador único para cada estudiante. El tipoSERIALcrea un campo autoincremental, yPRIMARY KEYasegura que el identificador sea único para cada fila.name TEXT NOT NULL: Campo para el nombre del estudiante. PonemosNOT NULLpara que no se pueda insertar ningún registro sin nombre.birth_date DATE: Campo para guardar la fecha de nacimiento. El tipo de datoDATEnos ayuda a trabajar con fechas.
Si la tabla fuera una persona, student_id sería su DNI, name es el nombre obvio, y birth_date eso que a veces escondemos, pero para la base de datos es importante.
Creando la tabla courses
Ahora vamos a crear la tabla que guarda info sobre los cursos. Va a tener el identificador del curso, su nombre y una descripción.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Identificador único del curso
title TEXT NOT NULL, -- Nombre del curso (campo obligatorio)
description TEXT -- Descripción del curso
);
¿Qué está pasando aquí?
course_id SERIAL PRIMARY KEY: Igual que antes, es un campo autoincremental que crea un identificador único para cada curso.title TEXT NOT NULL: Campo para el nombre del curso. PonemosNOT NULLporque es lógico que todo curso tenga nombre.description TEXT: Campo para una breve descripción del curso. Es opcional, puede estar vacío (sinNOT NULL).
Un curso sin nombre es como un libro sin portada. ¡Pero la base de datos no lo va a permitir!
Relacionando la tabla students con la tabla courses
Ahora imagina que cada estudiante solo puede estar inscrito en un curso. Para eso, vamos a añadir una clave foránea en la tabla courses que apunte al identificador del estudiante en la tabla students.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Identificador único del curso
title TEXT NOT NULL, -- Nombre del curso (campo obligatorio)
description TEXT, -- Descripción del curso
student_id INT REFERENCES students(student_id) -- Clave foránea que conecta con la tabla students
);
¿Qué hace student_id INT REFERENCES students(student_id)?
- Creamos el campo
student_id, que será un enlace al identificador único del estudiante (student_id) en la tablastudents. - La relación entre tablas se establece con la palabra clave
REFERENCES. - Esto significa que cada vez que insertes datos en
courses, el valor destudent_iddebe existir en la tablastudents. Si, por ejemplo, intentas inscribir a un estudiante con unstudent_idque no existe, te dará error.
Insertando datos en las tablas
Cuando ya tienes las tablas, vamos a meter algunos estudiantes y cursos. Porque estar en un aula vacía es un rollo, ¿no?
Añadiendo estudiantes
INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');
Añadiendo cursos
INSERT INTO courses (title, description, student_id) VALUES
('Fundamentos de SQL', 'Aprendiendo la sintaxis básica de SQL', 1),
('Bases de datos relacionales', 'Entendiendo los modelos relacionales', 2),
('PostgreSQL para principiantes', 'Instalación y configuración de PostgreSQL', 3);
Indicamos el student_id para cada curso, conectándolo con el identificador del estudiante en la tabla students.
Comprobando la relación entre las tablas
Ahora vamos a asegurarnos de que nuestras tablas realmente están conectadas. Para eso, vamos a hacer una consulta que muestre info de los cursos junto con los nombres de los estudiantes.
SELECT
courses.title AS course_title,
courses.description AS course_description,
students.name AS student_name
FROM
courses
JOIN
students ON courses.student_id = students.student_id;
Ejemplo de resultado: Resultado de la consulta:
| course_title | course_description | student_name |
|---|---|---|
| Fundamentos de SQL | Aprendiendo la sintaxis básica de SQL | Alex Lin |
| Bases de datos relacionales | Entendiendo los modelos relacionales | Maria Chi |
| PostgreSQL para principiantes | Instalación y configuración de PostgreSQL | Otto Song |
Hemos conectado los cursos con los estudiantes usando la clave foránea — y ahora podemos obtener datos relacionados en una sola consulta. ¡Así funciona el modelo relacional!
Resumen
Espero que todo lo que acabamos de ver te haya quedado claro y sencillo. Porque pronto vamos a avanzar, y me gustaría que tengas confianza en lo que sabes.
GO TO FULL VERSION