Ejemplo : Control de Vehículos y Mantenimientos en PostgreSQL
Pregunta
Se desea diseñar una Base de Datos para llevar un cierto control de los vehículos de una empresa de transporte y sus mantenimientos.
Los datos significativos a tener en cuenta son:
- Un vehículo se define por su código único, matrícula, marca y año de fabricación.
- Los mantenimientos tienen un código de mantenimiento, tipo de mantenimiento y fecha de realización.
- Un vehículo puede recibir varios mantenimientos, y un mantenimiento puede aplicarse a varios vehículos, siendo significativa la fecha de realización y el costo del mantenimiento.
Las preguntas a resolver son las siguientes:
- A) Crear el diagrama SQL de las tablas.
- B) Insertar y visualizar datos.
- C) Visualizar datos de diferentes tablas (SELECT con INNER JOIN, WHERE).
- D) Modificar todos los registros en una tabla y un registro específico.
- E) Modificar un registro y eliminar registros de una tabla.
Descripción
Para implementar esta gestión de vehículos y mantenimientos, configuraremos una base de datos que permite:
- Almacenar los datos de cada vehículo, como código único, matrícula, marca y año de fabricación.
- Registrar los datos de cada mantenimiento, incluyendo el tipo y fecha de realización.
- Asociar múltiples mantenimientos a un vehículo, y viceversa, registrando la fecha y el costo de cada mantenimiento.
A) Crear el Diagrama SQL (Tablas y Relaciones)
Para modelar esta relación muchos a muchos entre vehículos y mantenimientos, crearemos tres tablas:
- Vehiculo: almacena información de cada vehículo.
- Mantenimiento: almacena información de cada mantenimiento.
- RegistroMantenimiento: una tabla de relación que asocia vehículos con mantenimientos, incluyendo información adicional como la fecha y el costo del mantenimiento.
-- Crear la tabla Vehiculo
CREATE TABLE Vehiculo (
id_vehiculo SERIAL PRIMARY KEY,
matricula VARCHAR(10) UNIQUE NOT NULL,
marca VARCHAR(50) NOT NULL,
ano INT NOT NULL CHECK (ano > 1900)
);
-- Crear la tabla Mantenimiento
CREATE TABLE Mantenimiento (
id_mantenimiento SERIAL PRIMARY KEY,
tipo_mantenimiento VARCHAR(100) NOT NULL,
descripcion TEXT,
fecha DATE NOT NULL
);
-- Crear la tabla RegistroMantenimiento (relación muchos a muchos)
CREATE TABLE RegistroMantenimiento (
id_vehiculo INT REFERENCES Vehiculo(id_vehiculo),
id_mantenimiento INT REFERENCES Mantenimiento(id_mantenimiento),
fecha_realizacion DATE DEFAULT CURRENT_DATE,
costo NUMERIC(10, 2),
PRIMARY KEY (id_vehiculo, id_mantenimiento, fecha_realizacion)
);
B) Insertar y Visualizar Datos
Insertamos algunos datos de ejemplo para vehículos, mantenimientos y registros en RegistroMantenimiento, que muestra los mantenimientos realizados a cada vehículo.
-- Insertar datos en Vehiculo
INSERT INTO Vehiculo (matricula, marca, ano)
VALUES
('ABC123', 'Toyota', 2015),
('XYZ789', 'Ford', 2018),
('LMN456', 'Honda', 2020);
-- Insertar datos en Mantenimiento
INSERT INTO Mantenimiento (tipo_mantenimiento, descripcion, fecha)
VALUES
('Cambio de aceite', 'Cambio de aceite de motor', '2024-03-01'),
('Revisión general', 'Revisión completa del vehículo', '2024-03-10'),
('Cambio de frenos', 'Sustitución de pastillas de freno', '2024-04-05');
-- Registrar mantenimientos en la tabla RegistroMantenimiento
INSERT INTO RegistroMantenimiento (id_vehiculo, id_mantenimiento, fecha_realizacion, costo)
VALUES
(1, 1, '2024-03-02', 50.00), -- Toyota recibe Cambio de aceite
(1, 2, '2024-03-11', 150.00), -- Toyota recibe Revisión general
(2, 1, '2024-03-15', 60.00), -- Ford recibe Cambio de aceite
(3, 3, '2024-04-06', 200.00); -- Honda recibe Cambio de frenos
C) Visualizar Datos de Diferentes Tablas (INNER JOIN y WHERE)
Para ver qué mantenimientos ha recibido cada vehículo, hacemos una consulta con INNER JOIN entre las tablas Vehiculo, Mantenimiento, y RegistroMantenimiento:
SELECT
v.matricula AS vehiculo_matricula,
v.marca AS marca_vehiculo,
m.tipo_mantenimiento,
r.fecha_realizacion,
r.costo
FROM
RegistroMantenimiento r
JOIN
Vehiculo v ON r.id_vehiculo = v.id_vehiculo
JOIN
Mantenimiento m ON r.id_mantenimiento = m.id_mantenimiento
ORDER BY
v.matricula, r.fecha_realizacion;
D) Modificar Todos los Registros en una Tabla y un Registro Específico
Realizamos actualizaciones en los datos de las tablas:
1. Modificar todos los registros en una tabla
Ejemplo: Incrementar el costo de todos los mantenimientos en un 10%:
UPDATE RegistroMantenimiento
SET costo = costo * 1.1;
2. Modificar un registro específico
Ejemplo: Cambiar la marca de un vehículo específico:
UPDATE Vehiculo
SET marca = 'Toyota Motors'
WHERE matricula = 'ABC123';
E) Modificar un Registro y Eliminar Registros de una Tabla
1. Modificar un registro
Cambiar la descripción de un mantenimiento específico:
UPDATE Mantenimiento
SET descripcion = 'Revisión completa con diagnóstico'
WHERE tipo_mantenimiento = 'Revisión general';
2. Eliminar registros
Eliminar todos los registros de mantenimiento para un vehículo específico:
DELETE FROM RegistroMantenimiento
WHERE id_vehiculo = 1;
Resumen
Con estas consultas y el diseño de la base de datos, hemos cubierto las operaciones necesarias para gestionar la relación entre vehículos y mantenimientos en PostgreSQL, incluyendo inserciones, consultas con JOIN, y modificaciones.