Está en la página 1de 14

UNIVERSIDAD DE CARTAGENA - CENTRO TUTORIAL MOMPÓS

FACULTAD DE INGENIERÍA

PROGRAMA DE INGENIERÍA DE SOFTWARE

QUINTO SEMESTRE

BASE DE DATOS II

ACTIVIDAD DE APRENDIZAJE 3

TUTOR

MARIO CORPAS

INTEGRANTES

DUVAN PEREZ TORRES

JHON MARIO LOPEZ ORTIZ

TITO MANUEL

MOMPÓS, BOLÍVAR, COLOMBIA

20 DE FEBRERO DEL 2023


Presentación y objetivos

La actividad No3, consta de dos preguntas; la primera sobre diseño e implementación, la


segunda sobre manipulación de datos (incluye consultas SQL).

1. Diseño e implementación.
Nos disponemos a diseñar una base de datos para almacenar información sobre
el servicio de tickets restaurant que utilizan algunas empresas para las comidas
de los empleados durante su jornada laboral. Para ello, la base de datos
contendrá información sobre los tipos de vales de restaurante que se utilizan.

Las empresas se identifican con el CIF y todas tienen un nombre único identificador.

Los restaurantes se identifican con el nombre. De ellos guardaremos la dirección,


el preció del menú (si lo ofrecen) y el detalle de la posible especialidad de cocina
que tienen de entre las diversas posibles.

Existen diferentes tipos de vales y dada uno de ellos tiene una denominación
distinta. Todos los vales son aceptados en todos los restaurantes y se quiere
registrar el uso de estos como medio de pago de las comidas de los empleados.
Nos interesa también guardar el precio de cada tipo de vale y qué empresas
utilizan cada tipo de vale.

Los restaurantes pueden tener contratados camareros. Un camarero no puede


estar contratado por más de un restaurante y entre los camareros de un
restaurante hay que pueden considerarse sustitutos los unos de los otros. Existen
algunos camareros que pueden ejercer de 'maître' en el restaurant donde
trabajan. En un restaurant únicamente puede haber un maître.

Los empleados de las empresas pueden ser contratados por unos periodos de
tiempo determinados para su especialidad laboral y nos interesa tener constancia
de dicho histórico. Tanto la especialidad con la descripción de los estudios que le
corresponde se especificará textualmente. Un empleado puede tener diversas
especialidades laborales.

De tota persona que trabaja en una empresa o que hace de camarero se desean
almacenar los siguientes datos; el nombre, el apellido, la calle donde vive, el
código postal correspondiente, la fecha de nacimiento, la fecha de defunción (si
existe) y el género.
Respuesta:

Para diseñar la base de datos que almacena la información sobre el servicio de tickets
restaurant, se pueden utilizar las siguientes tablas:

1. Empresa: almacena información sobre las empresas que utilizan el servicio de


tickets restaurant.

 CIF (clave primaria)

 Nombre

2. Restaurante: almacena información sobre los restaurantes.

 Nombre (clave primaria)

 Dirección

 Precio del menú

 Especialidad de cocina

3. Vale: almacena información sobre los tipos de vales de restaurante.

 Denominación (clave primaria)

 Precio

 Empresas que utilizan el tipo de vale (clave foránea a la tabla Empresa)

4. Camarero: almacena información sobre los camareros de los restaurantes.

 ID (clave primaria)

 Nombre

 Apellido

 Dirección

 Código postal

 Fecha de nacimiento

 Fecha de defunción

 Género

 Restaurante donde trabaja (clave foránea a la tabla Restaurante)

 Maître (booleano que indica si el camarero es maître o no)

 Camarero sustituto (clave foránea a la tabla Camarero, permite que un


camarero sustituya a otro en caso de necesidad)

5. Empleado: almacena información sobre los empleados de las empresas.


 ID (clave primaria)

 Nombre

 Apellido

 Dirección

 Código postal

 Fecha de nacimiento

 Fecha de defunción

 Género

 Empresa donde trabaja (clave foránea a la tabla Empresa)

