Está en la página 1de 8

TRABAJO FINAL DE BASE DE DATOS

Jos Luis Molina Len


Escuela de electrnica y telecomunicaciones,
Universidad de Cuenca.
Jluis.molinal@ucuenca.ec

1. INTRODUCCIN:

El propsito de este proyecto es desarrollar una base de datos que permita el


almacenamiento y manejo de informacin de un campeonato de ftbol. La informacin
involucrada y su manejo se describen a continuacin.

Se asumir que el campeonato involucra a 8 equipos participantes. Tambin se asumir


que
cada equipo va a estar formado por 11 jugadores (ignorando, por motivos de simplicidad,
el hecho de que un equipo normalmente tiene jugadores suplentes). La asignacin de
jugadores a equipos se llevar a cabo usando listas de nombres y apellidos que se
pueden descargar de Internet. Los 8 equipos participantes se enfrentarn entre s en un
sistema de todos contra todos, es decir, cada equipo jugar un partido contra cada uno
de los otros equipos.

Funcionalidades

La base de datos a implementar deber contemplar las siguientes funcionalidades:


Registro de marcadores

Registrar cuntos goles marc cada equipo en el partido


Registrar qu jugadores marcaron los goles
De ser necesario, actualizar la tabla de posiciones

Tabla de posiciones

Deber ser posible la visualizacin de la tabla de posiciones correspondiente a cada


grupo en cualquier momento. La tabla de posiciones tendr el formato del ejemplo a
continuacin:

PJ: Partidos Jugados


PG: Partidos Ganados
PE: Partidos Empatados
PP: Partidos Perdidos
GF: Goles a Favor (goles anotados)
GC: Goles en Contra (goles recibidos)
Puntos: Se asignar 3 puntos por partido ganado, 1 punto por partido empatado, y 0
puntos
por partido perdido
GD: Gol Diferencia (GF - GC)

Esta tabla de posiciones deber estar ordenada en primer lugar por los puntos (orden
descendente, el equipo con ms puntos se muestra primero), en segundo lugar, por el GD
(orden descendente), en tercer lugar, por GF (orden descendente), y en cuarto lugar por
GC (orden ascendente, mientras menos goles recibidos mejor).

Tabla de goleadores

La tabla de goleadores tendr el formato del siguiente ejemplo:

Por razones obvias es muy importante que la tabla de goleadores se muestre ordenada
en forma descendente con respecto al nmero de goles (el jugador con ms goles se
muestra primero).

Especificaciones de implementacin

A pesar de que en este proyecto especfico se tendrn nicamente 8 equipos, el modelo


de base de datos deber disearse de manera flexible, es decir, debera soportar la
participacin de un nmero indeterminado de equipos, cada equipo estar conformado
por un nmero indeterminado de jugadores, etc.

2. DIAGRAMA ENTIDAD RELACIN

Figura 1. Diagrama entidad relacin.

3. TABLAS A PARTIR DEL DIAGRAMA ENTIDAD RELACIN Y NORMALIZACIN

TABLAS A PARTIR DE DIAGRAMA


ENTIDAD RELACIN DESCRIPCIN DEL EJERCICIO

JUGADO JUGADO
EQUIPO R PARTIDO GOLES EQUIPO R PARTIDO
id- id- id- id-
equipo ID partido partido equipo ID goles eq1
id-
nombre equipo id-eq1 id nombre nombre goles eq2
id- id-
nombre id-eq2 equipo equipo apellido jugadores
apellido # goles
PRIMERA FORMA NORMAL SEGUNDA FORMA NORMAL

JUGADO PARTID jugador


EQUIPO JUGADOR PARTIDO EQUIPO R O es
id- id- goles
id-equipo ID id-partido equipo ID partido eq1
goles
nombre nombre goles eq 1 nombre nombre id-EQ1 eq2
id-equipo apellido goles eq2 apellido id-EQ2
id-
jugadores equipo

TERCERA FORMA NORMAL

