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

[CONSULTA] Creo que son tablas relacionales (Sepan disculpar)

Estas en el tema de [CONSULTA] Creo que son tablas relacionales (Sepan disculpar) en el foro de Mysql en Foros del Web. Gente: Desde ya les agradezco mucho siquiera intentar responder mi consulta. Yo tengo en mente algo que puede sonar medio simple para algunos pero no ...
  #1 (permalink)  
Antiguo 24/04/2009, 00:58
Avatar de mapper  
Fecha de Ingreso: enero-2003
Ubicación: Argentina
Mensajes: 321
Antigüedad: 21 años, 3 meses
Puntos: 1
[CONSULTA] Creo que son tablas relacionales (Sepan disculpar)

Gente: Desde ya les agradezco mucho siquiera intentar responder mi consulta.

Yo tengo en mente algo que puede sonar medio simple para algunos pero no entiendo el el concepto o algo ya que no logro hacerlo funcionar.

Tengo una tabla llamada ingredientes:

Código:
menumaker.ingredientes
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| nombre   | char(50) | NO   |     |         |                |
| tipo_id  | int(2)   | NO   |     | 0       |                |
| tipo2_id | int(2)   | NO   |     | 0       |                |
| duracion | int(3)   | NO   |     | 0       |                |
+----------+----------+------+-----+---------+----------------+

Y una de comidas que se supone tienen varios ingredientes cada una...

Código:
menumaker.comidas
+----------------+-----------+------+-----+---------+----------------+
| Field          | Type      | Null | Key | Default | Extra          |
+----------------+-----------+------+-----+---------+----------------+
| id             | int(11)   | NO   | PRI | NULL    | auto_increment |
| nombre         | char(100) | NO   |     |         |                |
| demora_minutos | int(3)    | NO   |     | 0       |                |
| ingredientes   | char(200) | NO   |     |         |                |
| desarrollo     | text      | NO   |     | NULL    |                |
+----------------+-----------+------+-----+---------+----------------+
Mi problema es que no se como almacenar la relación de una comida con sus (digamos) 15 ingredientes...

Yo se la manera de hacerlo solo hasta 1 ingrediente.

¿Alguien me puede decir si estoy enfocando esto de alguna manera extraña o imposible de lograr?


Desde ya muchas gracias por su ayuda :)

PD: Miré en los faq's y no vi nada y no se el nombre de lo que quiero hacer (no se como buscarlo)
__________________
-- May The Force Be With You --
  #2 (permalink)  
Antiguo 24/04/2009, 01:45
Avatar de jeybi  
Fecha de Ingreso: julio-2008
Ubicación: Mexico
Mensajes: 130
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: [CONSULTA] Creo que son tablas relacionales (Sepan disculpar)

Tienes que crear una relacion varios a varios:

Una comida puede tener (estar cocinada) con varios ingredientes
Un ingrediente puede ser utilizado para crear varias comidas

Esto lo solucionas creando otra tabla con las claves primarias de las dos tablas, algo como:

id_comida
id_ingrediente

Las dos son claves foraneas a su respectiva tabla.
  #3 (permalink)  
Antiguo 24/04/2009, 04:18
Avatar de mapper  
Fecha de Ingreso: enero-2003
Ubicación: Argentina
Mensajes: 321
Antigüedad: 21 años, 3 meses
Puntos: 1
Respuesta: [CONSULTA] Creo que son tablas relacionales (Sepan disculpar)

Ahora si, estoy medio encaminado ya... Pero sigo necesitando una mano mas...

Me lei http://dev.mysql.com/doc/refman/5.0/...nstraints.html
http://dev.mysql.com/doc/refman/5.0/...to-innodb.html
http://dev.mysql.com/doc/refman/5.0/...eign-keys.html

Estoy tapado de términos que no entiendo, espero que entiendan que mi participación en el foro fue mayormente dentro de php y que sinceramente esto de mysql me abruma un poco. Imaginen que en Argentina son casi las 7 am y todavía estoy dándole vueltas al tema. (nada que ver con el tema pero lo digo igual)

Digamos que tengo:

