Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Normalizacion de base de datos mysql

Estas en el tema de Normalizacion de base de datos mysql en el foro de Mysql en Foros del Web. Estoy comenzando recién con el tema de la ‘normalizacion’ de bases de datos Mysql y tengo algunas dudas. La BD sin normalizar tiene una tabla ...
  #1 (permalink)  
Antiguo 21/12/2005, 20:11
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Normalizacion de base de datos mysql

Estoy comenzando recién con el tema de la ‘normalizacion’ de bases de datos Mysql y tengo algunas dudas.

La BD sin normalizar tiene una tabla llamada ‘melodias’ con los siguientes campos:

id
interprete
titulo

El campo que necesita normalizarse es ‘interprete’ por que se repite varias veces

Para listar todos los registros de la tabla melodías se tendría que hacer una sola consulta: select * from `melodias`

Al normalizar esta BD resultan dos tablas ‘melodias’ e ‘interpretes’ y tienen los siguientes campos:

melodías

id
id_interprete
titulo

interpretes

id_interprete
nombre

Ahora como se puede ver queda la tabla ‘melodias’ (donde se almacenan todos los registros) y la tabla ‘interpretes’ (que contiene todos los registros repetidos) una esta relacionada con la otra gracias el campo ‘id_interprete’.

En este caso para listar todos los registros de la tabla ‘melodias’ y al mismo tiempo hacer la relación con la tabla ‘interpretes’ ¿Que tipo de consulta debo aplicar?

Saludos…
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #2 (permalink)  
Antiguo 21/12/2005, 22:12
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
La consulta seria mas o menos asi:

Código:
SELECT id, titulo, nombre
FROM melodías INNER JOIN interpretes
ON interpretes.id_interprete = melodías.id_interprete
cualquier cosa que no entiendas, JUST ASK
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #3 (permalink)  
Antiguo 22/12/2005, 07:53
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 18 años, 5 meses
Puntos: 5
Sonrisa

otra posible solucion seria:
Código:
SELECT id, titulo, nombre
FROM melodías m,  interpretes i
WHERE i.id_interprete = m.id_interprete
cya
  #4 (permalink)  
Antiguo 22/12/2005, 13:39
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Muy bien TolaWare y deadlykyo, ambas consultas funcionan, se agradece la ayuda , ahora continuando la normalización de mi base de datos, les presento el siguiente modelo, es sencillo y según yo sigue ‘la primera forma normal’, la función que cumple este modelo es la de almacenar datos de canciones (melodías), entonces como los interpretes y las categorías se llegan a repetir, ahora están en tablas aparte para relacionar a través de ID’s.



Me gustaría me dijeran si el modelo esta diseñado correctamente o que debo corregir para no tener problemas de lógica en un futuro. Como este modelo hace relaciones con las 3 tablas (melodías, interpretes y categorías), pues hago la pregunta: ¿Cómo debo ahora construir la consulta para extraer los datos de la tabla melodías y sus relaciones? ¿Se hace con JOIN?

Gracias por la ayuda…

Saludos.
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #5 (permalink)  
Antiguo 22/12/2005, 15:09
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 18 años, 5 meses
Puntos: 5
Bueno mira sino me equivoco tus tres tablas que tienes Melodias, Interpretes y Categorias son catalogos de datos cierto, me explico, catalogo quiero decir en que en Melodias tienes puros datos de melodias y datos referentes a las mismas y lo mismo con interpretes y categorias, si la cosa es asi creo que deberia existir una tabla intermedia mas entre esas tres tablas que contenga solo las llaves foraneas de tus otras tres tablas, ya que supongo que pueden existir melodias en mas de una categoria y por mas de un interprete, bueno eso creo, algo asi seria

intermedia
----------------
id
Id_interprete
id_categoria

Ahora si tienes este caso de la tabla intermedia y tienes que recuperar los datos de las padres de esta tabla intermedia tienes que hacer joins entre las tres tablas con la intermedia

Código PHP:

SELECT 

FROM melodias melinterpretes intcategoria catintermedia in
WHERE in
.id_interprete int.id_interprete AND in.id mel.id AND in.id_categoria cat.id_categoria 
bueno esto es una sugerencia, esta sujeto a observaciones y modificaciones, cya
  #6 (permalink)  
