domingo, 30 de marzo de 2014

7) Programación en Consola de Bases de Datos - MySQL

El lenguaje de consulta estructurado o SQL(Structured Query Language) es un lenguaje declarativo de acceso a bases de datos relacionales. Con este lenguaje se pueden especificar diversos tipos de operaciones para bases de datos relacionales, además, maneja álgebra y cálculo relacional, lo que nos permite efectuar consultas para recuperar información de las bases de datos, así como hacer cambios en ellas.

Este es un lenguaje sencillo que no tiene muchas instrucciones pero es extremadamente útil para trabajar con nuestras bases de datos. A continuación codificaré las 10 bases de datos de los ejercicios con los que he trabajado en las últimas 2 entradas de este blog, habrá imágenes de la descripción de las tablas en el MySQL Command Line Client, así como el código con el que la hice.

Ejercicio 1

>create database ejercicio1;
>use ejercicio1;
>create table coche(nodeaccidentes int(10) primary key not null, idcliente varchar(10) not null);
>create table cliente(idcliente varchar(10) primary key not null);

Ejercicio 2

>create database ejercicio2;
>use ejercicio2;
>create table cliente(DNI varchar(20) primary key not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, calle varchar(15) not null, nocalle int(6) not null, codigopostal varchar(5) not null, ciudad varchar(20) not null, idconcesionario varchar(10) not null);
>create table telefono(DNI varchar(20) not null, telefono int(15) not null);
>create table mecanico(DNI varchar(20) primary key not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, salario int(10) not null);
>create table concesionario(idconcesionario varchar(10) primary key not null);
>create table automovil(matricula varchar(10) primary key not null, modelo varchar(4) not null, marca varchar(15) not null, color varchar(15) not null, nuevo varchar(2) not null, unidades int(10) not null, kmrecorrridos int(10) not null, DNI varchar(20) not null);
>create table repara(DNI varchar(20) primary key not null, matricula varchar(10) not null, fecha DATE not null, horas int(10) not null);

Ejercicio 3

>create database ejercicio3;
>use ejercicio3;
>create table jugador(idjugador varchar(10) primary key not null, nodecamiseta int(2) not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, idequipo varchar(10) not null);
>create table equipo(idequipo varchar(10) primary key not null);
>create table partido(idpartido varchar(10) primary key not null, resultado varchar(5) not null, idequipo varchar(10) not null);
>create table juega(goles int(2) not null, pases int(4) not null, faltas int(2) not null, idpartido varchar(10) not null, idjugador varchar(10) not null);

Ejercicio 4

>create database ejercicio4;
>use ejercicio4;
>create table articulo(noarticulo int(10) primary key not null, existencia int(10) not null, descripcion varchar(1000) not null, idempresa varchar(10) not null);
>create table fabrica(nofabrica int(10) primary key not null, artproducidos int(5) not null, noarticulo int(10) not null);
>create table telefonofabrica(nofabrica int (10) not null, telefono varchar(12) not null);
>create table empresa(idempresa varchar(10) primary key not null);
>create table pedido(cabecera varchar(10) primary key not null, nocliente int (10) not null, fechapedido DATE not null, hora TIMESTAMP not null, cantidad int(10) not null, noarticulo int(10) not null, calle varchar(15) not null, nocalle int(6) not null, colonia varchar(5) not null, ciudad varchar(20) not null, idempresa varchar(10) not null);
>create table cliente(calle varchar(15) not null, nocalle int(6) not null, colonia varchar(25) not null, ciudad varchar(20) not null, nocliente int(10) primary key not null, limitecredito int(10) not null, descuento varchar(5) not null, saldo int(10) not null, idempresa varchar(10) not null);

Ejercicio 5

>create database ejercicio5;
>use ejercicio5;
>create table proveedor(RUT varchar(15) primary key not null, paginaweb varchar(30) not null,calle varchar(15) not null, nocalle int(6) not null, comuna varchar(15) not null, ciudad varchar(20) not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null);
>create table telefonoproveedor(RUT varchar(15) not null, telefono varchar(15) not null);
>create table producto(idproducto varchar(10) primary key not null, nombre varchar(15) not null, precio int(10) not null, stock int(10) not null, RUT varchar(15) not null, idcategoria varchar(10) not null, idventa varchar(10) not null);
>create table categoria(nombre varchar(15) not null, idcategoria varchar(10) primary key not null, descripcion varchar(1000) not null);
>create table venta(idventa varchar(10) primary key not null, RUT varchar(15) not null, fecha DATE not null, descuento int(3) not null, precio int(10) not null, cantidad int(10) not null, total int(10) not null);
>create table cliente(RUT varchar(15) primary key not null, calle varchar(15) not null, nocalle int(6) not null, comuna varchar(5) not null, ciudad varchar(20) not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null);
>create table telefonocliente(RUT varchar(15) not null, telefono varchar(15) not null);

