Autor: Juan Pablo Fuentes
Resumen tipos de datos
-- Tipos de datos numéricos -- INT para enteros -- DECIMAL para decimales (tamaño,decimales) -- BIT para verdadero/falso -- Tipos de datos de fecha -- DATE para fecha -- TIME para hora -- DATETIME para fecha y hora -- El formato es año-mes-dia hora:minutos:segundos -- 2024-10-01 10:03:24 -- Cadenas: especificamos el tamaño -- CHAR: Tamaño fijo, por ejemplo, si yo le pongo 100 siempre ocupa 100 -- VARCHAR: Tamaño variable, si yo pongo 100 es una cota superior -- CHAR(20) vs VARCHAR(20) -- |PEPE | |PEPE| -- Para campos que sé que tienen un ancho fijo siempre es mejor usar CHAR -- Por ejemplo telefono, cod postal, nif, dni,... -- Para campos cuyo ancho sea variable es mejor VARCHAR -- Nombres, mails, razon social, direccion.... -- El tamaño importa -- CHAR: 255 -- VARCHAR: 65535 (este es un máximo compartido) -- campo1 varchar(65000) campo2 varchar(500) campo3 como máximo 35 -- Si yo quiero introducir texto largo puedo user TEXT -- TEXT un máximo de 65535 caracteres puedo poner todos los que quiera
Ejercicio concesionario
CREATE DATABASE IF NOT EXISTS `concesionario` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */; USE `concesionario`; -- MySQL dump 10.13 Distrib 8.0.34, for Win64 (x86_64) -- -- Host: localhost Database: concesionario -- ------------------------------------------------------ -- Server version 5.5.5-10.4.32-MariaDB /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `cliente` -- DROP TABLE IF EXISTS `cliente`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `cliente` ( `idcliente` int(11) NOT NULL AUTO_INCREMENT, `dni` varchar(45) DEFAULT NULL, `nombre` varchar(45) DEFAULT NULL, `apellidos` varchar(45) DEFAULT NULL, `telefono` varchar(45) DEFAULT NULL, `direccion` varchar(45) DEFAULT NULL, PRIMARY KEY (`idcliente`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `cliente` -- LOCK TABLES `cliente` WRITE; /*!40000 ALTER TABLE `cliente` DISABLE KEYS */; INSERT INTO `cliente` VALUES (1,'1234','ana','pi','666','agla'),(2,'222','eva','buj','777','pi'); /*!40000 ALTER TABLE `cliente` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `coche` -- DROP TABLE IF EXISTS `coche`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `coche` ( `idcoche` int(11) NOT NULL AUTO_INCREMENT, `idcliente` int(11) DEFAULT NULL, `matricula` varchar(45) DEFAULT NULL, `modelo` varchar(45) DEFAULT NULL, `marca` varchar(45) DEFAULT NULL, `color` varchar(45) DEFAULT NULL, `nuevo` tinyint(4) DEFAULT NULL, `unidades` int(11) DEFAULT NULL, `kilometros` int(11) DEFAULT NULL, PRIMARY KEY (`idcoche`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `coche` -- LOCK TABLES `coche` WRITE; /*!40000 ALTER TABLE `coche` DISABLE KEYS */; INSERT INTO `coche` VALUES (1,1,'aaaa','seat','seat','azul',1,2,NULL),(2,2,'bbb','clio','clio','verde',0,0,100),(3,1,'ccc','ford','ford','amarillo',1,2,NULL); /*!40000 ALTER TABLE `coche` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `coche_mecanico` -- DROP TABLE IF EXISTS `coche_mecanico`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `coche_mecanico` ( `idcoche_mecanico` int(11) NOT NULL AUTO_INCREMENT, `idcoche` int(11) DEFAULT NULL, `idmecanico` int(11) DEFAULT NULL, `fecha` date DEFAULT NULL, `horas` int(11) DEFAULT NULL, PRIMARY KEY (`idcoche_mecanico`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `coche_mecanico` -- LOCK TABLES `coche_mecanico` WRITE; /*!40000 ALTER TABLE `coche_mecanico` DISABLE KEYS */; INSERT INTO `coche_mecanico` VALUES (1,1,1,'2024-06-19',3),(2,3,2,'2024-06-18',5); /*!40000 ALTER TABLE `coche_mecanico` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `mecanico` -- DROP TABLE IF EXISTS `mecanico`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `mecanico` ( `idmecanico` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(45) DEFAULT NULL, `apellidos` varchar(45) DEFAULT NULL, `dni` varchar(45) DEFAULT NULL, `fechacontratacion` date DEFAULT NULL, `sueldo` int(11) DEFAULT NULL, PRIMARY KEY (`idmecanico`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `mecanico` -- LOCK TABLES `mecanico` WRITE; /*!40000 ALTER TABLE `mecanico` DISABLE KEYS */; INSERT INTO `mecanico` VALUES (1,'pep','pi','111','2023-10-01',1000),(2,'juan','pi','222','2023-09-12',2000); /*!40000 ALTER TABLE `mecanico` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2024-06-20 10:31:12
Ejercicios modelo lógico
Pasar a modelo lógico los ejercicios siguientes:
cliente idcliente nombre apellido rfc direccion fechanacimiento cliente_producto idclienteproducto idcliente idproducto producto idproducto idproveedor nombre codigo preciounitario proveedor idproveedor nif nombre direccion
camionero idcamionero rfc nombre salario telefono direccion poblacion camionero_camion idcamionerocamion idcamionero idcamion camion idcamion placas modelo tipo potencia paquete idpaquete idcamionero idciudad codigo descripcion destino direccion ciudad idciudad apartadopostal nombre
profesor idprofesor rfc nombre direccion telefono profesor_modulo idprofesormodulo idprofesor idmodulo modulo idmodulo idalumno codigo nombre alumno idalumno idalumnodelegado / iddelegado control nombre apellido fechanacimiento
Más ejercicios modelo entidad relación
Se desea crear una base de datos que contenga información sobre las revistas a las que estás suscrito o compras habitualmente. De cada revista, se pide su título, el ISSN (un código que identifica a la publicación), el número y el año de publicación. También se desea almacenar información de cada uno de los artículos publicados: el título, la página de inicio y la página de fin. Se asume que no hay dos artículos con el mismo título.
Cada artículo puede estar escrito por varios autores, de quienes interesa conocer su nombre, una dirección de correo electrónico y su país de nacimiento, así como un número que indique la posición en la que aparece en cada artículo: un 1 si es el primer autor, un 2 si aparece en segundo lugar, etc.
REVISTA ARTÍCULO AUTOR
Revista(1)—(N)Artículo(N)—(N)Autor
Revista: título, ISSN, número, año publicacion
Artículo: título, página inicio y fin
Autor: Nombre, email, país nacimiento
Autor-Artículo: posición
Una ONG desea elaborar una base de datos para llevar el seguimiento de todos sus proyectos. Tiene diversas sedes en varios países que se encargan de gestionar y coordinar los proyectos de ese país, cada uno de los cuales puede afectar a una o varias poblaciones.
Sobre la sedes se desea mantener un identificador, la ciudad y país en el que se encuentra, junto con su dirección, un teléfono de contacto y el nombre del director. Cada sede gestiona un conjunto de proyectos, con un código, un título, fechas de inicio y finalización, el presupuesto asignado y el nombre del responsable.
De cada proyecto es necesario conocer qué actuaciones se realizan en cada población, almacenando el nombre, país y nº de habitantes y un identificador para diferenciarlas. Además se desea la inversión del proyecto que corresponde a la población y una pequeña descripción de la actuación.
PAIS(1)—-(N)CIUDAD(1)—-(N)SEDE(1)—(N)PROYECTO(1)—–(N)ACTUACIONES
DIRECTOR(1,1) (1,1)RESPONSABLE
Sedes: Identificador, dirección, teléfono
Proyectos: Código, título, inicio, fin, presupuesto
Actuaciones: Población, nombre, país, habitantes, identificador, descripción, inversión
Un parque zoológico quiere construir una BD para organizar las especies que posee y los distintos itinerarios para visitar el parque. La información se estructura de la siguiente forma. De las especies, se desea conocer su nombre común y su nombre científico, así como una descripción general y una fotografía. Cada especie puede vivir en distintos hábitats naturales, definidos por su nombre, clima y vegetación predominante. Cada especie tiene asociado un índice de vulnerabilidad dentro de cada hábitat, que mide el riesgo de extinción de la especie en el dicho hábitat. Para organizar las visitas, y en función de los hábitats que desee recorrer un visitante, el parque le ofrece una serie de recorridos por los hábitats, que se identifican por su código y se caracterizan por su duración estimada, longitud y número máximo de visitantes permitidos. Un hábitat sólo puede formar parte de un itinerario.
ESPECIES(N)—(N)HABITATS(N)—(1)ITINERARIO
Especies: Nombre común, científico, descripción, fotografía,
Habitats: nombre, clima, vegetación
Especies-Habitats: índice vulnerabilidad
Itinerario: Duración, longitud, visitantes, código
Una compañía aérea necesita una base de datos para registrar la información de sus vuelos. Los vuelos están caracterizados por un Id, la fecha y los aeropuertos de origen y destino. Cada vuelo es realizado por un avión. Los aviones tienen una matrícula que los identifica, el fabricante, un modelo e información sobre su capacidad (número máximo de pasajeros) y autonomía de vuelo (en horas). La tripulación asignada al vuelo está formada por el personal de la propia compañía. De cada trabajador se conoce su id, su nombre y su categoría profesional, así como el puesto que ocupa en cada vuelo en particular.
Por último, para cada vuelo, se almacena la lista completa de pasajeros, con su dni, el nombre, el asiento que ocupa y su clase (turista, primera o business).
Modelo lógico vuelos
Trabajador idtrabajador nombre categoria trabajador_vuelo idtrabajadorvuelo idtrabajador idvuelo puesto Vuelo idvuelo idavion fecha origen destino vuelo_pasajero idvuelopasajero idvuelo idpasajero clase asiento Avion idavion matricula fabricante modelo capacidad autonomia Pasajero idpasajero dni nombre
Especie idespecie nombrecomun nombrecientifico descripcion fotografia especie_habitat idespeciehabitat idespecie idhabitat vulnerabilidad Habitat idhabitat iditinerario nombre clima vegetacion Itinerario iditinerario codigo duracion longitud visitantes
Ejercicio ER
Se desea informatizar la gestión de una empresa de transportes que reparte paquetes por toda España. Los encargados de llevar los paquetes son los camioneros, de los que se quiere guardar el dni, nombre, teléfono, dirección, salario y población en la que vive.
De los paquetes transportados interesa conocer el código de paquete, descripción, destinatario y dirección del destinatario. Un camionero distribuye muchos paquetes, y un paquete sólo puede ser distribuido por un camionero.
De las provincias a las que llegan los paquetes interesa guardar el código de provincia y el nombre. Un paquete sólo puede llegar a una provincia. Sin embargo, a una provincia pueden llegar varios paquetes.
De los camiones que llevan los camioneros, interesa conocer la matrícula, modelo, tipo y potencia. Un camionero puede conducir diferentes camiones en fechas diferentes, y un camión puede ser conducido por varios camioneros
provincias 1---N paquetes N-----1 camioneros N----N camiones codigo codigo nombre | matricula nombre descripcion direccion fecha tipo destinatario telefono modelo dirección salario potencia poblacion
Ejemplo ER
Una empresa vende productos a varios clientes. Se necesita conocer los datos personales de los clientes (nombre, apellidos, dni, dirección y fecha de nacimiento). Cada producto tiene un nombre y un código, así como un precio unitario. Un cliente puede comprar varios productos a la empresa, y un mismo producto puede ser comprado por varios clientes.
Los productos son suministrados por diferentes proveedores. Se debe tener en cuenta que un producto sólo puede ser suministrado por un proveedor, y que un proveedor puede suministrar diferentes productos. De cada proveedor se desea conocer el NIF, nombre y dirección
Ejemplo ER
Crear un diseño entidad relación que permita controlar el sistema de información de una academia de cursos siguiendo estas premisas:
Se dan clases a alumno. Los datos que se almacenan de los alumnos son el DNI, dirección, nombre, teléfono y la edad
Los cursos que imparte la academia se identifican con un código de curso. Además se almacena el programa del curso, las horas de duración del mismo y el título.
Los cursos los imparte un profesor o profesora (sólo uno por curso) con estos datos son: dni, nombre, apellidos, dirección y teléfono
Se almacena la nota obtenida por cada alumno en cada curso teniendo en cuenta que un mismo alumno o alumna puede realizar varios cursos y en cada cual obtendrá una nota.
Repaso OOP 7: Interfaces
package com.trifulcas.repaso.oop; // Un interface se declara con la palabra clave Interface // En principio se definen métodos sin implementación // Cada clase que implemente este interfaz se compromete // a implementar los métodos definidos en el interface public interface Saludador { public void hola(); public void adios(); }
package com.trifulcas.repaso.oop; // Para implementar un interface uso implements public class AlumnoIntercambio extends Alumno implements Saludador { private String paisOrigen; public String getPaisOrigen() { return paisOrigen; } public void setPaisOrigen(String paisOrigen) { this.paisOrigen = paisOrigen; } public AlumnoIntercambio(String nombre, int nota, String email) { super(nombre, nota, email); } public void saludo() { // Recordad que las propiedades private no son visibles desde // la clase derivada, esto da error // System.out.println("hola "+nombre); System.out.println("hola "+getNombre()); } // Sobreescribir los métodos que heredo de la clase madre // Y tener otra implementación, en este caso el toString @Override public String toString() { // La palabra clave super hace referencia a la clase madre // Aquí lo usamos para acceder al método toString de Alumno return "AlumnoIntercambio [paisOrigen=" + paisOrigen + ", " + super.toString() + "]"; } // Si clase madre tiene un método abstracto en la clase derivada // Estamos obligados a implementarlo @Override public int media() { return 0; } // Como implemento el interfaz Saludados tengo que // implementar hola y adios @Override public void hola() { System.out.println("hola"); } @Override public void adios() { System.out.println("adios"); } }
package com.trifulcas.repaso.oop; public class Rectangulo extends Figura implements Saludador, Imprimible{ private double base; private double altura; public Rectangulo(double base, double altura) { super(); this.base = base; this.altura = altura; } public double getBase() { return base; } public void setBase(double base) { this.base = base; } public double getAltura() { return altura; } public void setAltura(double altura) { this.altura = altura; } @Override public double getArea() { // TODO Auto-generated method stub return base*altura; } @Override public double getPerimetro() { // TODO Auto-generated method stub return base+2+altura*2; } // Como implemento el interfaz Saludados tengo que // implementar hola y adios @Override public void hola() { System.out.println("hola, soy un rectángulo"); } @Override public void adios() { System.out.println("Adios pásalo bien"); } @Override public void imprimir() { System.out.println("Imprimir rectángulo"); } }
package com.trifulcas.repaso.oop; import java.util.ArrayList; public class TestOOP { public static void main(String[] args) { // Puedo crear arraylist de interfaces ArrayList<Saludador> saludadores = new ArrayList<>(); saludadores.add(new Rectangulo(2, 3)); saludadores.add(new AlumnoIntercambio("Ana", 3, "www")); saludadores.add(new Rectangulo(8, 5)); // Polimorfismo: como todas las clases implementan Saludador // Yo utilizo los métodos que sé que tendrán que implementar // porque el interfaz es como un contrato for (Saludador saludador : saludadores) { saludador.hola(); saludador.adios(); // Esto no es visible saludador.getArea() // Esto tampoco es visible saludador.getPaisOrigen() } Tigre pepe=new Tigre(); pepe.amamantar(); } }
Repaso OOP 6: Abstracción
package com.trifulcas.repaso.oop; // Una clase abstracta es igual que una clase con la diferencia // de que no se puede instanciar un objeto de ella public abstract class Alumno { // Lo habitual es que todas las propiedades sean private // Para evitar que se puedan modificar desde el exterior private String nombre; private int nota; private String mail; // En una clase abstracta puedo tener métodos abstractos // Son métodos con 'firma' (parámetros y tipo de retorno) // Pero sin implementación // Un método abastracto solo puede estar en una clase abstracta public abstract int media(); // Las propiedades o métodos estáticos solo existen una vez // (es decir, hay una única instancia para todos los objetos de esta clase) // Podemos acceder a ellos sin instanciar un objeto // La información es compartida por todos private static int notaCorte=5; // El constructor es la manera como se construye la instancia // de la clase. Es el punto de entrada // Podemos tener parámetros o no y podemos tener sobrecargas // Un ejemplo típico sería este. Usamos todas las propiedades public Alumno(String nombre, int nota, String email) { // La palabra clave this hace referencia al propio objeto // La usamos para desambiguar entre el nombre de los parámetros // y de las propiedades de la clase this.nombre = nombre; this.nota = nota; // Aquí no hace falta desambiguar porque se llaman diferente mail = email; } // Yo los constructores los puedo sobrecargar public Alumno(String nombre, int nota) { this.nombre = nombre; this.nota = nota; mail = "No tiene"; // this(nombre,nota,"No tiene") } // Si yo hago sobrecarga lo suyo es que llamemos al otro constructor public Alumno(String nombre) { /* Si yo quiero hacer esto this.nombre = nombre; this.nota = 0; mail = "No tiene"; Lo mejor es hacer esto: */ this(nombre,0,"No tiene"); // this hace referencia al constructor } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getNota() { return nota; } public void setNota(int nota) { this.nota = nota; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public boolean getAprobado() { // La nota de corte es la misma para todos los objetos return nota>=notaCorte; } public static int getNotaCorte() { return notaCorte; } public static void setNotaCorte(int notaCorte) { Alumno.notaCorte = notaCorte; } @Override public String toString() { return "Alumno [nombre=" + nombre + ", nota=" + nota + ", mail=" + mail + "]"; } public static void aprobar(Alumno al) { al.setNota(10); } }
package com.trifulcas.repaso.oop; // La herencia se implementa con extends // AlumnoIntercambio deriva de Alumno // Alumno es la superclase o clase madre // y AlumnoIntercambio la clase hija o derivada o subclase public class AlumnoIntercambio extends Alumno { private String paisOrigen; public String getPaisOrigen() { return paisOrigen; } public void setPaisOrigen(String paisOrigen) { this.paisOrigen = paisOrigen; } public AlumnoIntercambio(String nombre, int nota, String email) { super(nombre, nota, email); } public void saludo() { // Recordad que las propiedades private no son visibles desde // la clase derivada, esto da error // System.out.println("hola "+nombre); System.out.println("hola "+getNombre()); } // Sobreescribir los métodos que heredo de la clase madre // Y tener otra implementación, en este caso el toString @Override public String toString() { // La palabra clave super hace referencia a la clase madre // Aquí lo usamos para acceder al método toString de Alumno return "AlumnoIntercambio [paisOrigen=" + paisOrigen + ", " + super.toString() + "]"; } // Si clase madre tiene un método abstracto en la clase derivada // Estamos obligados a implementarlo @Override public int media() { return 0; } // En una clase que no es abstracta no puedo tener un método abstracto // Error: public abstract int foo(); }
package com.trifulcas.repaso.oop; public abstract class Figura { public abstract double getArea(); public abstract double getPerimetro(); }
package com.trifulcas.repaso.oop; public class Cuadrado extends Figura{ private double lado; public Cuadrado(int lado) { super(); this.lado = lado; } public double getLado() { return lado; } public void setLado(double lado) { this.lado = lado; } @Override public double getArea() { // TODO Auto-generated method stub return lado*lado; } @Override public double getPerimetro() { // TODO Auto-generated method stub return lado*4; } }
package com.trifulcas.repaso.oop; public class Rectangulo extends Figura{ private double base; private double altura; public Rectangulo(double base, double altura) { super(); this.base = base; this.altura = altura; } public double getBase() { return base; } public void setBase(double base) { this.base = base; } public double getAltura() { return altura; } public void setAltura(double altura) { this.altura = altura; } @Override public double getArea() { // TODO Auto-generated method stub return base*altura; } @Override public double getPerimetro() { // TODO Auto-generated method stub return base+2+altura*2; } }
package com.trifulcas.repaso.oop; import java.util.ArrayList; public class TestOOP { public static void main(String[] args) { // Esto ahora da error porque al ser abstracta Alumno // No podemos crear una instancia // Alumno eva=new Alumno("Eva",6,"wwww"); // No puedo hacer Figura foo=new Figura() ArrayList<Figura> figuras=new ArrayList<>(); figuras.add(new Cuadrado(5)); figuras.add(new Rectangulo(2,3)); figuras.add(new Cuadrado(7)); figuras.add(new Rectangulo(12,4)); // Polimorfismo: como todas las clases derivan de figura // Yo utilizo los métodos que sé que tendrán por derivar // de 'Figura', aunque cada clase tiene su propia implementación for(Figura figura:figuras) { System.out.println(figura.getArea()); } } }