Antiguo 22/12/2005, 16:40
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
La respuesta de deadlykyo es correcta. Sin embargo, mientras se pueda hacer un JOIN es preferible, por cuestión de funcionamiento del servidor. Con pocos registros, la diferencia es mínima, pero si la base de datos está con muchos datos tardará mucho más.
Por otro lado, recomiento que cambies la key de melodias y le pongas "id_melodia" xq con tantos ids a la larga tiende a confundir...

Código PHP:
SELECT m.idi.nombre as interpretec.nombre as categoriam.titulom.autorm.compositorm.duracionm.introm.generom.estadom.fecha_altam.fecha_modm.historialm.tocadam.ruta
FROM melodias m LEFT JOIN interpretes i ON m
.id_interprete i.id_interprete LEFT JOIN categorias c ON m.id_categoria c.id_categoria 
También te recomiendo unificar el criterio para el nombre de los campos. Algunos están todos con mayúsculas, otros con minúsculas y otros con inicial mayúscula. MySQLEn no cambia, pero sí en PHP
  #7 (permalink)  
Antiguo 23/12/2005, 11:24
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Sonrisa

Seppo: aplicando tus observaciones cambie la clave de la tabla melodías por ‘id_melodia’ y unifique el criterio de los campos (todos a minúsculas), gracias por las observaciones.

deadlykyo: no comprendí del todo el asunto de implementar la tabla intermedia, bueno explico la mecánica: se trata de que el usuario va a almacenar los datos de varias melodías (canciones), cada melodía pertenece a un interprete y a una categoría. ¿Seria necesario o que beneficio me traería la utilización de esta tabla intermedia? ¿Me podrías ampliar tu idea?

En si me gustaría saber si ya con las correcciones (que gracias a ustedes he hecho) mi modelo de datos va por buen camino o se necesita hacer algún cambio "dramático" a este. Lo que no quiero es en un futuro llegar a tener problemas de lógica por un mal diseño.

Saludos y gracias en general por sus observaciones, síganlas haciendo.
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #8 (permalink)  
Antiguo 23/12/2005, 12:59
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 18 años, 5 meses
Puntos: 5
mira te pongo el ejemplo, para explicar la idea, ademas que creo que es tambien por la segunda o tercera forma normal , digamos que tienes la melodia o cancion la oda a la alegria y este tiene todo sus datos y pero que pasa si tienes esa cancion en dos categarias diferentes, por ejemplo musica clasica, novedades, o bandas Sonoras que podria ser algunas categorias y entonces si mantienes ese esquema y no usas una tabla intermedia tendrias tres veces registrado con todos sus datos la misma melodia, pero si tienes la tabla intermedia tienes solo la llave de la melodia con diferentes categorias o la llave diferentes interpretes si es que se diera el caso en vez de tres veces el mismo registro completo, bueno esa es creo mi razon principal
saludos,.. espero haberme dejado entender cya
  #9 (permalink)  
Antiguo 23/12/2005, 18:30
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Si, ya entiendo el punto.

Entonces la tabla intermedia va a evitar que haya registros iguales en la tabla melodías, cuando llegara el caso de tener una melodía en dos o mas categorías, me gusta la idea, el inconveniente que habría es por que las melodías deben ser independientes una de la otra aunque sean idénticas en titulo, ya que en la interfaz del usuario este debe poder modificarlas, cambiar los datos.

Otro de los inconvenientes es la ‘ruta’ (este campo va a contener la ruta del fichero de audio de cada melodía), digamos que hay una melodía relacionada con dos interpretes, con la tabla intermedia, ambos interpretes van a hacer referencia a la misma ruta de archivo, para resolver esto creo que se tendría que hacer referencia a una ruta diferente por cada interprete que haya.