JUGADO
No son necesarias la cuarta y
EQUIPO R PARTIDO GOLES
quinta formas normales
id-equipo ID id-partido id-partido
nombre id-equipo id-EQ1 id
nombre id-EQ2 id-equipo
apellido # goles

4. SENTENCIAS SQL PARA LA CREACIN DE LA BASE DE DATOS

Creacin de un nuevo usuario para almacenar la base de datos:

connect
Enter user-name: SYSTEM
Enter password:
Connected.

SQL> create user camp identified by 1234;

User created.

SQL> grant CREATE SESSION, ALTER SESSION, CREATE DATABASE LINK, CREATE
MATERIALIZED VIEW, CREATE PROCEDURE, CREATE PUBLIC SYNONYM, CREATE ROLE,
CREATE SEQUENCE, CREATE SYNONYM, CREATE TABLE, CREATE TRIGGER, CREATE TYPE,
CREATE VIEW, UNLIMITED TABLESPACE to camp;

Grant succeded.

SQL> disconnect
SQL> quit

Sentencias SQL para la creacin de tablas:

drop table goles; primary key (id_equipo));


drop table partido;
drop table jugador;
drop table equipo;
create table jugador
create table equipo (id varchar(10) not null,
(id_equipo varchar(15) not null, nombre varchar(20) not null,
nombre varchar(30) not null, apellido varchar(20),
id_equipo varchar(15),
primary key (id),
constraint fkequipo foreign key
(id_equipo) references
equipo(id_equipo)); create table goles
(id_partido varchar(15) not null,
id varchar(10) not null,
id_equipo varchar(15) not null,
create table partido n_goles numeric(4,0)not null,
(id_partido varchar(15) not null, primary key (id_partido, id),
id_equipo1 varchar(15) not null, constraint fkpartido foreign key
id_equipo2 varchar(15) not null, (id_partido) references
primary key (id_partido), partido(id_partido),constraint fkid
constraint fkequipo1 foreign key foreign key (id) references
(id_equipo1) references jugador(id), constraint fkequipo3
equipo(id_equipo), constraint foreign key (id_equipo) references
fkequipo2 foreign key (id_equipo2) equipo(id_equipo));
references equipo(id_equipo));

Mostrar las tablas de la base de datos:

SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS WHERE OBJECT_TYPE =


'TABLE';
desc equipo;
desc jugador;
desc partido;
desc goles;

Figura 1. Tablas de la base de datos.

5. INGRESO DE DATOS

Sentencias SQL para el ingreso de datos:

Equipos: insert into equipo values ('1','equipo1');


Jugadores: insert into jugador values ('3','Francisco','Ascencio,'1');
Partidos: insert into partido values ('1','1','2');
Goles: insert into goles values ('1','5','1',1);

6. MODIFICAR PANTALLA

column object_name format A25;


column object_type format A25;

El tamao de la pantalla/pgina se controla con dos parmetros: LINESIZE y


PAGESIZE que controlan, respectivamente, el tamao de las lneas (nmero de
columnas) y el tamao de la pgina (nmero de lneas). El tamao actual en
un momento dado se puede ver con la orden SHOW, Para modificar estos
valores, se utilizar SET.

SHOW LINESIZE SET LINESIZE 150


SHOW PAGESIZE SET PAGESIZE 80
7. CONSULTAS

TABLA DE select bus.idp as idpar,


GOLEADORES //////////////////////// p.id_equipo2 as ideq2,
/////// bus.ngoles as numgoles
from partido p,(select p.id_partido
CREATE OR REPLACE VIEW goleadores as idp,
as sum(g.n_goles) as ngoles from
select j.id, j.nombre "jugador", partido p, goles g
e.nombre where p.id_partido = g.id_partido
"equipo", c.ngoles from jugador j, and p.id_equipo2 = g.id_equipo
equipo e, (select g.id as cid , group by p.id_partido order by
sum(g.n_goles) as ngoles from goles p.id_partido) bus
g where bus.idp = p.id_partido order
group by g.id) c where c.cid = j.id by bus.idp
and e.id_equipo = j.id_equipo ) con1 on
order by c.ngoles desc, j.nombre partido.id_partido = con1.idpar
asc; order by partido.id_partido;

TABLA DE PARTIDOS
POSICIONES //////////////////////// JUGADOS ///////////////////////////
//////// //

CREATE OR REPLACE VIEW PJJ as


CREATE OR REPLACE VIEW goleq1 as select e.id_equipo as ideq,
select partido.id_partido as idpar, count(p.id_partido) as pj
partido.id_equipo1 as ideq1 , from partido p, equipo e where
case when con1.numgoles is NULL e.id_equipo = p.id_equipo1 or
then 0 else con1.numgoles end as e.id_equipo = p.id_equipo2
ngoles group by e.id_equipo order by
from partido left outer join e.id_equipo;
(
select bus.idp as idpar, GOLES A
p.id_equipo1 as ideq1, FAVOR /////////////////////////////
bus.ngoles as numgoles /
from partido p,(select p.id_partido
as idp, CREATE OR REPLACE VIEW GFF as
sum(g.n_goles) as ngoles from select fn.idequipo as ideq,
partido p, goles g fn.gf as gf from
where p.id_partido = g.id_partido ( select gf.idequipo as idequipo,
and p.id_equipo1 = g.id_equipo sum(gf.goles) as GF
group by p.id_partido order by from
p.id_partido) bus (select e.id_equipo as idequipo,
where bus.idp = p.id_partido order sum(g.ngoles) as goles
by bus.idp from equipo e, goleq1 g
) con1 on where e.id_equipo = g.ideq1
partido.id_partido = con1.idpar group by e.id_equipo
order by partido.id_partido; union
select e.id_equipo as idequipo,
sum(g.ngoles) as goles
CREATE OR REPLACE VIEW goleq2 as from equipo e, goleq2 g
select partido.id_partido as idpar, where e.id_equipo = g.ideq2
partido.id_equipo2 as ideq2 , group by e.id_equipo) gf
case when con1.numgoles is NULL group by gf.idequipo
then 0 else con1.numgoles end as order by gf.idequipo) fn
ngoles order by fn.gf desc;
from partido left outer join
( GOLES EN
CONTRA /////////////////////////
from pgoles
CREATE OR REPLACE VIEW GCC as where pgoles.nge1 > pgoles.nge2
select fn.idequipo as ideq, group by pgoles.ideq1) c1 on
fn.gc as gc from ( equipo.id_equipo = c1.ideq order
select gc.idequipo as idequipo, by equipo.id_equipo) lef1 ,
sum(gc.goles) as GC (select equipo.id_equipo as ideq,
from ( case when c2.pg is NULL then 0
select e.id_equipo as idequipo, else c2.pg end as pg
sum(g2.ngoles) as goles from equipo left outer join
from equipo e, goleq1 g1 , goleq2 (select pgoles.ideq2 as ideq,
g2 count(pgoles.ideq2) as pg
where e.id_equipo = g1.ideq1 from pgoles
and g1.idpar = g2.idpar where pgoles.nge1 < pgoles.nge2
group by e.id_equipo group by pgoles.ideq2) c2 on
union equipo.id_equipo = c2.ideq order
select e.id_equipo as idequipo, by equipo.id_equipo) lef2
sum(g1.ngoles) as goles where lef1.ideq = lef2.ideq
from equipo e, goleq2 g2 , goleq1 order by pg desc;
g1
where e.id_equipo = g2.ideq2 PARTIDOS PERDIDOS /////////////////
and g2.idpar = g1.idpar
group by e.id_equipo) gc CREATE OR REPLACE VIEW pp as
group by gc.idequipo select lef1.ideq as ideq,
order by gc.idequipo) fn (lef1.pp + lef2.pp) as pp from
order by fn.gc desc; (select equipo.id_equipo as ideq,
case when c1.pp is NULL then 0
GOL DE else c1.pp end as pp
DIFERENCIA ////////////////////// from equipo left outer join
(select pgoles.ideq1 as ideq,
CREATE OR REPLACE VIEW GDD as count(pgoles.ideq1) as pp
select e.id_equipo as ideq, from pgoles
gff.gf - gcc.gc as gd where pgoles.nge1 < pgoles.nge2
from equipo e, gff, gcc where group by pgoles.ideq1) c1 on
e.id_equipo = gff.ideq and equipo.id_equipo = c1.ideq order
e.id_equipo = gcc.ideq by equipo.id_equipo) lef1 ,
order by gd desc; (select equipo.id_equipo as ideq,
case when c2.pp is NULL then 0
PARTIDOS TABLA DE else c2.pp end as pp
CONSULTA ///////////////////////// from equipo left outer join
(select pgoles.ideq2 as ideq,
CREATE OR REPLACE VIEW pgoles as count(pgoles.ideq2) as pp
select goleq1.idpar as idpar, from pgoles
goleq1.ideq1 as ideq1, where pgoles.nge1 > pgoles.nge2
goleq2.ideq2 as ideq2, group by pgoles.ideq2) c2 on
goleq1.ngoles as nge1, equipo.id_equipo = c2.ideq order
goleq2.ngoles as nge2 by equipo.id_equipo) lef2
from goleq1, goleq2 where where lef1.ideq = lef2.ideq
goleq1.idpar = goleq2.idpar; order by pp desc;