Ejercicio 6

>create database ejercicio6;
>use ejercicio6;
>create table aeropuerto(codigo varchar(10) primary key not null, nombre varchar(40) not null, pais varchar(20) not null, ciudad varchar(20) not null);
>create table avion(idavion varchar(10) primary key not null, capacidad int(10) not null, modelo varchar(15) not null, novuelo varchar(10) not null);
>create table vuelo(novuelo varchar(10) primary key not null, fecha DATE not null, plazasvacias int(4) not null);
>create table programadevuelo(novuelo varchar(10) primary key not null, lineaarea varchar(15) not null, diasemana varchar(9) not null, escala varchar(2) not null, noescalas int(2) not null);
>create table despegaaterriza(novuelo varchar(10) not null, codigo varchar(10) not null);
>create table tomatierra(codigo varchar(10) not null, idavion varchar(10) not null);

Ejercicio 7

>create database ejercicio7;
>use ejercicio7;
>create table olimpiada(ano int(4) primary key not null);
>create table sede(ano int(4) not null, idsede varchar(10) primary key not null);
>create table evento(fecha DATE not null, duracion varchar(15) not null, noparticipantes int(5) not null, localizacion varchar(30) not null, idevento varchar(10) primary key not null);
>create table equipamiento(idequipamiento varchar(10) primary key not null);
>create table comisario(idcomisario varchar(10) primary key not null);
>create table complejo(areatotal int(6) not null, localizacion varchar(30) primary key not null, jefe varchar(20) not null, idsede varchar(10) not null);
>create table area(deporte varchar(20) not null, localizacion varchar(30) primary key not null);
>create table tiene(idevento varchar(10) not null, idcomisario varchar(10) primary key not null, tarea varchar(20) not null);
>create table necesita(idequipamiento varchar(10) not null, idevento varchar(10) primary key not null);

Ejercicio 8

>create database ejercicio8;
>use ejercicio8;
>create table entrenador(identrenador varchar(10) primary key not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null);
>create table jugador(idjugador varchar(10) primary key not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, premio varchar(15) not null);
>create table partido(idpartido varchar(10) primary key not null, modalidad varchar(20) not null, relevancia varchar(15) not null, marcador varchar(6) not null, fecha DATE not null, premio varchar(15) not null, premioconsolacion varchar(15) not null);
>create table arbitro(nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, idarbitro varchar(10) primary key not null);
>create table torneo(idtorneo varchar(10) primary key not null, ciudad varchar(20) not null, pais varchar(20) not null);
>create table entrena(identrenador varchar(10) not null, idjugador varchar(10) primary key not null);

Ejercicio 9

>create database ejercicio9;
>use ejercicio9;
>create table cine(nombrecine varchar(15) primary key not null, calle varchar(15) not null, nocalle int(6) not null, colonia varchar(15) not null, ciudad varchar(20) not null);
>create table telefonocine(nombrecine varchar(15) not null, telefono varchar(15) not null);
>create table promocion(descripcion varchar(250) primary key not null, descuento varchar (6) not null);
>create table sala(idsala varchar(10) primary key not null, nombre varchar(15) not null, butacas int(5) not null, nombrecine varchar(15) not null, idfuncion varchar(10) not null);
>create table funcion(idfuncion varchar(10) primary key not null, dia DATE not null, hora varchar(10) not null, nombre varchar(30) not null, idcartelera varchar(10) not null, idsala varchar(10) not null);
>create table opinion(idopinion varchar(10) primary key not null, comentario varchar(1000) not null, fecha DATE not null, calificacion varchar(15) not null, edad int(3) not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null);
>create table pelicula(nombre varchar(30) primary key not null, idficha varchar(10) not null, idfuncion varchar(10) not null);
>create table ficha(idficha varchar(10) primary key not null, titulodistribucion varchar(30) not null, sitioweb varchar(30) not null, genero varchar(15) not null, subtitulos varchar(2) not null, titulooriginal varchar(30) not null, duracion varchar(7) not null, idioma varchar(15) not null, pais varchar(15) not null, estreno DATE not null, ano int(4) not null, calificacion varchar(15) not null, resumen varchar(1000) not null, nombre varchar(30) not null);
>create table actor(nacionalidad varchar(15) not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, idactor varchar(10) primary key not null);
>create table director(nacionalidad varchar(15) not null, nombre varchar(15) not null, apellidopaterno varchar(15) not null, apellidomaterno varchar(15) not null, iddirector varchar(10) primary key not null);
>create table cartelera(idcartelera varchar(10) primary key not null, nombrecine varchar(15) not null);
>create table participa(nombre varchar(30) primary key not null, idactor varchar(10) not null, iddirector varchar(10) not null);
>create table presenta(nombre varchar(30) not null, nombrecine varchar(15) not null);
>create table tiene(nombrecine varchar(15) not null, descripcion varchar(1000) not null);