Pasando a otro aspecto del mismo hilo… con la estructura de datos que tengo hasta el momento, necesito hacer una consulta que me permita seleccionar una melodía cuyo intérprete no se haya seleccionado dentro de un rango determinado, la razón es por que voy a seleccionar varias melodías de diferentes categorías, entonces la idea es que de alguna forma se pueda mantener una separación de interprete, para no permitir que el mismo interprete salga dos veces seguidas o muy cercano. ¿Me explico? Este mismo problema es el que me llevo a normalizar mi modelo de datos, por eso pregunto ¿si con el modelo que tengo actualmente puedo hacerlo? O necesito implementar algo más.

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #10 (permalink)  
Antiguo 23/12/2005, 19:50
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
creo que los campos de Genero, Autor y Compositor se repepiten, estarias violando la 1°era regla de nortmalizacion, por lo que debes colocarlos en tabalas separadas
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #11 (permalink)  
Antiguo 26/12/2005, 13:42
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Cita:
Iniciado por TolaWare
creo que los campos de Genero, Autor y Compositor se repepiten, estarias violando la 1°era regla de nortmalizacion, por lo que debes colocarlos en tabalas separadas
Tienes razón TolaWare. Los campos ‘autor’, ‘compositor’ y ‘genero’ se repiten por lo que ya los coloque en tablas aparte para no romper la primera forma normal, gracias por la corrección, he aquí mi nuevo modelo de datos:



Pero mientras más normalizado este mi modelo de datos, más tablas van a haber, entonces será necesario agregar varios JOINS (de hecho 5) a la consulta para extraer los datos, pregunto: ¿Entre mas JOINS tenga la consulta mas va a tardar en ejecutarse o esto no afecta en nada el tiempo de ejecución?

Bienvenidas las correcciones

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico

Última edición por hieloverde; 26/12/2005 a las 16:14
  #12 (permalink)  
Antiguo 27/12/2005, 15:33
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Sigo enredado con esto :

Cita:
Iniciado por hieloverde
Pasando a otro aspecto del mismo hilo… con la estructura de datos que tengo hasta el momento, necesito hacer una consulta que me permita seleccionar una melodía cuyo intérprete no se haya seleccionado dentro de un rango determinado, la razón es por que voy a seleccionar varias melodías de diferentes categorías, entonces la idea es que de alguna forma se pueda mantener una separación de interprete, para no permitir que el mismo interprete salga dos veces seguidas o muy cercano. ¿Me explico? Este mismo problema es el que me llevo a normalizar mi modelo de datos, por eso pregunto ¿si con el modelo que tengo actualmente puedo hacerlo? O necesito implementar algo más.
Alguna idea o consejo?

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #13 (permalink)  
Antiguo 28/12/2005, 14:15
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Bueno, creo ya casi esta, lo que estoy haciendo es insertar las id de los intrepretes y la id de la posicion conforme van saliendo, en una tabla llamada bloqueo con estos campos:

bloqueo

id_posicion
id_interprete

y luego hago una consulta para seleccionar aquella melodia cuyo interprete no se haya seleccionado dentro de un rango prestablecido, lo hago con la siguiente subconsulta:

Código:
SELECT * FROM melodias WHERE id_interprete NOT IN (SELECT id_interprete 
FROM bloqueo WHERE id_posicion>='2' and id_posicion<='3')
Probe esta consulta en local y funciona como debe ser, el problema es que solo funciona para la version 4.1 de Mysql en adelante y el servidor donde voy a alojar esto tiene la 4.0 o sea que no soporta las subconsultas.

Se que hay forma de traducir esto utilizando JOINS para que funcione en versiones de Mysql que no soportan subconsultas, A ver si alguien me puede ayudar a traducir la consulta.

Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
  #14 (permalink)  
Antiguo 02/01/2006, 17:00
Avatar de hieloverde  
Fecha de Ingreso: julio-2005
Ubicación: México, D.F
Mensajes: 467
Antigüedad: 18 años, 9 meses
Puntos: 5
Bueno pues ya lo he solucionado, la subconsulta la converti con JOINS y funciona, aunque quizas alguien sepa una mejor forma de hacerlo.

Código:
SELECT m.id_melodia,m.titulo,i.interprete,m.id_interprete FROM melodias AS m
LEFT JOIN interpretes AS i ON m.id_interprete = i.id_interprete
LEFT JOIN bloqueo AS b ON m.id_interprete = b.id_interprete AND b.id_posicion >='$min' AND b.id_posicion <='$max'
WHERE b.id_interprete IS NULL
Saludos,
__________________
<? echo("1 <script> dice + que 1000 palabras"); ?> EspacioMéxico
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 19:27.