6. Especialidad: almacena información sobre las especialidades laborales de los


empleados.

 ID (clave primaria)

 Descripción de la especialidad

 Estudios correspondientes

7. HistorialEmpleado: almacena información sobre el histórico laboral de los


empleados.

 ID_Empleado (clave foránea a la tabla Empleado)

 ID_Especialidad (clave foránea a la tabla Especialidad)

 Fecha de inicio del periodo laboral

 Fecha de fin del periodo laboral (puede ser nulo si el empleado sigue
trabajando en la empresa)

Con estas tablas, se pueden almacenar todos los datos necesarios para el servicio de
tickets restaurant. Se pueden utilizar claves foráneas para establecer las relaciones entre
las tablas. Por ejemplo, la tabla Vale tiene una clave foránea a la tabla Empresa para indicar
qué empresas utilizan cada tipo de vale. De esta forma, se pueden realizar consultas que
relacionen los datos de distintas tablas, como, por ejemplo, obtener qué empresas utilizan
cada tipo de vale.

Se pide:

a. Realizad el diagrama entidad/relación para la base de datos que dará soporte al


sistema informático que almacenará todos los datos, según el modelo descrito (se
deben incluir exclusivamente las entidades y relaciones básicas que se pueden extraer
del enunciado).

Respuesta:
b. Realizad la transformación del modelo ER al modelo relacional. Cread claves
identificadoras sintéticas siempre que lo creáis necesario.

NOTA: Las tablas que se piden crear/cargar en el segundo ejercicio deben servir para
comprobar la idoneidad de las entidades, atributos y relaciones aquí propuestas (por
coherencia, se pide conservar el nombre de las tablas que existen en el segundo ejercicio).

Respuesta:

se muestra la transformación del modelo entidad-relación (ER) al modelo relacional,


teniendo en cuenta las entidades y relaciones básicas descritas en el enunciado:

 EMPRESA(CIF (PK), nombre)

 RESTAURANTE(nombre (PK), direccion, precio_menu, especialidad)

 VALE(denominacion (PK), precio)

 UTILIZA(CIF_empresa (PK, FK), denominacion_vale (PK, FK))

 CAMARERO(dni (PK), nombre, apellido, calle, codigo_postal, fecha_nacimiento,


fecha_defuncion, genero, nombre_restaurante (FK))

 MAITRE(dni_camarero (PK, FK))

 ESPECIALIDAD(descripcion_especialidad (PK))

 CONTRATO(dni_empleado (PK, FK), descripcion_especialidad (PK, FK),


fecha_inicio (PK), fecha_fin)

Donde:

 (PK) indica que el atributo es clave primaria.

 (FK) indica que el atributo es clave foránea y hace referencia a la clave primaria de
otra tabla.

Se han agregado las claves foráneas necesarias para representar las relaciones entre las
entidades, y se han creado claves identificadoras sintéticas solo cuando fue necesario para
garantizar la unicidad de las filas en las tablas.

Cabe destacar que no se han incluido las relaciones "sustituto" entre los camareros ni la
relación entre los empleados y los vales utilizados para pagar sus comidas, ya que no se
especificaron en el enunciado.

A continuación, se muestran las tablas resultantes y sus correspondientes sentencias SQL


para crearlas:

CREATE TABLE EMPRESA (


CIF VARCHAR(20) PRIMARY KEY,
nombre VARCHAR(50)
);

CREATE TABLE RESTAURANTE (


nombre VARCHAR(50) PRIMARY KEY,
direccion VARCHAR(100),
precio_menu DECIMAL(8,2),
especialidad VARCHAR(50)
);

CREATE TABLE VALE (


denominacion VARCHAR(50) PRIMARY KEY,
precio DECIMAL(8,2)
);