Ejercicio 10

>create database ejercicio10;
>use ejercicio10;
>create table pieza(id varchar(10) primary key not null, nombre varchar(15) not null);
>create table mueble(nombre varchar(15) primary key not null, precio int(10) not null, nopiezas int(4) not null);
>create table estante(posicion varchar(10) primary key not null, pasillo varchar(5) not null, altura int(3) not null);
>create table esta(posicion varchar(10) primary key not null, nombre varchar(15) not null);

Conclusiones

El lenguaje SQL es necesario para trabajar con bases de datos relacionales así que su manejo es muy importante para poder llevar a cabo un sistema útil y completo, que cumpla con todas las funcionalidades y especificaciones que queramos. Como se ve arriba, no es un lenguaje complicado, todo lo contrario, es extremedamente simple, y por esto mismo, es susceptible a errores; para cuidarnos de estos errores es que usamos en la entrada pasada de este blog las formas normales.

domingo, 23 de marzo de 2014

6) Formas Normales

Formas Normales

En el modelo relacional de bases de datos, las formas normales son un criterio para determinar la vulnerabilidad de una tabla a inconsistncias o anomalías lógicas. Mientras más alta sea la forma normal que cumpla una tabla, menos vulnerable será. A continuación daré una resumida definición de las primeras 2 formas normales.

1a Forma Normal

Para que una base de datos cumpla la 1a forma normal cada columna debe ser atómica. Para la 1a forma normal se deben llevar a cabo los siguientes 3 puntos:
  • Los atributos compuestos se deben separar en atributos simples (atómicos).
  • Los atributos multivalorados se vuelven registros (tablas).
  • En las relaciones de 1 a muchos, se elimina la tabla de la relación y se pone la clave primaria de la entidad '1' a la entidad 'muchos'. Esto solo aplica si la relación no tiene más atributos que las claves de las entidades.

2a Forma Normal

Para que una base de datos sea 2FN (cumple la 2a forma normal), primero debe ser 1FN y además todas las columnas que forman parte de una clave candidata deben aportar información sobre la clave completa. Una clave candidata es aquella que identifica de forma unívoca una clave completa (entidad).

Para ejemplificar lo anterior, aplicaré las formas normales a los 10 ejercicios anteriores que previamente ya había pasado del modelo Entidad-Relación al modelo Relacional, esto lo pueden encontrar en la publicación anterior de este blog.

Ejercicios

Ejercicio 1
  • coche(nodeaccidentes, idcliente)
  • cliente(idcliente)

Ejercicio 2
  • cliente(DNI, nombre, apellidopaterno, apellidomaterno, calle, nocalle, codigopostal, ciudad, idconcesionario)
  • telefono(DNI, telefono)
  • mecanico(DNI, nombre, apellidopaterno, apellidomaterno, salario)
  • concesionario(idconcesionario)
  • automovil(matricula, modelo, marca, color, nuevo, unidades, kmrecorridos, DNI)
  • repara(DNI, matricula, fecha, horas)

Ejercicio 3
  • jugador(idjugador, nodecamiseta, nombre, apellidopaterno, apellidomaterno, idequipo)
  • equipo(idequipo)
  • partido(idpartido, resultado, idequipo)
  • juega(goles, pases, faltas, idpartido, idjugador)

Ejercicio 4
  • articulo(noarticulo, existencia, descripcion, idempresa)
  • fabrica(nofabrica, artproducidos, noarticulo)
  • telefonofabrica(nofabrica, telefono)
  • empresa(idempresa)
  • pedido(cabecera, nocliente, fechapedido, hora, cantidad, noarticulo, calle, nocalle, colonia, ciudad, idempresa)
  • cliente(nocliente, calle, nocalle, colonia, ciudad, limitecredito, descuento, saldo, idempresa)
