Você está na página 1de 31

I.E.

S JAUME II EL JUST Especialidad Administracin de Sistemas en Red Curso 1o ASIX ASIGNATURA SISTEMAS GESTORES DE BASES DE DATOS

Nstor Pastor Piera

Fecha: 29/05/12

IES Jaume II el Just 1 INDICE 1 ndice 2 Introduccin 3 Anlisis de requerimientos 4 Anlisis esttico 4.1 Entidades, atributos asociados y dominios 4.1.1 Especializaciones 4.2 Relaciones, atributos propios y dominios 4.2.1 Agregaciones 4.3 Diagrama EER con todos los atributos 4.4 RI's no representables 4.5 Transacciones de usuario 5 Diseo esttico 5.1 Paso a tablas 5.2 Normalizacin (hasta FNBC no redundante) 5.3 Transacciones de usuario sobre las relaciones normalizadas. 6 Implementacin fsica que funcione bajo MySQL 5.1.41-3ubuntu12.10 6.1 Create database 6.2 Crear las tablas 6.3 Inserts de prueba 6.4 Crear usuarios 6.5 Transacciones de usuario correspondientes al apartado 5.3 y comprobacin con usuario creado. 7 DD (diccionario de datos sobre las tablas normalizadas) 8 Conclusiones finales del proyecto. 18 18 22 23 23 27 31 11 14 17 5 8 8 9 9 10 10 2 3 3

Nstor Pastor Piera

2/31

IES Jaume II el Just 2 INTRODUCCION

El objetivo de este proyecto tiene como finalidad crear una base de datos para la filial de una empresa de venta de artculos al por menor. La empresa se jerarquiza en mltiples filiales por pas. Por polticas internas desarrolladas para la optimizacin de los sistemas informticos implementados, se utilizar la base de datos resultante de este proyecto a modo plantilla para todas las filiales de Espaa. El sistema gestor utilizado va a ser MySQL. MySQL es un sistema cliente servidor de administracin de bases de datos relacionales que trabaja bajo sistemas UNIX/LINUX y Windows, adems ofrece compatibilidad con PHP, Perl, C y HTML. Teniendo en cuenta los conocimientos alcanzados en esta etapa de la formacin, habrn partes del proyecto que diferirn de la realidad. El motivo es poder cumplir con el mayor nmero de requerimientos sin utilizar lenguajes de programacin. El resultado final ser una base de datos lgica y optimizada sobre la que podamos realizar todas y cada una de las transacciones de usuario descritas en el siguiente anlisis de requerimientos.

ANALISIS DE REQUERIMIENTOS

En un anlisis previo surgen los siguientes requerimientos. Llevar un registro de las ventas y de los pedidos. De los artculos debemos saber obligatoriamente la referencia, el precio de venta, la descripcin, opcionalmente el precio promocional en el caso de que algn artculo est de promocin y las existencias disponibles. Existen dos supuestos diferentes para pedir nuevos artculos, uno denominado hoja de pedido y otro denominado pedido de cliente. La hoja de pedido se realiza por un nico empleado y un mismo empleado puede hacer muchas hojas de pedido, las cuales debern contener un nmero de referencia, los artculos que se piden, y obligatoriamente un registro de cuando se efecta este tipo de pedido, fecha y hora. Los empleados pueden ser fijos o temporales, lgicamente un empleado no puede ser fijo y temporal al mismo tiempo, pero s ser contratado temporalmente y ms tarde hacerle fijo. Los temporales son contratados por una ett y los fijos por la central de la empresa en Madrid, por lo cual la informacin que guardamos va en funcin del tipo de empleado. Para ambos tipos guardamos nombre completo, dni y direccin completa, siendo el nombre y el dni obligatorios. Slo gestionamos lo contratos de los trabajadores fijos, de los trabajadores temporales solamente hay que saber la ett que gestiona su contratacin, siendo este dato obligatorio. Del contrato guardamos, el nmero de contrato 'obligatorio', la duracin, la fecha de inicio, las horas semanales para las que se contrata pudiendo ser 16, 24, 30 o 40, el nmero de seguridad social del empleado y el nmero de cuenta corriente, siendo estos dos ltimos datos obligatorios. Todo contrato tiene que tener un empleado fijo relacionado y todo empleado fijo un contrato.

Nstor Pastor Piera

3/31