CREATE TABLE UTILIZA (


CIF_empresa VARCHAR(20),
denominacion_vale VARCHAR(50),
PRIMARY KEY (CIF_empresa, denominacion_vale),
FOREIGN KEY (CIF_empresa) REFERENCES EMPRESA (CIF),
FOREIGN KEY (denominacion_vale) REFERENCES VALE (denominacion)
);

CREATE TABLE CAMARERO (


dni VARCHAR(20) PRIMARY KEY,
nombre VARCHAR(50),
apellido VARCHAR(50),
calle VARCHAR(100),
codigo_postal VARCHAR(10),
fecha_nacimiento DATE,
fecha_defuncion DATE,
genero VARCHAR(1),
nombre_restaurante VARCHAR(50),
FOREIGN KEY (nombre_restaurante) REFERENCES RESTAURANTE (nombre)
);

CREATE TABLE MAITRE (


dni_camarero VARCHAR(20) PRIMARY KEY,
FOREIGN KEY (dni_camarero) REFERENCES CAMARERO (dni)
);

CREATE TABLE ESPECIALIDAD (


descripcion_especialidad VARCHAR(50) PRIMARY KEY
);

CREATE TABLE CONTRATO (


dni_empleado VARCHAR(20),
descripcion_especialidad VARCHAR(50),
fecha_inicio DATE,
fecha_fin DATE,
PRIMARY KEY (dni_empleado, descripcion_especialidad, fecha_inicio),
FOREIGN KEY (dni_empleado) REFERENCES CAMARERO (dni),
FOREIGN KEY (descripcion_especialidad) REFERENCES ESPECIALIDAD
(descripcion_especialidad)
);
c.Cread las tablas según atributos, claves (primarias y foráneas) y restricciones que
se entrevean en el SCHEMA, según las creadas en el modelo relacional.

Respuesta:
CREATE TABLE Empresa (
CIF CHAR(9) PRIMARY KEY,
nombre VARCHAR(255) UNIQUE NOT NULL
);

CREATE TABLE Restaurante (


nombre VARCHAR(255) PRIMARY KEY,
direccion VARCHAR(255) NOT NULL,
precio_menu DECIMAL(10, 2),
especialidad VARCHAR(255) NOT NULL
);

CREATE TABLE TipoVale (


denominacion VARCHAR(255) PRIMARY KEY,
precio DECIMAL(10, 2) NOT NULL
);

CREATE TABLE ValeUtilizado (


id SERIAL PRIMARY KEY,
id_tipo_vale VARCHAR(255) NOT NULL,
CIF_empresa CHAR(9) NOT NULL,
fecha DATE NOT NULL,
FOREIGN KEY (id_tipo_vale) REFERENCES TipoVale (denominacion),
FOREIGN KEY (CIF_empresa) REFERENCES Empresa (CIF)
);

CREATE TABLE Empleado (


id SERIAL PRIMARY KEY,
nombre VARCHAR(255) NOT NULL,
apellido VARCHAR(255) NOT NULL,
calle VARCHAR(255) NOT NULL,
codigo_postal CHAR(5) NOT NULL,
fecha_nacimiento DATE NOT NULL,
fecha_defuncion DATE,
genero CHAR(1) NOT NULL
);

CREATE TABLE Contrato (


id SERIAL PRIMARY KEY,
id_empleado INTEGER NOT NULL,
CIF_empresa CHAR(9) NOT NULL,
fecha_inicio DATE NOT NULL,
fecha_fin DATE NOT NULL,
especialidad VARCHAR(255) NOT NULL,
FOREIGN KEY (id_empleado) REFERENCES Empleado (id),
FOREIGN KEY (CIF_empresa) REFERENCES Empresa (CIF)
);

CREATE TABLE Camarero (


id_empleado INTEGER PRIMARY KEY,
id_restaurante VARCHAR(255) NOT NULL,
es_maitre BOOLEAN NOT NULL,
FOREIGN KEY (id_empleado) REFERENCES Empleado (id),
FOREIGN KEY (id_restaurante) REFERENCES Restaurante (nombre)
);