Ejercicio 5
  • proveedor(RUT, paginaweb, calle, nocalle, comuna, ciudad, nombre, apellidopaterno, apellidomaterno)
  • telefonoproveedor(RUT, telefono)
  • producto(idproducto, nombre, precio, stock, RUT, idcategoria, idventa)
  • categoria(nombre, idcategoria, descripcion)
  • venta(idventa, RUT, fecha, descuento, precio, cantidad, total)
  • cliente(RUT, calle, nocalle, comuna, ciudad, nombre, apellidopaterno, apellidomaterno)
  • telefonocliente(RUT, telefono)
Ejercicio 6
  • aeropuerto(codigo, nombre, pais, ciudad)
  • avion(idavion, capacidad, modelo, novuelo)
  • vuelo(novuelo, fecha, plazasvacias)
  • programadevuelo(novuelo, lineaaerea, diasemana, escala, noescalas)
  • despegaaterriza(novuelo, codigo)
  • tomatierra(codigo, idavion)
Ejercicio 7
  • olimpiada(ano)
  • sede(ano, idsede)
  • evento(fecha, duracion, noparticipantes, localizacion, idevento)
  • equipamiento(idequipamiento)
  • comisario(idcomisario)
  • complejo(areatotal, localizacion, jefe, idsede)
  • area(deporte, localizacion)
  • tiene(idevento, idcomisario, tarea)
  • necesita(idequipamiento, idevento)
Ejercicio 8
  • entrenador(identrenador, nombre, apellidopaterno, apellidomaterno)
  • jugador(idjugador, nombre, apellidopaterno, apellidomaterno, premio)
  • partido(idpartido, modalidad, relevancia, marcador, fecha, premio, premioconsolacion)
  • arbitro(idarbitro, nombre, apellidomaterno, apellidopaterno)
  • torneo(idtorneo, ciudad, pais)
  • entrena(identrenador, idjugador)
Ejercicio 9
  • cine(nombrecine, calle, nocalle, colonia, ciudad)
  • telefonocine(nombrecine, telefono)
  • promocion(descripcion, descuento)
  • sala(idsala, nombre, butacas, nombrecine, idfuncion)
  • funcion(idfuncion, dia, hora, nombre, idcartelera, idsala)
  • opinion(idopinion, comentario, fecha, calificacion, edad, nombre, apellidopaterno, apellidomaterno)
  • pelicula(nombre, idficha, idfuncion)
  • ficha(idficha, titulodistribucion, sitioweb, genero, subtitulos, titulooriginal, duracion, idioma, pais, estreno, ano, calificacion resumen)
  • actor(nacionalidad, nombre, apellidopaterno, apellidomaterno, idactor)
  • director(nacionalidad, nombre, apellidopaterno, apellidomaterno, iddirector)
  • cartelera(idcartelera, nombrecine)
  • participa(nombre, idactor, iddirector)
  • presenta(nombre, nombrecine)
  • tiene(nombrecine, descripcion)
Ejercicio 10
  • pieza(id, nombre, )
  • mueble(nombre, precio, nopiezas)
  • estante(posicion, pasillo, altura)
  • esta(posicion, nombre)

Conclusión

El trabajar con las formas normales es muy importante para proteger tu base de datos de cualquier error lógico o vulnerabilidad que pueda tener. Por lo dicho anteriormente, es muy importante conocerlas y saber trabajar con ellas para que tu sistema funcione de la mejor manera posible y no sea susceptible a ataques que involucren errores en tu lógica.

domingo, 9 de marzo de 2014

5)Diagramas Modelo Entidad-Relación a Modelo Relacional

Diagramas Modelo Entidad-Relación a Modelo Relacional

Modelo Entidad-Relación:

Este modelo se utiliza para describir un sistema basado en el mundo real, donde las entidades son abstracciones de los objetos reales y los atributos sus características. Estos objetos tienen interrelaciones que los relacionan.

Modelo Relacional:

Fue creado en los laboratorios de IBM en 1970 por Edgar Frank Codd. Este modelo de gestión de datos está basado en la teoría de conjuntos y la lógica de predicados; este modelo no se basa en el orden de almacenamiento de los datos sino que los almacenan en conjuntos, que pueden ser tablas y se crean relaciones a partir de estas.

Pasos Para Pasar Del Modelo Entidad-Relación al Modelo Relacional

  1. Para cada conjunto de entidades fuertes se crea una relación (tabla) con una columna para cada atributo.
  2. Para cada conjunto de entidades débiles se crea una relación que contiene una columna para los atributos que forman la clave primaria de la entidad fuerte a la que se encuentra subordinada y una columna para cada atributo de la entidad.
  3. Para cada interrelación se crea una relación que contiene una columna para cada atributo correspondiente a las claves principales de las entidades interrelacionadas.
  4. Lo mismo para las entidades compuestas añadiendo las columnas necesarias para los atributos añadidos a la interrelación.

