miércoles, 2 de junio de 2010

Ejercicio desarrollado diseño de base de datos

Ejemplo de proceso de diseño de una base de datos

Enunciado: En una base de datos de control de un torneo de football se maneja la siguiente información:

De los equipos: nombre, color de uniforme, cuantos jugadores, nombre del técnico, jugadores.
De los jugadores: posiciones que juegan, nombre, edad, equipo en el que juega
De los árbitros: Tipo de árbitro, nombre
De las canchas: Nombre de la cancha, dirección, tamaño, número de personas
De los partidos: fecha y hora del partido, fecha y hora de finalización, resultado, equipos que se enfrentaron.

Se pide: Diseñar la base de datos

Desarrollo:
Como primer paso, incluimos llaves artificiales en cada conjunto de entidades para facilitar la normalización:
De los equipos: código Equipo, nombre, color de uniforme, cuantos jugadores, nombre del técnico, jugadores
De los jugadores: código Jugador, posiciones que juega , nombre, edad, equipo en el que juega
De los árbitros: código árbitro, tipo de árbitro, nombre
De las canchas: código cancha, Nombre de la cancha, dirección, tamaño, número de personas
De los partidos: código partido, fecha y hora del partido, fecha y hora de finalización, resultado, equipos que se enfrentaron.

Modificando los nombres de los campos para que indiquen el nombre de la tabla a la que pertenecen y ordenando los campos

De los equipos: codigoEquipo, nombreEquipo, colorUniforme, numeroJugadores, nombreTecnico, nombreJugadores
De los jugadores: codigoJugador, nombreJugador, posicionesJugador, edadJugador, nombreEquipo
De los árbitros: codigoArbitro, nombreArbitro , tipoArbitro
De las canchas: codigoCancha, nombreCancha, direccionCancha, medidasCancha, numeroPersonas
De los partidos: codigoPartido, fechaHoraInicio, fechaHoraFin, resultado, nombreEquipos.

1) Modelado Conceptual




2) Modelado Relacional

canchas(codigoCancha, nombreCancha, direccionCancha, medidasCancha, numeroPersonas)
equipos(codigoEquipo, nombreEquipo, coloruniforme, numeroJugadores, nombreTecnico, nombreJugadores)
jugadores(codigoJugador, nombreJugador, posicionesJugador, edadJugador, nombreEquipo, codigoEquipo)
arbitros(codigoArbitro, nombreArbitro, tipoArbitro)
partidos(codigoPartido, nombreEquipos, resultadoPartido, fechaHoraInicioPartido, fechaHoraFinPartido, codigoCancha)
equiposxpartidos(codigoEquipo, codigoPartido)
arbitrosxpartidos(codigoarbjtro, codigoPartido)

3) Normalización

Aplicando 2FN a equipos

codigoEquipo --> nombreEquipo
codigoEquipo --> colorUniforme
codigoEquipo --> numeroJugadores
codigoEquipo --> nombreTecnico
codigoEquipo --> | nombreJugadores

Separando la relación tenemos:

jugadores (codigoEquipo, nombrejugador)

Como ya existía una relación jugadores, simplemente quitamos el atributo nombreJugadores de la relación equipos y dejamos la relación jugadores como estaba al principio. De tal manera que nos quedan estas relaciones:

equipos(codigoEquipo, nombreEquipo, coloruniforme, numeroJugadores, nombreTecnico)
jugadores(codigoJugador, nombreJugador, posicionesJugador, edadJugador, nombreEquipo, codigoEquipo)

Aplicando FNBC a jugadores:

jugadores(codigoJugador, nombreJugador, posicionesJugador, edadJugador, nombreEquipo, codigoEquipo)

Vemos que el concepto de nombre de equipo pertenece más a equipos que a jugadores, por lo que eliminamos ese atributo de la relación y conservamos el atributo codigoEquipo para mantener el enlace entre las relaciones equipos y jugadores:

jugadores(codigoJugador, nombreJugador, posicionesJugador, edadJugador, codigoEquipo)

Aplicando 2FN a jugadores:

codigoJugador --> | posicionesJugador

Separando la relación posiciones:

posiciones(nombrePosicion, codigoJugador)

Aplicando 4FN a posiciones:

nombrePosicion -->--> codigoJugador

Separamos una relación aparte para posiciones y le agregamos una clave artificial. Además creamos la relación posicionesxjugador ya que entre posiciones y jugadores hay una cardinalidad varios a varios:

