Ejercicio DDL

Crear una base de datos con las siguientes tablas:

musico

id int auto pk

nombre varchar(100)

descripcion text

 

disco

id int auto pk

titulo varchar(100)

precio decimal(6,2)

Hay una relación entre disco y musico n-N

Crear con DDL las tablas necesarias con sus foreignkeys

</pre>
CREATE DATABASE musica;

use musica;

CREATE TABLE musico (
id_musico INT AUTO_INCREMENT,
nombre VARCHAR(100),
descripcion TEXT,
PRIMARY KEY (id_musico)
);

CREATE TABLE disco (
id_disco INT AUTO_INCREMENT,
titulo VARCHAR(100),
precio DECIMAL(6,2),
PRIMARY KEY (id_disco)
);

CREATE TABLE musico_disco (
id_musico_disco INT AUTO_INCREMENT,
id_musico INT,
id_disco INT,
PRIMARY KEY (id_musico_disco),
key (id_musico),
key (id_disco),
FOREIGN KEY fk_musico (id_musico) REFERENCES musico(id_musico),
FOREIGN KEY fk_disco (id_disco) REFERENCES disco(id_disco)
);
<pre>

Sql sentencias creación de datos (DDL)

Crear BD:

https://www.w3schools.com/sql/sql_create_db.asp

Crear tabla:

http://www.mysqltutorial.org/mysql-create-table/

http://www.mysqltutorial.org/mysql-foreign-key/

http://www.mysqltutorial.org/mysql-index/mysql-create-index/

 

CREATE TABLE [IF NOT EXISTS] table_name(
    lista_columnas
) ENGINE=storage_engine

-- Formato de las columnas:
nombre_columna tipo_columna(length) [NOT NULL] [DEFAULT value] [AUTO_INCREMENT]

	
PRIMARY KEY (columna)

-- De las dos maneras se puede:
INDEX nombre_indice (nombre_columna)
KEY (nombre_columna) 


FOREIGN KEY nombre_clave_foranea(columna)
REFERENCES tabla_referenciada(columna_tabla_referrenciada)
ON DELETE action
ON UPDATE action;

-- Crear un índice después de crear la tabla
CREATE INDEX index_name
ON table_name (column1, column2, ...);

CREATE TABLE IF NOT EXISTS tasks (
    task_id INT AUTO_INCREMENT,
    employee_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    start_date DATE,
    due_date DATE,
    status TINYINT NOT NULL,
    priority TINYINT NOT NULL,
    description TEXT,
    PRIMARY KEY (task_id),
    INDEX ix_title (title),
    FOREIGN KEY fk_employee(employee_id )
    REFERENCES employee (employee_id )
    ON DELETE RESTRICT
    ON UPDATE CASCADE
)  ENGINE=INNODB;

Solucionar estadísticas

Solución 1:

Copiar el mysql dump de xampp\mysql a c:\Archivos de Programa\Mysql\Mysql workbench 8.0

Solución 2:

Abrir el archivo c:\Program Files\MySQL\MySQL Workbench 8.0 CE\modules\wb_admin_export.py:

Y cambiar la siguiente línea a esto:

skip_column_statistics = True 

Solución 3:

Exportar desde el phpmyadmin (super sencillo)

Solución 4:

Exportar cada tabla individualmente con botón derecho ->Send to sql editor->create statement

Ejercicio global

Queremos hacer una base de datos para una tienda de pasteles. Los pasteles están clasificados en diferentes categorías de las que queremos saber el nombre y una descripción. Cada pastel tiene un nombre, una foto, un precio, si es apto para celíacos y una descripción.

Los clientes pueden comprar los pasteles. Del cliente queremos almacenar el nombre, el teléfono y la dirección. Un cliente puede comprar muchos pasteles y un pastel puede ser comprado por muchos clientes.

Crear el modelo Entidad-Relación.

A partir de ahí, el modelo lógico.

Escoged bien los tipos de datos para cada campo.

Una vez tengamos el modelo lógico, lo implementamos en nuestra base de datos.

Añadid las foreign keys necesarias.

Añadis un índice único al nombre de la categoría y un índice normal al nombre del pastel y al nombre del cliente.

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

 

Pequeña práctica

Crear una base de datos ‘Zoologico’

Y dentro de esa base de datos una tabla ‘Especies’

De la siguiente manera:

Especies

id_especie   auto increment

nombre_comun  varchar(50)

nombre_cientifico  varchar(50)

descripción  varchar(50)