Ejercicios:

A continuación haré el cambio de modelo para los 10 ejercicios del modelo entidad-relación de la entrada anterior.

  • cliente()
  • coche(#deaccidentes)
  • tiene()
  • cliente(DNI,nombre,apellidos,telefono,direccion)
  • concesionario()
  • mecanico(DNI,nombre,apellidos,salario)
  • automovil(matricula,modelo,marca,color,nuevo,#unidades,usado,#kmrecorridos)
  • repara(DNI,matricula)
  • compra(DNI,matricula)
  • tiene(DNI)
  • partido(resultado,#departidos)
  • equipo()
  • jugador(#decamiseta,nombre)
  • juega(goles,pases,faltas)
  • juega()
  • tiene()
  • articulo(#articulo,descripcion,existenciadelarticulo)
  • fabrica(#fabrica,telefono,art.producidos)
  • empresa()
  • pedido(cabecera,#cliente,direcciondeenvio,fechadelpedido,hora,cuerpo,linea,cantidad,#articulopedido)
  • cliente(#cliente,limitecredito,descuento,saldo,direcciondeenvio,ciudad,colonia,calle,numero)
  • distribuye(#articulo,#fabrica)
  • tiene(#articulo)
  • tiene(#cliente)
  • tiene(cabecera)
  • proveedor(RUT,telefono,paginaweb,nombre,direccion,ciudad,calle,numero,comuna)
  • producto(id,nombre,precio,stock,proveedor)
  • categoria(id,nombre,descripcion)
  • venta(id,fecha,cliente,descuento,precio,cantidad,montototal)
  • cliente(RUT,nombre,telefono,direccion,ciudad,calle,numero,comuna)
  • provee(RUT,id)
  • organiza(id,id)
  • vende(id,id)
  • hace(id,RUT)
  • aeropuerto(codigo,nombre,pais,ciudad)
  • avion(capacidad,modelo)
  • vuelo(#vuelo,fecha,plazasvacias)
  • programadevuelo(#vuelo,lineaaerea,diadelasemana,sinescalatecnica,conescalatecnica,#deescalas)
  • pertenece(#vuelo)
  • realiza(#vuelo)
  • existe(#vuelo,codigo)
  • tomatierra(codigo)
  • despega/aterriza(codigo,#vuelo)
  • olimpiada()
  • evento(fecha,duracion,#participantes)
  • sede()
  • equipamiento()
  • comisario(tarea,eventos)
  • complejo(areatotal,localizacion,jefeorganizacion)
  • area(indicadorlocalizacion,deporte)
  • tiene(#decomplejos,presupuesto)
  • tiene()
  • tiene()
  • tiene()
  • celebra()
  • necesita()
  • entrenador(nombre,nombredepila,materno,paterno)
  • jugador(nombre,nombredepila,materno,paterno,premio)
  • partido(tipo,modalidad,relevancia,marcador,fecha,premio,premiodeconsolacion)
  • arbitro(nombre,nombredepila,materno,paterno)
  • torneo(lugar,ciudad,pais)
  • entrena(fecha,nombre,nombre)
  • participa(nombre,tipo)
  • tiene(tipo,lugar)
  • participa(nombre,tipo)
  • cine(nombre,direccion,telefono)
  • promocion(descripcion,descuento)
  • sala(#identificacion,nombre,butacas)
  • funcion(dia,hora)
  • opinion(#identificacion,comentario,fecha,calificacion,edad,nombre)
  • pelicula()
  • ficha(identificador,titulodedistribucion,urlsitioweb,genero,subtitulos,titulooriginal,duracion,idioma,pais,fechaestreno,año,calificacion,resumen)
  • cartelera()
  • actor(nombre,nacionalidad,participaciones)
  • director(nombre,nacionalidad,participaciones)
  • tiene(nombre)
  • tiene(nombre,#identificacion)
  • tiene(identificador)
  • tiene(#identificacion)
  • exhibe()
  • indica()
  • presenta(#identificacion)
  • envia(nombre)
  • participa()
  • pieza(ID)
  • mueble(nombre,precio,1pieza,variaspiezas)
  • estante(posicion,pasillo,altura)
  • forma(#piezas,ID,nombre)
  • esta(cantidaddepiezas,posicion,nombre)