IES Jaume II el Just Cuando un cliente nos pide un artculo agotado existe la posibilidad de pedirlo, esto se denomina pedido de cliente. El pedido de cliente se realiza por un nico cliente y un mismo cliente puede hacer muchos pedidos, los cuales debern contener un nmero de referencia, los artculos que se piden y obligatoriamente un registro de cuando se efecta este tipo de pedido, fecha y hora. Todo pedido de cliente referencia a un cliente 'obligado'. Cuando hacemos una venta generamos un recibo (ticket) de venta que contendr obligatoriamente, un nmero de referencia, los artculos vendidos con su descripcin, su precio de venta y su precio promocional si existe y el momento en concreto en que se hace la venta fecha/hora, pero adems podemos generar una factura a peticin del cliente, en cuyo caso deberemos tener los siguientes datos del cliente, obligatoriamente nombre completo, cif, direccin completa, telfono fijo, telfono mvil que pueden ser varios y email. La factura tiene, nmero de factura, .(corto aqu para no alargar demasiado el proyecto). Una factura slo puede ser generada por un recibo, un recibo slo puede generar una factura y toda factura se relaciona con algn recibo. Tambin debemos poder agrupar tanto a los clientes como a los empleados por zonas geogrficas, o ms concretamente por poblacin o por provincia. As pues relacionamos tanto a los clientes como a los empleados con sus respectivas poblaciones de residencia. Una poblacin puede tener ms de un cdigo postal, pero adems tambin puede compartirlo con otra poblacin vecina, as que la manera de identificar a que poblacin corresponde una direccin, es vincularla con un cdigo postal y un nombre de poblacin a la vez, ambos datos unidos forman un identificador nico, opcionalmente se guarda el nombre de la provincia a la que pertenece la poblacin. En una poblacin pueden haber varios clientes y varios empleados pero tanto los empleados como los clientes slo pueden estar relacionados con una poblacin y adems es obligatorio que lo estn. Podemos consultar al final del da cuantos clientes han comprado y cuantos artculos se han vendido. Hacer comparativas con la misma semana del ao anterior para ver si superan ventas. Debemos poder agrupar a los empleados por zonas geogrficas. La recepcin de mercancas las pueden realizar varios empleados juntos pero slo empleados fijos, las existencias de el almacn se actualizarn por dos motivos, recepcin o venta de artculos.

Nstor Pastor Piera

4/31

IES Jaume II el Just 4 ANALISIS ESTATICO

4.1

Entidades, atributos asociados y dominios:

ENTIDAD:ARTICULOS descripcin pc pvp preprom ref stock varchar(40) float(6,2) float(6,2) float(6,2) smallint(6) int primary key derivado not null not null not null descripcin del artculo. precio de compra precio de venta al pblico precio promocional cdigo del articulo autoincrementativo y zerofill. estocaje de artculos.

ENTIDAD:CLIENTE cif cp char(9) char(5) primary key not null, C.Ajena cif cdigo postal de la poblacin

dccion email nombre telfij telmov

varchar(50) varchar(30) varchar(30) char(9) char(9) multievaluado not null

direccin completa, calle y n correo electrnico nombre completo telfono fijo telfono mvil del cliente

ENTIDAD:CONTRATO cc dni varchar(25) char(9) not null not null C.Ajena cuenta corriente del empleado dni del empleado

Nstor Pastor Piera

5/31

IES Jaume II el Just duracion fechainicio horas num nss varchar(10) date smalint varchar(5) varchar(15) enum [16|24|30|40] primary key not null tiempo que durar el contrato fecha de incorporacion horas trabajadas semanales nmero del contrato nmero de afiliacin a la seguridad social

ENTIDAD:EMPLEADO cp dccion dni nombre char(5) varchar(50) char(9) varchar(30) primary key not null not null, C.Ajena cdigo postal de la residencia direccin completa, calle y n dni del empleado nombre completo

ENTIDAD:FACTURA num ticket int int primary key C.A, Unique not null nmero de factura autoincrementativo nmero de ticket

ENTIDAD:HOJAPED dni fecha num char(9) datetime int C.Ajena, not null not null primary key dni del empleado fecha y hora de hoja de pedido nmero de hoja de pedido autoincrementativo

ENTIDAD:LINEAHOJA cant num hoja int int unsigned int primary key primary key C.Ajena cantidad de articulos nmero de linea nmero de hoja de pedido

Nstor Pastor Piera

6/31

IES Jaume II el Just articulo smallint(5) not null, C.Ajena cdigo del articulo

ENTIDAD:LINEAPD cant num pedido articulo int int unsigned int smallint(5) primary key primary key C.Ajena not null, C.Ajena cantidad de articulos nmero de linea nmero de pedido cdigo del artculo

ENTIDAD:LINEATK cant num ticket articulo int int unsigned int smallint(5) primary key primary key, C.Ajena not null, C.Ajena cantidad de articulos nmero de linea nmero de ticket cdigo del artculo

ENTIDAD:PEDIDO cif fecha num char(9) datetime int not null, C.Ajena not null primary key cif del cliente fecha y hora del pedido de cliente nmero de pedido autoincrementativo

ENTIDAD:POBLACION cp nombre char(5) varchar(30) primary key primary key not null provincia varchar(30) provincia a la que pertenece cdigo postal nombre de la poblacin

Nstor Pastor Piera

7/31

IES Jaume II el Just ENTIDAD:TICKET cif fecha num char(9) datetime int C.Ajena not null primary key cif del cliente fecha y hora del ticket nmero de ticket autoincrem.

4.1.1

Especializaciones:

ENTIDAD SUBTIPO: FIJO dni char(9) PK, C.Ajena dni del empleado

ENTIDAD SUBTIPO: TEMPORAL dni ett char(9) varchar(30) PK, C.Ajena not null dni del empleado nombre de la ett intermediaria.

4.2

Relaciones, atributos propios y dominios: RELACION: GENERA RELACION: GENERA2 RELACION: HACE fecha datetime notnull hora y fecha en que el cliente hace el pedido