CREATE TABLE Sustituto (


id_camarero INTEGER NOT NULL,
id_sustituto INTEGER NOT NULL,
PRIMARY KEY (id_camarero, id_sustituto),
FOREIGN KEY (id_camarero) REFERENCES Camarero (id_empleado),
FOREIGN KEY (id_sustituto) REFERENCES Camarero (id_empleado)
);

CREATE TABLE Maître (


id_empleado INTEGER NOT NULL,
id_restaurante VARCHAR(255) NOT NULL,
PRIMARY KEY (id_empleado, id_restaurante),
FOREIGN KEY (id_empleado) REFERENCES Empleado (id),
FOREIGN KEY (id_restaurante) REFERENCES Restaurante (nombre)
);

CREATE TABLE Especialidad (


id SERIAL PRIMARY KEY,
descripcion VARCHAR(255) UNIQUE NOT NULL
);

CREATE TABLE EmpleadoEspecialidad (


id_empleado INTEGER NOT NULL,
id_especialidad INTEGER NOT NULL,
PRIMARY KEY (id_empleado, id_especialidad),
FOREIGN KEY (id_empleado) REFERENCES Empleado (id),
FOREIGN KEY (id_especialidad) REFERENCES Especialidad (id)
);

CREATE TABLE CambioVale (


id SERIAL PRIMARY KEY,
id_tipo_vale VARCHAR(255) NOT NULL,
fecha DATE NOT NULL,
FOREIGN KEY (id_tipo_vale) REFERENCES TipoVale (denominacion)
);

Además, se pueden agregar restricciones adicionales a las tablas para garantizar la


integridad de los datos. A continuación, se muestran algunas restricciones posibles.

NOTA: No utilicéis herramientas de generación automática de código. No declaréis las


restricciones a posteriori (no utilicéis ALTER TABLE para añadir restricciones después
de la creación de las tablas). Dad nombre a todas las restricciones. Indentad/tabulad el
código SQL para que sea muy legible (mostrad un único campo por línea).

INDICACIONES: Utilizad claves primarias sintéticas para la tabla que contendrá los
datos de las especialidades y para el identificador de la tabla donde se almacenan los
tickets cambiados. Cread concretamente estos campos cómo tipo 'SERIAL'.

RESTRICCIONES A TENER EN CUENTA OBLIGATORIAMENTE AL CREAR LAS


TABLAS:
- Un camarero únicamente puede ser maître del restaurante donde trabaja.
- De estar informada la fecha de defunción de una persona, ha de ser posterior a
la de nacimiento.
- El nombre y los apellidos de una persona siempre han de estar informados.
- El género de una persona puede no estar informado, pero de estarlo, deberá
contener una H o una M.

2. CREACIÓN DE LAS TABLAS:


Implementar sentencias Sql, para la creación de tablas.

Ejercicio voluntario:

Repetid las sentencias de creación de las tablas con la sintaxis SQL de MySQL/MariaDB,
utilizando InnoDB.

Respuesta:

CREATE TABLE company (


cif CHAR(9) NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (cif)
) ENGINE=InnoDB;

CREATE TABLE restaurant (


name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL,
menu_price DECIMAL(8, 2),
specialty VARCHAR(255),
PRIMARY KEY (name)
) ENGINE=InnoDB;

