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

Tablas relacionales o mejor tabla simple?

Estas en el tema de Tablas relacionales o mejor tabla simple? en el foro de Mysql en Foros del Web. Hola! Quiero empezar una web, sobre recetas de cocina, y queria preguntaros una duda sobre el planeamiento, ya que no se como seria mejor ocpion. ...
  #1 (permalink)  
Antiguo 18/06/2012, 03:23
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Tablas relacionales o mejor tabla simple?

Hola!
Quiero empezar una web, sobre recetas de cocina, y queria preguntaros una duda sobre el planeamiento, ya que no se como seria mejor ocpion.

La pagina va a estar enfocada a que un usuario ponga los ingredientes que tiene y la pagina web, devuelva todas las recetas que tienen esos ingredientes.

Para eso habia pensado que podria hacerlo con talblas relacionales de esta manera:

tabla recetas con 4 campos:
id receta, Titulo receta, idrecetas(tablapuente) , preparacion

tabla de ingredientes con 2 campos:
id ingrediente, ingrediente

Tabla "puente" (para unir las dos anteriores) con 11 campos
id receta , id ingrediente 1, id ingrediente 2 .... id ingrediente 10

El caso es que lo que creia que seria mejor, cada vez lo veo mas complicado....
La intencion es que cuando muestra una receta de la tabla recetas muestre lo siguiente:

- Titulo receta
- Todos los ingrediente ( que los sacaria de la tabla puente mediante el idrecetapuente)
- Preparacion

Lo veis correcto este planteamiento, o mejor me dejo de lios y lo pongo todo en la misma tabla de la siguiente manera:

Tabla recetas con 13 campos
id receta, tituloreceta, preparacion, ingredinte1, ingrediente2..... ingrediente10?

Muchas gracias a todos!
__________________
Tecnología y tutoriales
  #2 (permalink)  
Antiguo 18/06/2012, 06:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tablas relacionales o mejor tabla simple?

Tablas:
Cita:
RECETAS(idReceta, TituloReceta, preparacion)
INGREDIENTES(idIngrediente, nombreIngrediente)
RECETA_INGREDIENTES(idReceta, idIngrediente, cantidad, unidadUsada(campo tipo Enum))
Esa forma sería flexible porque permite poner una receta de 1 sólo ingrediente, o recetas que tengan 400 ingredientes, sin ningún problema.
Tenías un error en el concepto de relación N:N, porque jamás el id del detalle de ingredientes puede ir en la tabla receta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 18/06/2012, 08:06
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Tablas relacionales o mejor tabla simple?

Ok.... ya entiendo!! entonces por cada ingrediente usado en una receta, se repetiria el id receta en la tabla RECETA_INGREDIENTES de la siguiente forma:

Código:
------------------------------------------------------------
| id receta | id ingrediente | cantidad | unidad usada |
------------------------------------------------------------
|    2         |      1              |    100    |     ml.      |
------------------------------------------------------------
|    2         |       5             |     5       |    unidades  |
------------------------------------------------------------
|    2         |      9              |      300   |     gr    |
------------------------------------------------------------
|     5        |      2              |     1/2     |  docena    |
------------------------------------------------------------
Estoy en lo cierto?

PD: La tabla ha quedado un poco descuadrada..... :P
__________________
Tecnología y tutoriales
  #4 (permalink)  
Antiguo 18/06/2012, 08:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tablas relacionales o mejor tabla simple?

Exacto. Esa es la idea.
La aparente redundancia de datos que se produce al usar ambas PK como FK de la tabla, es redundancia necesaria para mantener la relación entre una receta y sus ingredientes. Como cáda ingrediente se puede relacionar con una misma recena una sola vez, el par se declara como PK y la tabla no requiere de ningún otro identificador.
Obviamente esto tiene una consecuencia en la tabla de ngredientes: Cada uno de los ingredientes debe aparecer en la tabla con un registro por cada forma en que el ingrediente aparece:
No puede haber un ingrediente "pimienta", debe ser más especifico, como "pimienta negra en granos", "pimienta negra molida", "pimienta negra de XXX país en grano", etc.
De lo contrario, deberá agregarse en la tabla relacional otro campo para discriminar ese detalle, y eso complicará a la aplicación.
Es más simple cuando la tabla base es clara y específica.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 18/06/2012, 09:12
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Tablas relacionales o mejor tabla simple?

Muchisimas gracias gnzsoloyo!
Tu explicacion me ha sido de gran ayuda!
Un saludo!
__________________
Tecnología y tutoriales
  #6 (permalink)  