RELACION: HOJAR RELACION: HOJLI RELACION: PDAR RELACION: PELI RELACION: PERTENECER RELACION: RECEPCION fecha Nstor Pastor Piera date fecha en que un empleado 8/31

IES Jaume II el Just recibe mercancas. Cant int not null cantidad de articulos recibidos

RELACION: REDACTAR fecha datetime notnull fecha y hora en que un empleado hace una hoja de demanda

RELACION: RESIDIR RELACION: TENER RELACION: TILI

4.2.1

Agregaciones: Los requerimientos del proyecto no precisan de ninguna agregacin para el desarrollo del esquema relacional.

4.3

Diagrama EER:

Nstor Pastor Piera

9/31

IES Jaume II el Just

4.4

RI's no representables: - No podemos dar de alta un empleado que tenga menos de 20 aos.

4.5

Transacciones de usuario: - Sacar un listado de los artculos vendidos en un mismo da y la cantidad total para fines estadsticos. - Calcular las ventas realizadas en un mismo da (nmero de operaciones) tambin para fines estadsticos. - Hacer una comparativa cada sbado al cierre de cajas con la misma semana del ao anterior, superamos ventas o no? - Agrupar a los empleados por zonas geogrficas, por ejemplo: no queremos que el departamento contable vea todas la personas de una poblacin sino nicamente los empleados.(creamos vista) - Un cliente nos pide un artculo del que no tenemos existencias. - Hacer el pedido semanal. - Hacemos una venta, generamos recibo, factura y actualizamos stock. - Hacemos una venta que no genera factura, actualizamos stock. - Damos de alta un nuevo cliente en el sistema, no tenemos su poblacin registrada. - Damos de alta en el sistema un nuevo empleado con contrato fijo. - Damos de alta en el sistema un nuevo empleado con contrato temporal, su poblacin de residencia no est en el sistema. - Dar de alta nuevos artculos. - Modificamos un pedido de cliente. - Ampliamos una hoja de pedido. - Amplan el cdigo postal de una poblacin, lo actualizamos. - Recibimos nuevas mercancas, actualizamos stock.

Nstor Pastor Piera

10/31

IES Jaume II el Just 5 5.1 DISEO ESTATICO Paso a tablas:

RESOLVER ESPECIALIZACIONES: EMPLEADO = dni + dccion + nombre VNN: nombre

FIJO = dni C.Ajena: dni EMPLEADO(dni)

TEMPORAL = dni + ett C.Ajena: dni EMPLEADO(dni) VNN: ett

RI's: EMPLEADO [dni] = FIJO[dni] U TEMPORAL[dni] FIJO TEMPORAL = 0

TRANSFORMAR ENTIDADES FUERTES Y RELACIONES:

CLIENTE = cif + dccion + email + nombre + telmov + telfij + cp VNN: nombre C.Ajena: cp POBLACION [cp+nombre] VNN: cp TICKET = num + cif + fecha C.Ajena: cif CLIENTE [cif] VNN: fecha

Nstor Pastor Piera

11/31

IES Jaume II el Just FACTURA = num + ticket C.Ajena: ticket TICKET [num] C.Alternativa: num2 VNN: num2 POBLACION = cp + nombre + provincia ARTICULOS = ref + pc + preprom + pvp + stock + descripcion VNN: pc VNN: pvp VNN: descripcion PEDIDO = num + cif + fecha C.Ajena: cif CLIENTE[cif] VNN: cif VNN: fecha HOJAPED = num + fecha + dni C.Ajena: dni EMPLEADO[dni] VNN: dni VNN: fecha EMPLEADO = dni + dccion + nombre + cp VNN: nombre C.Ajena: cp POBLACION[cp+nombre] VNN: cp CONTRATO = num + cc + duracion + fechainicio + horas + nss + dni VNN: cc VNN: nss C.Ajena: dni EMPLEADO[dni] VNN: dni RECEPCION = articulo + empleado + fecha + cant C.Ajena: articulo ARTICULO[ref]

Nstor Pastor Piera

12/31

IES Jaume II el Just C.Ajena: empleado FIJO[dni] VNN: cant

TRANSFORMAR ENTIDADES DEBILES:

LINEATK = num + ticket + articulo + cant C.Ajena: ticket TICKET[num] C.Ajena: articulo ARTICULO[ref] VNN: articulo LINEAPD = num + pedido + articulo + cant C.Ajena: pedido PEDIDO[num] C.Ajena: articulo ARTICULO[ref] VNN: articulo LINEAHOJA = num + hoja + articulo + cant C.Ajena: hoja HOJAPED[ref] C.Ajena: articulo ARTICULO[ref] VNN: articulo