menumaker.comidas (ahora sin ingredientes)
Código:
+----------------+-----------+------+-----+---------+----------------+
| Field          | Type      | Null | Key | Default | Extra          |
+----------------+-----------+------+-----+---------+----------------+
| id             | int(11)   | NO   | PRI | NULL    | auto_increment |
| nombre         | char(100) | NO   |     |         |                |
| demora_minutos | int(3)    | NO   |     | 0       |                |
| desarrollo     | text      | NO   |     | NULL    |                |
+----------------+-----------+------+-----+---------+----------------+
Y por otra parte:
menumaker.ingredientes
Código:
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| nombre   | char(50) | NO   |     |         |                |
| tipo_id  | int(2)   | NO   |     | 0       |                |
| tipo2_id | int(2)   | NO   |     | 0       |                |
| duracion | int(3)   | NO   |     | 0       |                |
+----------+----------+------+-----+---------+----------------+
Y ahora si no entendi mal necesito algo como:
menumaker.conector (agregue cantidad que me lo tenia olvidado)
Código:
+-----------------+---------+------+-----+---------+-------+
| Field           | Type    | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------+
| comidas_id      | int(11) | YES  | MUL | NULL    |       |
| ingredientes_id | int(11) | YES  | MUL | NULL    |       |
| cantidad        | int(6)  | NO   |     | 0       |       |
+-----------------+---------+------+-----+---------+-------+
Las tres tablas son InnoDB
A la tercer tabla le puse:
Código:
ALTER TABLE `conector`
  ADD CONSTRAINT `ingredientes_id` FOREIGN KEY (`ingredientes_id`) REFERENCES `ingredientes` (`id`),
  ADD CONSTRAINT `comidas_id` FOREIGN KEY (`comidas_id`) REFERENCES `comidas` (`id`);
Me gustaría saber si es eso lo que se supone que ponga y que se supone que logré al hacer esto...
Mi idea es no tener que crear ingredientes cada vez que se crea una receta y no generar demasiada carga en la db en el intento. (si es posible simplificar las consultas...)

Perdonen si mi post parece un pedido de clases privadas pero estoy acostumbrado a cosas mucho mas simples y por razones de recursos no puedo pedirle a alguien que haga esto por mi.


Definitivamente agradecido,
MaPPeR
__________________
-- May The Force Be With You --
  #4 (permalink)  
Antiguo 24/04/2009, 16:02
Avatar de jeybi  
Fecha de Ingreso: julio-2008
Ubicación: Mexico
Mensajes: 130
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: [CONSULTA] Creo que son tablas relacionales (Sepan disculpar)

Con la clave foranea en innodb estas garantizando la integridad referencial, esto quiere decir que no va haber comidas con ingredientes que no existan y que un conjunto de ingredientes no pueden crear una comida que no exista.

Si, asi es como debe ser, por otra parte debes asegurarte que al introducir los ingredientes de una comida, estos existan, si no mysql tirara error.

Las busquedas serian algo asi:

SELECT ingredientes.nombre, conector.cantidad FROM comidas INNER JOIN conector INNER JOIN ingredientes ON conector.comidas_id = comidas.id AND conector.ingredientes_id = ingredientes.id WHERE comidas.nombre = 'Pizza Peperoni';

Checala bien por que no me fije mucho en tus campos.

PD: El nombre de "conector" no es un buen nombre para la tabla, generalmente se usa tabla1_para_tabla2, ej: ingredientes_para_comidas.

Saludos
  #5 (permalink)  
Antiguo 24/04/2009, 18:52
Avatar de mapper  
Fecha de Ingreso: enero-2003
Ubicación: Argentina
Mensajes: 321
Antigüedad: 21 años, 3 meses
Puntos: 1
Respuesta: [CONSULTA] Creo que son tablas relacionales (Sepan disculpar)

Por la manera en la que quiero plantear el programa esto no me sirve demasiado, pero está bueno para saberlo...
Solo con la tabla sin las llaves foraneas me queda de lujo. Y con esa consulta me va de 10
Muchas gracias, ahora le pongo solucionado.
__________________
-- May The Force Be With You --
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 05:38.