posiciones (codigoPosicion, nombrePosicion)
posicionesxjugador (codigoPosicion, codigoJugador)

La relación jugadores nos queda así:

jugadores(codigoJugador, nombreJugador, edadJugador, codigoEquipo)

Aplicando 4FN a árbitro:

tipoArbitro -->--> codigoArbitro
codigoArbitro -->--> tipoArbitro

Vemos otra cardinalidad varios a varios, por lo que creamos la relación tiposArbitros y la relación arbitrosxtipo:

tiposArbitro(codigoTipoArbitro, nombreTipo)
arbitrosxtipo(codigoArbitro, tipoArbitro)

La relación arbitros nos queda:

arbitros(codigoArbitro, nombreArbitro)

Aplicando FNBC a partidos:

partidos(codigoPartido, nombreEquipos, resultadoPartido, fechaHoraInicioPartido, fechaHoraFinPartido, codigoCancha)

Observamos que el atributo nombreEquipos no está relacionado con el concepto de partidos, por lo que lo borramos de la relación, lo cual no hace perder el enlace con equipos ya que disponíamos anteriormente de una relación equiposxpartidos.

partidos(codigoPartido, resultadoPartido, fechaHoraInicioPartido, fechaHoraFinPartido, codigoCancha)

Aplicando 1FN a arbitros, jugadores y cancha:

arbitros(codigoArbitro, apellido1Arbitro, apellido2Arbitro, nombreArbitro)
jugadores(codigoJugador, apellido1Jugador, apellido2Jugador, nombreJugador, edadJugador, codigoEquipo)
canchas(codigoCancha, nombreCancha, ciudadCancha, calleCancha, paisCancha, medidasCancha, numeroPersonas)

Aplicando 4FN a canchas:

pasiCancha -->--> nombreCancha

Existe cardinalidad uno a varios, creamos la relación países, a la cual le agregamos una clave artificial, la cual será foránea en canchas:

países(codigoPais, nombrePais)
canchas(codigoCancha, nombreCancha, ciudadCancha, calleCancha, , medidasCancha, numeroPersonas, codigoPais)

Como ajustes finales: el atributo edadJugador de la relación jugadores puede ser calculado a partir de la fecha de nacimiento del jugador, por lo que hacemos dicha sustitución. De igual manera, el atributo resultadoPartido de la relaciónpartidos puede ser calculado a partir del nómero de tantos del equipo 1 y número de tantos del equipo 2, por lo que lo dividimos en esos dos atributos:

jugadores(codigoJugador, apellido1Jugador, apellido2Jugador, nombreJugador, fNacimientoJugador, codigoEquipo)

partidos(codigoPartido, numeroGoles1, numeroGoles2, fechaHoraInicioPartido, fechaHoraFinPartido, codigoCancha)

Las relaciones finales que nos han quedado son:

1. arbitros(codigoArbitro, apellido1Arbitro, apellido2Arbitro, nombreArbitro)

2. tiposArbitro(codigoTipoArbitro, nombreTipo)


3. arbitrosxtipo(codigoArbitro, tipoArbitro)


4. equipos(codigoEquipo, nombreEquipo, colorUniforme, numeroJugadores, nombreTecnico)


5. jugadores(codigoJugador, apellido1Jugador, apellido2Jugador, nombreJugador, fNacimientoJugador, codigoEquipo)


6. posiciones (codigoPosicion, nombrePosicion)


7. posicionesxjugador (codigoPosicion, codigoJugador)


8. canchas(codigoCancha, nombreCancha, ciudadCancha, calleCancha, , medidasCancha, numeroPersonas, codigoPais)


9. países(codigoPais, nombrePais)


10. partidos(codigoPartido, numeroGoles1, numeroGoles2, fechaHoraInicioPartido, fechaHoraFinPartido, codigoCancha)


11. equiposxpartidos(codigoEquipo, codigoPartido)


12. arbitrosxpartidos(codigoarbjtro, codigoPartido)



Las interrelaciones uno a varios quedan así:

Relación “uno”

Relación “varios”

arbitros

arbitrosxpartido

partidos

arbitrosxpartido

tiposArbitros

arbitrosxtipo

arbitros

arbitrosxtipo

jugadores

posicionesxjugador

posiciones

posicionesxjugador

países

canchas

canchas

partidos

equipos

jugadores

equipo

equiposxpartidos

partidos

equiposxpartidos


Seguidores