TRANSFORMAR LAS RI's REPRESENTADAS EN EL E/R: RI: FIJO[dni] CONTRATO[dni] CONSIDERACIONES DE DISEO: Las entidades TICKET, PEDIDO y HOJAPED se relacionan con la entidad ARTICULOS con cardinalidad N a N, para evitar relaciones n a n, se crean las entidades LINEATK, LINEAPD, LINEAHOJA. As queda, 1 a N (TICKET, LINEATK), 1 a N (LINEATK, ARTICULOS), 1 a N (PEDIDO, LINEAPD), 1 a N (LINEAPD, ARTICULOS), 1 a N (HOJAPED, LINEAHOJA) y 1 a N (LINEAHOJA, ARITUCLOS). La relacin POBLACION tiene una clave principal compuesta por el cdigo postal y el nombre de la poblacin, ya que varias poblaciones diferentes pueden compartir los mismo cdigo postal.

Nstor Pastor Piera

13/31

IES Jaume II el Just 5.2 Normalizacin: 1 FORMA NORMAL: Eliminar atributos multievaluados. CLIENTE = cif + dccion + email + nombre + telfij + cp VNN: nombre C.Ajena: cp POBLACION [cp+nombre] VNN: cp MOVCLIENTE = cif + telmov C.Ajena: cif CLIENTE[cif] Optimizacin de claves: MOVCLIENTE = cif + telmov C.Ajena: cif CLIENTE[cif] VNN: cif 2 FORMA NORMAL: Dependencia funcional completa: Todas las relaciones estn en 1FN y todos sus atributos dependen de la totalidad de la clave principal y no de parte de ella, por lo tanto, estn en 2FN. 3 FORMA NORMAL: Eliminar dependencias transitivas: CONTRATO = num + cc + duracion + fechainicio + horas + nss VNN: cc VNN: nss C.Ajena: nss NUMEROSS[nss] NUMEROSS = nss + dni C.Ajena= dni EMPLEADO[dni] FORMA NORMAL DE BOYCE-CODD: Todas las relaciones estn en 3 FN, todo determinante es clave principal o clave alternativa y en las relaciones con determinantes que no son clave tienen la clave principal simple, por lo tanto, estn en FNBC.

PASO A TABLAS NORMALIZADO: POBLACION = cp + nombre + provincia

Nstor Pastor Piera

14/31

IES Jaume II el Just EMPLEADO = dni + dccion + nombre + cp VNN: nombre C.Ajena: cp POBLACION[cp] VNN: cp FIJO = dni C.Ajena: dni EMPLEADO(dni) TEMPORAL = dni + ett C.Ajena: dni EMPLEADO(dni) VNN: ett CLIENTE = cif + dccion + email + nombre + telfij + cp VNN: nombre C.Ajena: cp POBLACION [cp] VNN: cp MOVCLIENTE = cif + telmov C.Ajena: cif CLIENTE[cif] VNN: cif TICKET = num + cif + fecha C.Ajena: cif CLIENTE [cif] VNN: fecha FACTURA = num + ticket C.Ajena: ticket TICKET [num] C.Alternativa: ticket VNN: ticket ARTICULOS = ref + pc + preprom + pvp + stock + descripcion VNN: pc VNN: pvp VNN: descripcion PEDIDO = num + cif + fecha

Nstor Pastor Piera

15/31

IES Jaume II el Just C.Ajena: cif CLIENTE[cif] VNN: cif VNN: fecha HOJAPED = num + fecha + dni C.Ajena: dni EMPLEADO[dni] VNN: dni VNN: fecha NUMEROSS = nss + dni C.Ajena= dni EMPLEADO[dni] CONTRATO = num + cc + duracion + fechainicio + horas + nss VNN: cc VNN: nss C.Ajena: nss NUMEROSS[nss] RECEPCION = articulo + empleado + fecha + cant C.Ajena: articulo ARTICULO[ref] C.Ajena: empleado FIJO[dni] VNN: cant LINEATK = num + ticket + articulo + cant C.Ajena: ticket TICKET[num] C.Ajena: articulo ARTICULO[ref] VNN: articulo LINEAPD = num + pedido + articulo + cant C.Ajena: pedido PEDIDO[num] C.Ajena: articulo ARTICULO[ref] VNN: articulo LINEAHOJA = num + hoja + articulo + cant C.Ajena: hoja HOJAPED[ref] C.Ajena: articulo ARTICULO[ref]

Nstor Pastor Piera

16/31