PARTIDOS GANADOS //////////////// PARTIDOS


EMPATADOS//////////////////
CREATE OR REPLACE VIEW pg as
select lef1.ideq as ideq, CREATE OR REPLACE VIEW pe as
(lef1.pg + lef2.pg) as pg from select lef1.ideq as ideq,
(select equipo.id_equipo as ideq, (lef1.pe + lef2.pe) as pe from
case when c1.pg is NULL then 0 (select equipo.id_equipo as ideq,
else c1.pg end as pg case when c1.pe is NULL then 0
from equipo left outer join else c1.pe end as pe
(select pgoles.ideq1 as ideq, from equipo left outer join
count(pgoles.ideq1) as pg (select pgoles.ideq1 as ideq,
count(pgoles.ideq1) as pe
from pgoles CREATE OR REPLACE VIEW tabpsc as
where pgoles.nge1 = pgoles.nge2 select e.nombre, pjj.pj, pg.pg,
group by pgoles.ideq1) c1 on pe.pe, pp.pp, gff.gf,
equipo.id_equipo = c1.ideq order gcc.gc, (pg.pg*3) + (pe.pe) as
by equipo.id_equipo) lef1 , puntos,
(select equipo.id_equipo as ideq, gdd.gd from equipo e, pjj, pg, pe,
case when c2.pe is NULL then 0 pp, gff, gcc, gdd
else c2.pe end as pe where e.id_equipo = pjj.ideq and
from equipo left outer join e.id_equipo = pg.ideq
(select pgoles.ideq2 as ideq, and e.id_equipo = pe.ideq and
count(pgoles.ideq2) as pe e.id_equipo = pp.ideq and
from pgoles e.id_equipo = gff.ideq and
where pgoles.nge1 = pgoles.nge2 e.id_equipo = gcc.ideq and
group by pgoles.ideq2) c2 on e.id_equipo = gdd.ideq
equipo.id_equipo = c2.ideq order order by puntos desc, gdd.gd desc ,
by equipo.id_equipo) lef2 gff.gf desc, gcc.gc asc;
where lef1.ideq = lef2.ideq
order by pe desc;
SHOW LINESIZE
column object_name format A10; SHOW PAGESIZE
Column object_type format A10; SET LINESIZE 150
SET PAGESIZE 80
TABLA DE
POSICIONES //////////////////////

También podría gustarte