CREATE TABLE waiter (


id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
surname VARCHAR(255) NOT NULL,
restaurant_name VARCHAR(255) NOT NULL,
is_maître BOOLEAN,
PRIMARY KEY (id),
FOREIGN KEY (restaurant_name)
REFERENCES restaurant(name)
ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE voucher (


denomination VARCHAR(255) NOT NULL,
price DECIMAL(8, 2) NOT NULL,
PRIMARY KEY (denomination)
) ENGINE=InnoDB;

CREATE TABLE voucher_company (


voucher_denomination VARCHAR(255) NOT NULL,
company_cif CHAR(9) NOT NULL,
PRIMARY KEY (voucher_denomination, company_cif),
FOREIGN KEY (voucher_denomination)
REFERENCES voucher(denomination)
ON DELETE CASCADE,
FOREIGN KEY (company_cif)
REFERENCES company(cif)
ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE employee (


id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
surname VARCHAR(255) NOT NULL,
street VARCHAR(255) NOT NULL,
postal_code CHAR(5) NOT NULL,
birth_date DATE NOT NULL,
death_date DATE,
gender CHAR(1) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE employee_specialty (


employee_id INT NOT NULL,
specialty_description VARCHAR(255) NOT NULL,
PRIMARY KEY (employee_id, specialty_description),
FOREIGN KEY (employee_id)
REFERENCES employee(id)
ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE company_employee (


company_cif CHAR(9) NOT NULL,
employee_id INT NOT NULL,
start_date DATE NOT NULL,
end_date DATE,
PRIMARY KEY (company_cif, employee_id, start_date),
FOREIGN KEY (company_cif)
REFERENCES company(cif)
ON DELETE CASCADE,
FOREIGN KEY (employee_id)
REFERENCES employee(id)
ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE ticket (


id INT NOT NULL AUTO_INCREMENT,
employee_id INT NOT NULL,
voucher_denomination VARCHAR(255) NOT NULL,
restaurant_name VARCHAR(255) NOT NULL,
date DATE NOT NULL,
amount DECIMAL(8, 2) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (employee_id)
REFERENCES employee(id)
ON DELETE CASCADE,
FOREIGN KEY (voucher_denomination)
REFERENCES voucher(denomination)
ON DELETE CASCADE,
FOREIGN KEY (restaurant_name)
REFERENCES restaurant(name)
ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE exchanged_ticket (


id INT NOT NULL AUTO_INCREMENT,
ticket_id INT NOT NULL,
exchanged_for VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (ticket_id)
REFERENCES ticket(id)
ON DELETE CASCADE
) ENGINE=InnoDB;

Manipulación y consultas

Para probar la base de datos diseñada la empresa gestora de los vales restaurante nos
ceden un conjunto de datos semisintéticos de restaurantes, tickets y camareros.

a. Teniendo en cuenta la estructura de las tablas realizadas y el contenido de los ficheros


a realizar por los estudiantes, se pide poblar de datos las siguientes tablas:

Tabla COMPANY

Utilizar la instrucción COPY para cargar los datos en la tabla del mismo nombre, los datos
pueden ser proporcionados por el alumno, por medio de un archivo txt

Respuesta:

COPY table_name(column1, column2, column3, ...) FROM


'/path/to/data.txt' DELIMITER ',' CSV HEADER;

Tabla SPECIALTY

Utilizar la instrucción COPY para cargar los datos en la tabla del mismo nombre, los datos
pueden ser proporcionados por el alumno, por medio de un archivo txt

Respuesta:

COPY SPECIALTY (name, description)


FROM 'ruta/al/archivo.txt'
DELIMITER ';'
CSV HEADER;

Asegúrese de reemplazar "ruta/al/archivo.txt" con la ubicación y nombre del archivo de texto


que contiene los datos de la tabla "SPECIALTY", y ajuste el delimitador y el encabezado
según corresponda. Además, tenga en cuenta que la sintaxis exacta puede variar
ligeramente dependiendo de la configuración y la versión de PostgreSQL que esté
utilizando.
Tabla RESTAURANT

Utilizar la instrucción COPY para cargar los datos en la tabla del mismo nombre, los datos
pueden ser proporcionados por el alumno, por medio de un archivo txt
.
Respuesta:
COPY nombre_tabla FROM 'ruta_del_archivo' DELIMITER ',' CSV HEADER;
Donde:
 nombre_tabla: es el nombre de la tabla donde se cargarán los datos.
 ruta_del_archivo: es la ubicación del archivo de texto plano que contiene los datos.
 DELIMITER: es el separador utilizado en el archivo de texto plano para separar los
valores de cada campo.
 CSV: indica que el archivo de texto plano utiliza el formato CSV (comma-separated
values).
 HEADER: indica que la primera fila del archivo de texto plano contiene los nombres
de las columnas.
Es importante tener en cuenta que el usuario que ejecuta la instrucción COPY debe tener
permisos de lectura sobre el archivo de texto plano.
Una vez que se tiene el archivo de texto plano con los datos a cargar y se ha utilizado la
instrucción COPY, se puede verificar que los datos se hayan cargado correctamente con
una consulta SELECT a la tabla correspondiente.

Tabla WAITER

Utilizar la instrucción COPY para cargar los datos en la tabla del mismo nombre, los datos
pueden ser proporcionados por el alumno, por medio de un archivo txt

Respuesta:

Para poblar la tabla WAITER utilizando la instrucción COPY, se deben seguir los siguientes
pasos:
1. Crear un archivo de texto (con extensión .txt) que contenga los datos a insertar en la
tabla. El archivo debe estar en formato CSV (valores separados por comas), con una
fila por cada registro y una coma separando cada valor.
Por ejemplo, el archivo waiter.txt podría tener la siguiente estructura:
John,Doe
Jane,Smith
Bob,Johnson

Donde cada fila representa un camarero y los valores separados por comas corresponden
al nombre y apellido del camarero.
2. Conectar a la base de datos en PostgreSQL utilizando un cliente como psql o
PgAdmin.
3. Crear la tabla WAITER con la estructura correspondiente. La estructura podría ser la
siguiente:
CREATE TABLE WAITER (
WAITER_ID SERIAL PRIMARY KEY,
FIRST_NAME VARCHAR(50) NOT NULL,
LAST_NAME VARCHAR(50) NOT NULL
);

4. Utilizar la instrucción COPY para cargar los datos desde el archivo waiter.txt en la
tabla WAITER. La sintaxis de la instrucción COPY es la siguiente:

COPY WAITER(FIRST_NAME, LAST_NAME) FROM '/path/to/waiter.txt'


DELIMITER ',' CSV;

Donde '/path/to/waiter.txt' es la ruta al archivo waiter.txt en el sistema de archivos, y ',' es


el delimitador de campos utilizado en el archivo.
Al ejecutar la instrucción COPY, los datos serán insertados en la tabla WAITER. Es
importante asegurarse de que los datos en el archivo tengan el mismo número de campos
que la tabla y que los tipos de datos correspondan.

Cumplimentad con el número de registros, según los datos disponible después de realizar
los procesos de carga de datos, la tabla correspondiente:

Nombre Tabla Num. total


registros
Restaurant
Waiter
Company
Specialty

b. Realizad la siguiente consulta SQL:

Se desea obtener el tipo de especialidad de los restaurantes en que se han entregado


más tickets. En concreto, se desea recuperar el número total de tickets cambiados y el
tipo de especialidad de dichos restaurantes.

Respuesta:

SELECT s.specialty_type, COUNT(*) AS total_tickets


FROM restaurant r
JOIN ticket t ON r.restaurant_id = t.restaurant_id
JOIN waiter w ON t.waiter_id = w.waiter_id
JOIN specialty s ON w.specialty_id = s.specialty_id
GROUP BY s.specialty_type
ORDER BY total_tickets DESC
LIMIT 1;

Esta consulta utiliza las tablas restaurant, ticket, waiter y specialty para obtener la
especialidad de los restaurantes con más tickets. Se realiza una unión de estas tablas a
través de las claves foráneas restaurant_id, waiter_id y specialty_id. Se utiliza la función de
agregación COUNT() para contar el número total de tickets, y se agrupa por el tipo de
especialidad en la tabla specialty. Finalmente, se ordena por el número total de tickets en
orden descendente y se limita a la primera fila con LIMIT 1 para obtener el restaurante con
más tickets y su especialidad correspondiente.

También podría gustarte