IES Jaume II el Just VNN: articulo RESUMEN RESTRICIONES: FIJO[dni] CONTRATO[dni] FIJO TEMPORAL = 0 EMPLEADO [dni] = FIJO[dni] U TEMPORAL[dni] 5.3 Transacciones de usuario sobre las relaciones normalizadas. - Sacar un listado de los artculos vendidos en un mismo da y la cantidad total, para fines estadsticos. Inserto datos en ticket(num,fecha), linea_tk(nun,ref,cant). - Calcular las ventas realizadas en un mismo da (nmero de operaciones) tambin para fines estadsticos. Inserto datos en ticket(num,fecha) - Hacer una comparativa cada sbado al cierre de cajas con la misma semana del ao anterior, superamos ventas o no? Inserto datos en ticket(num,fecha) - Un cliente nos pide un artculo del que no tenemos existencias. Inserto datos en pedido(cif,fecha,num), lineapd(num,pedido,cant). - Hacer el pedido semanal. Inserto datos en hojaped (dni, fecha, ref), lineahoja (num, hoja, cant). - Hacemos una venta, generamos recibo y factura. Inserto datos en ticket(num,fecha), lineatk(num,ticket,cant), factura(num) y actualizo articulos(stock, ref,cant). - Hacemos una venta que no genera factura. Actualizo stock. Inserto datos en ticket(num,fecha), lineatk(num,ticket,cant) y actualizo articulos(stock, ref,cant). - Damos de alta un nuevo cliente en el sistema, no tenemos su poblacin registrada. Inserto datos en cliente(cif,cp,email,nombre,dccion,telfij), telmov(cif,telmov), poblacion(cp,nombre,provincia). - Damos de alta en el sistema un nuevo empleado con contrato fijo. Inserto datos en empleado(dni,dccion,nombre,cp), fijo(dni), contrato(num, cc,nss, duracion,horas,fechainicio), numeross(num,dni). - Damos de alta en el sistema un nuevo empleado con contrato temporal, su poblacin de residencia no est en el sistema. Inserto datos en empleado (dni, dccion, nombre, cp), temporal(dni, ett), poblacion(cp,nombre,provincia). - Dar de alta nuevos artculos. Inserto datos en articulos (ref, pc, pvp, preprom, descripcion) - Modificamos un pedido de cliente. Actualizo datos de lineapd(num,pedido, articulo, cant). Nstor Pastor Piera 17/31

IES Jaume II el Just - Ampliamos una hoja de pedido. Actualizo datos de lineahoja(num,hoja,articulo, cant). - Aaden un nuevo cdigo postal a una poblacin, lo actualizamos. Actualizo datos de poblacion(cp). - Recibimos nuevas mercancas, actualizamos stock. Actualizo datos de acticulos(stock, ref, cant, descripcion)

6 6.1

IMPLEMENTACIN FSICA QUE FUNCIONE BAJO MySQL 5.1.41 Create database mysql>create database DB;

6.2

Crear las tablas create table poblacion(cp char(5), nombre varchar(30), provincia varchar(30), primary key(cp,nombre))engine=InnoDB; create table empleado(dni char(9) primary key, dccion varchar(50), nombre varchar(30) not null, cp char(5) not null, index fk_cp (cp), constraint foreign key fk_cp (cp) references poblacion(cp) on delete no action on update cascade)engine=InnoDB; create table fijo(dni char(9) primary key, index fk_dni(dni), constraint foreign key fk_dni(dni) references empleado(dni) on update cascade on delete no action)engine=InnoDB;

create table temporal(dni char(9) primary key, ett varchar(30), index fk_dni(dni), constraint foreign key fk_dni(dni) references empleado(dni) on update cascade on Nstor Pastor Piera 18/31

IES Jaume II el Just delete no action)engine=InnoDB; create table cliente(cif char(9) primary key, cp char(5) not null, dccion varchar(50), email varchar(30), nombre varchar(30)not null, telfij char(9), index fk_cp (cp), constraint foreign key fk_cp (cp) references poblacion(cp) on delete no action on update cascade) engine=InnoDB; create table movcliente(cif char(9) not null, telmov char(9) primary key, index fk_cif(cif), constraint foreign key fk_cif (cif) references cliente(cif) on update cascade on delete no action)engine=InnoDB; create table ticket(num int(11) auto_increment, cif char(9), fecha datetime not null, index fk_cif (cif), constraint foreign key fk_cif (cif) references cliente(cif) on update cascade on delete no action, primary key(num))engine=InnoDB; create table factura(num int auto_increment, ticket int(11) not null, unique (ticket), index fk_ticket (ticket), constraint foreign key fk_ticket(ticket) action on update no action, primary key(num)) engine=InnoDB; references ticket(num) on delete no

create table articulos(ref smallint(6), pc float(6,2) not null,

Nstor Pastor Piera

19/31

IES Jaume II el Just pvp float(6,2) not null, preprom float(6,2), stock int, descripcion varchar(40), primary key(ref)) engine=InnoDB; create table pedido(num int(11) auto_increment, cif char(9) not null, fecha datetime not null, index fk_cif (cif), constraint foreign key fk_cif (cif) update cascade, primary key (num))engine=InnoDB; create table hojaped(num int auto_increment, fecha datetime not null, dni char(9) not null, index fk2_dni(dni), constraint foreign key fk2_dni(dni) references delete no action, primary key(num)) engine=InnoDB; create table numeross(nss char(15) primary key, dni char(9), index fk_dni(dni), constraint foreign key fk_dni(dni) references empleado(dni) on update cascade on delete no action)engine=InnoDB; create table contrato(num varchar(5), cc varchar(25) not null, nss varchar(15) not null, duracion varchar(10), horas enum ('16','24','30','40'), fechainicio date, index fk_nss(nss), constraint foreign key fk_nss(nss) on update cascade, primary key(num)) engine=InnoDB; references numeross(nss) on delete no action fijo(dni) on update cascade on references cliente (cif) on delete no action on

Nstor Pastor Piera

20/31

IES Jaume II el Just

