Ejercicio índices y foreign keys

Crear la base de datos siguiente:

revista

id_revista int AI  PK

titulo  VARCHAR(100)

issn CHAR(8)

numero: varchar(20)

anyo_publicacion: year

 

articulo

id_articulo int AI PK

titulo varchar(200)

pagina_inicio: int

pagina_fin: int

id_revista int (NO AI)

 

autor

id_autor int AI PK

nombre: varchar(150)

email: varchar(100)

pais_nacimiento: varchar(25)

 

autor_articulo

id_autor_articulo int AI PK

id_articulo int (NO AI)

id_autor int (NO AI)

posición: tinyint

Añadir las fk, un índice normal en título revista y único en issn y un índice normal en título artículo y nombre autor

Ejemplos tipos de datos

revista

id_revista int AI  PK

titulo  VARCHAR(100)

issn CHAR(8)

numero: varchar(20)

anyo_publicacion: year

 

articulo

id_articulo int AI PK

titulo varchar(200)

pagina_inicio: int

pagina_fin: int

id_revista int (NO AI)

 

autor

id_autor int AI PK

nombre: varchar(150)

email: varchar(100)

pais_nacimiento: varchar(25)

 

autor_articulo

id_autor_articulo int AI PK

id_articulo int (NO AI)

id_autor int (NO AI)

posición: tinyint

Especies:

Nombre común: varchar(150)

Científico: varchar(150)

Descripción: text

Fotografía: varchar(100) // Recomiendo guardar una ruta y almacenar el archivo en esa ruta, no guardar el archivo en sí.

 

Habitats:

Nombre: varchar(100)

Clima: varchar(100)

Vegetación: varchar(100)

 

Especies-Habitats:

índice vulnerabilidad: int

 

Itinerario:

Duración:int / time

Longitud: decimal (3,4km) / int (250 m, 1342m)

Visitantes:int

Código: char(6)

Tipos de datos en Mysql

Referencia: https://dev.mysql.com/doc/refman/8.0/en/data-types.html

Tipos de dato numéricos

Listado de cada uno de los tipos de dato numéricos en MySQL, su ocupación en disco y valores.

  • INT (INTEGER): Ocupación de 4 bytes con valores entre -2147483648 y 2147483647 o entre 0 y 4294967295.
  • SMALLINT: Ocupación de 2 bytes con valores entre -32768 y 32767 o entre 0 y 65535.
  • TINYINT: Ocupación de 1 bytes con valores entre -128 y 127 o entre 0 y 255.
  • MEDIUMINT: Ocupación de 3 bytes con valores entre -8388608 y 8388607 o entre 0 y 16777215.
  • BIGINT: Ocupación de 8 bytes con valores entre -263y 263-1o entre 0 y 16777215.
  • DECIMAL (NUMERIC): Almacena los números de coma fija como cadenas o string.
  • FLOAT (m,d): Almacena números de coma flotante, donde ‘m’ es el número de dígitos de la parte entera y ‘d’ el número de decimales.
  • DOUBLE (REAL): Almacena número de coma flotante con precisión doble. Igual que FLOAT, la diferencia es el rango de valores posibles.
  • BIT (BOOL, BOOLEAN): Número entero con valor 0 o 1.

Tipos de dato con formato fecha

Listado de cada uno de los tipos de dato con formato fecha en MySQL, su ocupación en disco y valores.

  • DATE: Válido para almacenar una fecha con año, mes y día, su rango oscila entre  ‘1000-01-01′ y ‘9999-12-31′.
  • DATETIME: Almacena una fecha (año-mes-día) y una hora (horas-minutos-segundos), su rango oscila entre  ‘1000-01-01 00:00:00′ y ‘9999-12-31 23:59:59′.
  • TIME: Válido para almacenar una hora (horas-minutos-segundos). Su rango de horas oscila entre -838-59-59 y 838-59-59. El formato almacenado es ‘HH:MM:SS’.
  • TIMESTAMP: Almacena una fecha y hora UTC. El rango de valores oscila entre ‘1970-01-01 00:00:01′ y ‘2038-01-19 03:14:07′.
  • YEAR: Almacena un año dado con 2 o 4 dígitos de longitud, por defecto son 4. El rango de valores oscila entre 1901 y 2155 con 4 dígitos. Mientras que con 2 dígitos el rango es desde 1970 a 2069  (70-69).

Diferentes tipos de dato con formato string