Antiguo 04/07/2012, 14:39
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Consulta INNER JOIN

Hola de nuevo!

Una vez conseguido el planteamiento correcto de la base de datos, ahora me surge otra duda.

He hecho una consulta con INNER JOIN para sacar la receta completa y he metido en un array los resultados.
He conseguido sin problema que me saque todos los ingredientes, con sus cantidades,
pero, aqui viene el problema: por cada ingrediente me saca el titulo y la preparacion, lo cual no es lo que quiero, ya que quiero que me saque el titulo y la preparacion solo una vez.
El codigo es el siguiente:
Código:
<?php
$conexion= mysql_connect("localhost","root","root");
if(!$conexion)
{
die ('No se ha conectado: '.mysql_error());
} echo "Te has conectado correctamente<br>";

mysql_select_db("recetas",$conexion);

$peticion=mysql_query("SELECT * 
FROM (`recetas` INNER JOIN `receta_ingredientes` ON `recetas`.idReceta=`receta_ingredientes`.idReceta) 
INNER JOIN `ingredientes` ON `ingredientes`.idIngrediente=`receta_ingredientes`.idIngrediente");

while ($fila = mysql_fetch_array($peticion))

{
echo $fila['tituloReceta']."<br>";
echo $fila['nombreIngrediente']." ".$fila['cantidad']." ".$fila['unidadMedida']."<br> ";
echo $fila['preparacion']."<br>";

}


mysql_close($conexion);

?>
Al ver el resultado que era algo asi como: (con un titulo y una preparacion por cada ingrediente)

Código HTML:
Tortilla de patatas
Huevos 4 unidades
pelamos las patatas las freimos y hacemos la tortilla
Tortilla de patatas
Cebolla 1 unidades
pelamos las patatas las freimos y hacemos la tortilla
Tortilla de patatas
patatas 500 gramos
pelamos las patatas las freimos y hacemos la tortilla
Entonces he pensado que con sacar el titulo y la preparacion fuera era suficiente del while y he hecho lo siguiente:
Código:
<?php
$conexion= mysql_connect("localhost","root","root");
if(!$conexion)
{
die ('No se ha conectado: '.mysql_error());
} echo "Te has conectado correctamente<br>";

mysql_select_db("recetas",$conexion);

$peticion=mysql_query("SELECT * 
FROM (`recetas` INNER JOIN `receta_ingredientes` ON `recetas`.idReceta=`receta_ingredientes`.idReceta) 
INNER JOIN `ingredientes` ON `ingredientes`.idIngrediente=`receta_ingredientes`.idIngrediente");

$fila = mysql_fetch_array($peticion);
echo $fila['tituloReceta']."<br>";
echo $fila['preparacion']."<br>";


while ($fila = mysql_fetch_array($peticion))
{
echo $fila['nombreIngrediente']." ".$fila['cantidad']." ".$fila['unidadMedida']."<br> ";
}


mysql_close($conexion);

?>
Pero ahora el problema es que me pone el titulo y la preparacion de la primera receta y luego el listado de todos los ingredientes de las otras recetas con sus unidades y cantidades pero sin su titulo y su preparacion.

Mi intencion es que salga de una forma logica, es decir
Código HTML:
Titulo receta1
Ingredientes receta1
Preparacion receta1

Titulo receta2
Ingredientes receta2
Preparacion receta2

...
Se puede arreglar la consulta INNER Join para que solo te diera el resultado una vez en cuestion de titulo, o tendria que hacerlo con PHP?

Muchas gracias!
__________________
Tecnología y tutoriales
  #7 (permalink)  
Antiguo 05/07/2012, 15:41
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Tablas relacionales o mejor tabla simple?

Nadie sabe alguna solucion?
__________________
Tecnología y tutoriales
  #8 (permalink)  
Antiguo 06/07/2012, 01:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Tablas relacionales o mejor tabla simple?

Ante todo, si creas un nuevo hilo para un tema nuevo es mas facil que se te responda.

La solución no es de mysql si no de programacion externa....

Dos posibles enfoques....

1-Antes del while creas una variable $recetacontrol="" dentro del while si $fila['tituloReceta'] es distinto de $recetacontrol imprimes el titulo y la preparación he inmediatamente igualas $recetacontrol=$fila['tituloReceta'] con lo que el while seguira imprimiendo ingredientes hasta que aparezca una nueva receta. (Todo en una sola consulta)

2- Primero consultas las recetas (id,titulo y preparación) los guardas en un array. Recorres el array y para cada receta consultas sus ingredientes y los imprimes....(1+N consultas)

Como es obvio puede haber mas y mejores enfoques....

(Si le das dos vueltas encontraras como imprimir la preparación despues de la lista de ingredientes)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 06/07/2012 a las 02:04
  #9 (permalink)  
Antiguo 06/07/2012, 04:56
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Tablas relacionales o mejor tabla simple?

Hola Quimfv!

Muchisimas gracias por la respuesta!
Referente a esto:
Cita:
Ante todo, si creas un nuevo hilo para un tema nuevo es mas facil que se te responda.
Siento haber continuado este hilo, creí que seria lo mas correcto, ya que en muchas ocasiones he visto echar "broncas" a usuarios nuevos por abrir un hilo repetido. Pero ya me queda claro para otras ocasiones

Cita:
La solución no es de mysql si no de programacion externa....
No lo tenia claro del todo, ya que pense que habria otra consulta SQL un poco mas concreta que hiciera lo que yo queria, aunque deduzco que no.

Cita:
1-Antes del while creas una variable $recetacontrol="" dentro del while si $fila['tituloReceta'] es distinto de $recetacontrol imprimes el titulo y la preparación he inmediatamente igualas $recetacontrol=$fila['tituloReceta'] con lo que el while seguira imprimiendo ingredientes hasta que aparezca una nueva receta. (Todo en una sola consulta)

2- Primero consultas las recetas (id,titulo y preparación) los guardas en un array. Recorres el array y para cada receta consultas sus ingredientes y los imprimes....(1+N consultas)
Tanto la primera solucion como la segunda me parecen una solucion perfecta para lo que necesitaba, ya me deacantare por una de las dos pero las probare las dos para practicar ya que todavia soy novato en esto

En fin muchisimas gracias por la respuesta y siento de veras no haber hecho las cosas del todo correctas.

Un saludo!
__________________
Tecnología y tutoriales
  #10 (permalink)  
Antiguo 06/07/2012, 06:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Tablas relacionales o mejor tabla simple?

Las broncas caen quando se pregunta lo mismo dos veces. En este caso el tema de diseño de la base de datos estaba contestado y muy bien por gnzsoloyo, por tanto tema cerrado.

Una duda nueva es un hilo nuevo aun que te surja del mismo proyeto.

En todo caso lo mio no era una bronca, si no que te dieras cuenta que en un hilo con 5 respuestas como era el caso entra mucha menos jente que en uno con 0 respuestas luego si esta justificado es mucho mejor abrir un hilo nuevo que evolucionar uno antiguo. Ademas el asunto ya no tiene nada que ver con lo que preguntas ahora.

Por cierto seguramente encontrariamos la forma de hacer una query que diera lo que pides pero seria tan complicada que es mucho mejor solucionarlo por fuera....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #11 (permalink)  
Antiguo 06/07/2012, 10:52
Avatar de dryant  
Fecha de Ingreso: agosto-2009
Ubicación: Malaga, Ceuta, España....
Mensajes: 283
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Tablas relacionales o mejor tabla simple?

Muchas gracias de nuevo Quim!
Por cierto tu primera opcion me ha funcionado aunque he tenido un pequeño problemilla, y la segunda no lo he acabado de conseguir ya que he puesto el while de las recetas, y dentro de éste un while con los ingredientes, pero lo que me hacia era poner un tituloreceta, todos los ingredientes de todas las recetas, y a continuacion todos los titulos de todas las recetas. De todas formas ya he abierto un hilo nuevo en el foro de PHP para buscar ayuda por ahi para dar este hilo por cerrado: http://www.forosdelweb.com/f18/como-...ablas-1002427/
Lo he puesto un poco cambiado para resumir y que sea mas facil la comprension para no tener que volver a explicarlo todo.
Un saludo y gracias de nuevo!

PD: Hay opcion de poner en este hilo la etiqueta de SOLUCIONADO o algo parecido?
__________________
Tecnología y tutoriales
  #12 (permalink)  
Antiguo 06/07/2012, 11:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Tablas relacionales o mejor tabla simple?

Si creo que, como autor, lo puedes cerrar.

En cuanto a la segunda solucion mas que whiles anidados yo haria un "for" sobre el array de recetas y un while sobre la consulta de ingredientes... pero si te imprime el titulo cada vez es que tienes algun echo de mas.....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: relacionales, tabla, tablas, campos
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




La zona horaria es GMT -6. Ahora son las 02:40.