create table lineatk(num int unsigned, ticket int , articulo smallint(5)not null, cant int, index fk_ticket(ticket), constraint foreign key fk_ticket (ticket) cascade on update cascade, index fk_articulo(articulo), constraint foreign key fk_articulo(articulo) references articulos(ref) on delete no action on update cascade, primary key(num,ticket))engine=InnoDB; create table lineapd(num int unsigned, pedido int, articulo smallint(5) not null, cant int, index fk_pedido(pedido), constraint foreign key fk_pedido (pedido) references pedido (num) on delete cascade on update cascade, index fk_articulo(articulo), constraint foreign key fk_articulo(articulo) references articulos(ref) on delete no action on update cascade, primary key(num,pedido)) engine=InnoDB; create table lineahoja(num int unsigned , hoja int, articulo smallint(5) not null, cant int, index fk_hoja(hoja), constraint foreign key fk_hoja (hoja) references hojaped(num) on delete cascade on update cascade, index fk_articulo(articulo), constraint foreign key fk_articulo(articulo) references action on update cascade, primary key (num,hoja)) engine=InnoDB; articulos(ref) on delete no references ticket(num) on delete

Nstor Pastor Piera

21/31

IES Jaume II el Just create table recepcion(articulo smallint(6), dni char(9), fecha date, cant int not null, index fk_articulo(articulo), constraint foreign key fk_articulo (articulo) references articulos(ref) on delete no action on update cascade, index fk_dni(dni), constraint foreign key fk_dni(dni) references fijo(dni) on delete no action on update cascade, primary key (articulo,dni,fecha))engine=InnoDB; 6.3 Inserts de prueba INSERT INTO poblacion values('46711','Guardamar','Valencia'); INSERT INTO cliente values ('12345678A', '46701', 'Dr.Flming, 38', 'Manuel_AF@hotmail.com','Manuel Aparisi Fort','962860734'); INSERT INTO movcliente values ('12345678A','666123456'); INSERT INTO empleado values('20123456E','c/Repblica Argentina, 128 3 2','Vicente Toledo Hernndez','46700'); INSERT INTO fijo values('20123456E'); INSERT INTO temporal values('20028352A','Laborman'); INSERT INTO contrato values('00001','0207-0925-13- 5627854739', '410048758110', '3 meses','16','2012-03-01'); INSERT INTO numeross values('410048758110','20123456E'); INSERT INTO pedido (num,cif,fecha) values('','12345678A','now()'); INSERT INTO lineapd ('1','1','647368','1'); INSERT INTO ticket (num,cif,fecha) values('','12345679A','now()'); INSERT INTO lineatk ('1','1','647368','2'); INSERT INTO hojaped (num,fecha,dni) values ('','now()','20123456E'); INSERT INTO lineahoja ('1','1','647368','2'); INSERT INTO recepcion ('647368','20028352A','now()','100') INSERT INTO articulos values ('463798','15','25','19.99', '10', plegable Bistro, altura 71cm, verde y azul'); Nstor Pastor Piera 'mesa

22/31

IES Jaume II el Just

6.4 Crear usuarios grant all on DB.* to jp identified by 'joseppastor';

6.5 Transacciones de usuario correspondientes al apartado 5.3 y comprobacin con usuario creado. -Visualizar un ticket: SELECT li.num, li.articulo, ar.descripcion, li.cant, ar.pvp, ar.preprom, li.cant * ar.preprom as Total FROM lineatk li, articulos ar WHERE UNION SELECT li.num, li.articulo, ar.descripcion, li.cant, ar.pvp, ar.pvp as Total FROM lineatk li, articulos ar WHERE ticket = '1' and li.articulo = ar.ref and preprom ORDER BY num; -Visualizar un pedido de cliente: SELECT cif, num,fecha, nombre, telfij FROM pedido natural join cliente; SELECT pe.num as Pedido, li.num as Linea, li.articulo as Articulo, ar.descripcion as Descripcion, li.cant as Cantidad FROM lineapd li, articulos ar, cliente cli, pedido pe WHERE ar.ref = li.articulo and li.pedido = pe.num and pe.cif = cli.cif and cli.nombre = 'Manuel Aparisi Fort' and date(fecha) = date(now()) ORDER BY pedido, linea; - Sacar un listado de los artculos vendidos en un mismo da y la cantidad total, para fines estadsticos: SELECT articulo, cant as cantidad, time(fecha) as hora FROM ticket ti join lineatk li on ti.num = li.ticket where date(fecha)= date(now()); SELECT sum(cant) as 'Total articulos' FROM ticket ti join lineatk li on ti.num = li.ticket where date(fecha)= date(now()); is null ar.preprom, li.cant * ticket = '1' and li.articulo = ar.ref and preprom is not null

Nstor Pastor Piera

23/31

IES Jaume II el Just

- Calcular las ventas realizadas en un mismo da (nmero de operaciones) tambin para fines estadsticos: SELECT count(ti.num) as Ventas FROM ticket ti WHERE ti.fecha like '2012-05-30%'; - Hacer una comparativa cada sbado al cierre de cajas con la misma semana del ao anterior, superamos ventas o no? SELECT sum(li.cant * preprom) as 'Con promocin', sum(li.cant * ar.pvp) as 'Sin promocin' , sum(li.cant * preprom) + sum(li.cant * ar.pvp) as total, '2012' as ao FROM lineatk li, articulos ar, ticket ti WHERE li.articulo = ar.ref and li.ticket = ti.num and ti.fecha between '2012-05-28' and '2012-06-02' UNION SELECT sum(li.cant * preprom) as 'Con promocin', sum(li.cant * ar.pvp) as 'Sin promocin' , sum(li.cant * preprom) + sum(li.cant * ar.pvp) as total, '2011' as ao FROM lineatk li, articulos ar, ticket ti WHERE li.articulo = ar.ref and li.ticket = ti.num and ti.fecha between '2011-05-30' and '2011-06-04'; - Un cliente nos pide un artculo del que no tenemos existencias: INSERT INTO pedido (cif,fecha) values('12345678A',now()); INSERT INTO lineapd values ('1','11','463137','1');

- Hacer el pedido semanal: INSERT INTO hojaped (fecha,dni) values (now(),'20123456E'); INSERT INTO lineahoja ('1','11','647368','2');

- Hacemos una venta, genera recibo, factura y se actualiza el stock: INSERT INTO ticket (cif,fecha) values('12345678A',now()); INSERT INTO lineatk values ('1','12','463102','2');

Nstor Pastor Piera

24/31

IES Jaume II el Just INSERT INTO lineatk values ('2','12','463120','5'); INSERT INTO factura (num,ticket) values ('','11'); UPDATE articulos set stock = stock-2 where ref = ' 463102'; UPDATE articulos set stock = stock-5 where ref = ' 463120';

- Hacemos una venta que no genera factura y se actualiza el stock: INSERT INTO ticket (num,cif,fecha) values('','12345678A',now()); INSERT INTO lineatk values ('1','13','463115','3'); INSERT INTO lineatk values ('2','13','463135','2'); UPDATE articulos set stock = stock-3 where ref = ' 463115'; UPDATE articulos set stock = stock-2 where ref = ' 463135';

- Damos de alta un nuevo cliente en el sistema, no tenemos su poblacin registrada: INSERT INTO poblacion values('46800','Villa inventada', 'Valencia'); INSERT INTO cliente values ('12345678B', '46800', 'Dr.Flming, 'Samuel_AL@hotmail.com','Samuel Aparisi Fort','962800734'); INSERT INTO movcliente values ('12345678B','676124356'); SELECT * FROM cliente cl, poblacion p where cl.cp = p.cp and p.nombre like 'Villa %'; 38',

- Damos de alta en el sistema un nuevo empleado con contrato fijo: INSERT INTO empleado values('20025752N','c/Abad Sola,42 5 13','Sebastian Calln Vsquez','46701'); INSERT INTO fijo values('20025752N'); INSERT INTO numeross values('410186285520','20025752N'); INSERT INTO contrato values('00006','4682-0565-21- 7836748649', '410186285520','6 meses','16',date(now())); SELECT * FROM empleado e, contrato c, numeross num, fijo where c.nss=num.nss and num.dni=fijo.dni and fijo.dni=e.dni and c.fechainicio=date(now());

Nstor Pastor Piera

25/31

IES Jaume II el Just - Damos de alta en el sistema un nuevo empleado con contrato temporal, su poblacin de residencia no est en el sistema: INSERT INTO poblacion values('46900','Pueblo inventado', 'Alicante'); INSERT INTO empleado values('21046292Z','c/Repblica Argentina,109 5 10','Adrin Bou Calera','46900'); INSERT INTO temporal values('21046292Z','TrabajoETT'); SELECT * FROM empleado e,temporal t where e.dni=t.dni and e.nombre like 'Adrin%';

- Dar de alta nuevos artculos: INSERT INTO articulos values ('473121','5','12.99','9.99','30', 'Exprimidor 700ml 75W Limn, blanco o naranja');

- Modificamos un pedido de cliente: UPDATE lineapd SET cant = 3 where articulo = 463120 and pedido = 2; SELECT nombre,p.cif,fecha,p.num as pedido, li.num as linea, articulo,cant as cantidad FROM cliente cl, pedido p, lineapd li where cl.cif=p.cif and li.pedido=p.num and p.num='2' and li.articulo='463120';

- Ampliamos una hoja de pedido: UPDATE lineahoja SET cant = 3 where articulo = 463102 and hoja = 1; SELECT nombre,h.dni,fecha,h.num as Hoja, li.num as linea, articulo,cant as cantidad FROM empleado e, hojaped h, lineahoja li where e.dni=h.dni and li.hoja=h.num and h.num='1' and li.articulo='463102';

- Aaden un nuevo cdigo postal a una poblacin, lo actualizamos: INSERT INTO poblacion values('46702','Gandia','Valencia');

- Recibimos pedido, actualizamos stock: INSERT INTO recepcion values ('463132','20146752H',date(now()),'50'); INSERT INTO recepcion values ('463124','20146752H',date(now()),'15'); Nstor Pastor Piera 26/31

IES Jaume II el Just UPDATE articulos SET stock = stock+50 where ref = '463132'; UPDATE articulos SET stock = stock+15 where ref = '463124'; SELECT * FROM articulos a where ref = '463124' or ref = '463132';

DD (diccionario de datos sobre las tablas normalizadas) ENTIDAD:ARTICULOS descripcion pc pvp preprom ref stock varchar(40) float(6,2) float(6,2) float(6,2) smallint(6) int primary key derivado not null not null not null descripcin del artculo. precio de compra precio de venta al pblico precio promocional cdigo del articulo autoincrementativo y zerofill. estocaje de artculos.

ENTIDAD:CLIENTE cif cp dccion email nombre telfij char(9) char(5) varchar(50) varchar(30) varchar(30) char(9) not null primary key not null, C.Ajena cif cdigo postal de la poblacion direccin completa, calle y n correo electrnico nombre completo telfono fijo

ENTIDAD:CONTRATO cc duracion fechainicio horas num varchar(25) varchar(10) date smalint varchar(5) enum [16|24|30|40] primary key not null cuenta corriente del empleado tiempo que durar el contrato fecha de incorporacion horas trabajadas semanales nmero del contrato

Nstor Pastor Piera

27/31

IES Jaume II el Just nss varchar(15) C.Ajena not null nmero de afiliacin a la seguridad social

ENTIDAD:EMPLEADO cp dccion dni nombre char(5) varchar(50) char(9) varchar(30) primary key not null not null, C.Ajena cdigo postal de la residencia direccin completa, calle y n dni del empleado nombre completo

ENTIDAD:FACTURA num ticket int int primary key C.A, Unique not null nmero de factura autoincrementativo nmero de ticket

ENTIDAD:HOJAPED dni fecha num char(9) datetime int C.Ajena, not null not null primary key dni del empleado fecha y hora de hoja de pedido nmero de hoja de pedido autoincrementativo

ENTIDAD:LINEAHOJA cant num hoja articulo int int unsigned int smallint(5) primary key primary key C.Ajena not null, C.Ajena cantidad de articulos nmero de linea nmero de hoja de pedido cdigo del articulo

ENTIDAD:LINEAPD cant num pedido int int unsigned int primary key primary key C.Ajena cantidad de articulos nmero de linea nmero de pedido

Nstor Pastor Piera

28/31

IES Jaume II el Just articulo smallint(5) not null, C.Ajena cdigo del artculo

ENTIDAD:LINEATK cant num ticket articulo int int unsigned int smallint(5) primary key primary key, C.Ajena not null, C.Ajena cantidad de articulos nmero de linea nmero de tquet cdigo del artculo

ENTIDAD:MOVCLIENTE telmov cif char(9) char(9) primarykey C.Ajena not null ENTIDAD:NUMEROSS dni nss char(9) char(15) not null C.Ajena primary key dni del empleado numero de la seguridad social telfono mvil del cliente cif del cliente

ENTIDAD:PEDIDO cif fecha num char(9) datetime int not null, C.Ajena not null primary key cif del cliente fecha y hora del pedido de cliente nmero de pedido autoincrementativo

ENTIDAD:POBLACION cp nombre char(5) varchar(30) primary key primary key not null provincia varchar(30) provincia a la que pertenece cdigo postal nombre de la poblacin

ENTIDAD:TICKET Nstor Pastor Piera 29/31

IES Jaume II el Just cif fecha num char(9) datetime int C.Ajena not null primary key cif del cliente fecha y hora del ticket nmero de ticket autoincrem.

ENTIDAD SUBTIPO: FIJO dni char(9) PK, C.Ajena dni del empleado

ENTIDAD SUBTIPO: TEMPORAL dni ett char(9) varchar(30) PK, C.Ajena not null dni del empleado nombre de la ett intermediaria.

RELACION: GENERA RELACION: GENERA2

RELACION: HACE fecha datetime notnull hora y fecha en que el cliente hace el pedido

RELACION: HOJAR RELACION: HOJLI RELACION: PDAR RELACION: PELI RELACION: PERTENECER RELACION: RECEPCION fecha Cant date int not null fecha en que un empleado recibe mercancas. cantidad de articulos recibidos

RELACION: REDACTAR fecha datetime notnull fecha y hora en que un empleado hace una hoja de demanda

RELACION: RESIDIR RELACION: TENER Nstor Pastor Piera 30/31

IES Jaume II el Just RELACION: TILI 8 Conclusiones finales del proyecto. En el diseo lgico es importante ser objetivos y saber plasmar exactamente la informacin con la que vamos a trabajar, haciendo un diseo cuanto ms simple mejor, evitando en la medida de lo posible, relaciones ternarias, agregaciones, especializaciones no necesarias, etc... El proceso de normalizacin sirve para optimizar la base de datos, pero tambin nos ensea a realizar un diagrama ms limpio, que precisamente evitar que modifiquemos el paso a tablas al normalizar. Las relaciones n a n mejor desgloasarlas con otra entidad como en factura, linea de factura puesto que en el paso a tablas nos crean una nueva relacin. Las claves primarias compuestas en mltiples ocasiones son necesarias, es importante entender su significado y no simplificarlas en exceso en el proceso de normalizacin, optimizacin de claves.

Nstor Pastor Piera

31/31

Você também pode gostar