Listado de cada uno de los tipos de dato con formato string en MySQL, su ocupación en disco y valores.

  • CHAR: Ocupación fija cuya longitud comprende de 1 a 255 caracteres.
  • VARCHAR: Ocupación variable cuya longitud comprende de 1 a 65.535 caracteres (se cuenta entre todos los campos de la tabla).
  • TINYBLOB: Una longitud máxima de 255 caracteres. Válido para objetos binarios como son un fichero de texto, imágenes, ficheros de audio o vídeo. No distingue entre minúculas y mayúsculas.
  • BLOB: Una longitud máxima de 65.535 caracteres. Válido para objetos binarios como son un fichero de texto, imágenes, ficheros de audio o vídeo. No distingue entre minúculas y mayúsculas.
  • MEDIUMBLOB: Una longitud máxima de 16.777.215 caracteres. Válido para objetos binarios como son un fichero de texto, imágenes, ficheros de audio o vídeo. No distingue entre minúculas y mayúsculas.
  • LONGBLOB: Una longitud máxima de 4.294.967.298 caracteres. Válido para objetos binarios como son un fichero de texto, imágenes, ficheros de audio o vídeo. No distingue entre minúculas y mayúsculas.
  • SET: Almacena 0, uno o varios valores una lista con un máximo de 64 posibles valores.
  • ENUM: Igual que SET pero solo puede almacenar un valor.
  • TINYTEXT: Una longitud máxima de 255 caracteres. Sirve para almecenar texto plano sin formato. Distingue entre minúculas y mayúsculas.
  • TEXT:Una longitud máxima de 65.535 caracteres. Sirve para almecenar texto plano sin formato. Distingue entre minúculas y mayúsculas.
  • MEDIUMTEXT:Una longitud máxima de 16.777.215 caracteres. Sirve para almecenar texto plano sin formato. Distingue entre minúculas y mayúsculas.
  • LONGTEXT: Una longitud máxima de 4.294.967.298 caracteres. Sirve para almecenar texto plano sin formato. Distingue entre minúculas y mayúsculas.

Además de estos tipos MySQL incorpora JSON y datos espaciales. Más información aquí:

https://ed.team/blog/como-trabajar-con-json-en-mysql

https://mappinggis.com/2019/09/mysql-y-gis-usa-mysql-como-una-base-de-datos-espacial/

Del modelo ER al modelo lógico, un ejemplo

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

 

E/R- > Modelo lógico siguiendo los pasos del esquema

Nombre de la clave principal: id a secas, id+nombre tabla, id_nombretabla (ej: id, idrevista, id_revista)

Reglas de nombres: Minúsculas, NO ACENTOS O Ñ, podemos usar guión bajo como separador

Los nombres de las tablas también usan esas reglas, poner el nombre en singular

Usemos lo que usemos: con coherencia

revista

id_revista

titulo

issn

numero

anyo_publicacion

 

articulo

id_articulo

titulo

pagina_inicio

pagina_fin

id_revista

 

autor

id_autor

nombre

email

pais_nacimiento

 

autor_articulo

id_autor_articulo

id_articulo

id_autor

posicion

 

Reglas para la transformación del modelo E-R al modelo lógico

1.- Cada entidad se transforma en una tabla

Si en nuestro modelo ER tenemos una entidad ‘Productos’ en nuestra base de datos tendremos una tabla ‘Productos’

2.- Cada tabla tiene una clave principal. Puede ser una clave natural o subrogada, pero aconsejamos poner una clave principal subrogada con idnombretabla

Las claves naturales prácticamente no se usan. Todos los SGBD tienen tipos de datos que se autoincrementan. Si tenemos una tabla productos mi consejo es que crees un campo llamado ‘id’ o ‘idproducto’ de tipo autoincremental.

3.- Las relaciones se tranforman así:

1-N El campo clave de la tabla de la parte ‘1’ de la relación se pone como campo en la tabla de la parte ‘N’

N-N Se crea una tabla intermedia con los campos claves de las dos tablas como campos y opcionalmente (aunque yo lo recomiendo) un campo clave propio.

Si tengo las tablas Categorías, Productos y Proveedores con una relación 1-N entre categorías y productos y una relación N-N entre proveedores y productos lo tendríamos que implementar así:

a) El campo clave de categoría (idcategoría) lo pongo como campo normal en Productos.

b) Creo una tabla productos_proveedores y en esta tabla pongo tres campos: idproducto_proveedor clave principal autoincrement, idproducto e idproveedor como campos normales.

4.- Se ponen los atributos con sus tipos donde corresponda, sea en la relación o sea en la tabla.

Cada SGBD tiene sus tipos de datos, pero en general todos tienen tipos de datos varchar para texto, int para datos enteros, decimal o currency para monedas, date y datetime para fechas y horas…

Hay que tener en cuenta algunas cosas:

a) Hay datos que parecen numéricos pero son cadenas de texto: un código postal, un teléfono. Como regla podemos decir que será de tipo numérico aquello con lo que podemos operar (sumar, restar) como por ejemplo un stock, un precio y será de tipo texto aquello con lo que no tiene sentido operar, en un código postal no tiene sentido sumar o restar nada.

b) Los atributos pueden ir en las relaciones, no es algo extraño. Si tengo una relación entre actores y películas N-N puedo tener un atributo ‘papel’ que no va ni en actor ni en película, va en la relación. Como las relaciones N-N crean una tabla intermedia ese atributo irá en la tabla intermedia.

Ejercicio academia

Crear un diseño entidad relación que permita controlar el sistema de información de una academia de cursos siguiendo estas premisas:

  • 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, el título y cada vez que se imparte se anotará las fechas de inicio y fin del curso junto con un número concreto de curso (distinto del código) y los datos del profesor o profesora (sólo uno por curso) que 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.

Mini ejercicio BD

Una empresa nos pide que creemos una BD para controlar su inventario. Tienen un almacen con una serie de productos de los que les interesa saber el nombre y la cantidad que tienen (p. ej. tuercas, 20).
Los productos se los compran a unos proveedores y quieren saber el nombre y el telefono de los mismos para que cuando necesiten renovar stock les puedan llamar.

Crear el modelo E/R para esta base de datos.

¿Crees que tienes toda la información o consideras que hay que preguntarle algo al cliente?