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

¿ Relación 4:n "4 a muchos" ?

Estas en el tema de ¿ Relación 4:n "4 a muchos" ? en el foro de Mysql en Foros del Web. Hola a todos Hoy me ha surgido una duda en el trabajo. Explicación Estoy diseñando la base de datos para portal para el pequeño comercio ...
  #1 (permalink)  
Antiguo 07/01/2011, 07:02
 
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Pregunta ¿ Relación 4:n "4 a muchos" ?

Hola a todos

Hoy me ha surgido una duda en el trabajo.

Explicación

Estoy diseñando la base de datos para portal para el pequeño comercio y querría que los comercios que se agreguen puedan incluirse en varias categorías. Mínimo una categoría y máximo cuatro categorías.

Mi propuesta es que la tabla para comercio tenga los siguientes campos

comercio

* id_comercio
+ categoria1
+ categoria2
+ categoria3
+ categoria4
· direccion
· info
· etc

a su vez tendría una tabla

categoria

* id_categoria
· nombre


Problema:

PhpmyAdmin y MySql no me permiten poner 4 claves foráneas en la tabla comercio hacia categoria.

¿Qué me recomendáis? ¿cómo puedo hacerlo? Creo que es un asunto bastante común pero no he encontrado nada al respecto.

Muchísimas gracias
  #2 (permalink)  
Antiguo 07/01/2011, 07:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Una relación 4:N es una relación N:N donde la restricción de que debe haber al menos 4 registros de la segunda tabla relacionados con la primera bien la puedes manejar en la aplicación.
Técnicamente hablando, desde el punto de vista ortodoxo requiere una tabla adicional para manejar las relaciones; desde otra óptica, poner 4 FK o poner 32, no es problema, por lo que se puede manejar perfectamente así. A MySQL no le importa (tengo tablas con muchas relaciones como esa).
La diferencia esencial es que si lo manejas en la aplicación, controlando de que se indiquen las relaciones, no desperdicias tiempo de envio y respuesta a la base para saber si están o no todos los valores, mientras que si lo haces en la base la restricción funciona aunque no valides, porque no puedes enviar un NULL o un valor ilegal en esos campos, pero deberás gestionar la respuesta de MySQL para el caso de los rechazos.

En definitiva es una decisión de diseño. Cualquiera de las dos es viable. Por cuestiones de performance de sistema, yo haría que esa validación ocurriera en la aplicación, de ese modo no desperdicias recursos de la base en validaciones menores. No te olvides que para ello solamente necesitarías que el formulario valide que los valores están puestos antes de habilitar el botón de "Grabar"... Es mucho más sencillo.

Simplificando: No hagas que la base realice validaciones que la aplicación puede hacer mejor y más rápido...
__________________
¿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 07/01/2011, 08:50
 
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Muchísimas gracias por la pronta respuesta.

Es lo que me estaba planteando.
Hacer una tabla intermedia complica las sentencias sql con inner joins, etc. que no se me dan muy bien del todo, y a la hora de hacer inserciones en la base de datos también se complicaría.

Entonces, siguiendo tu consejo, mantengo ese diseño con cuatro campos para categoria1, categoria2, categoria3 y categoria4, y me las apaño con mayor número de llamadas simples a mysql (pero más sencillas) desde la aplicación (en mi caso php).

Un saludo, y espero que sirva para más gente en situaciones parecidas como cosas como "categorias", "tipos", "etiquetas", "clases", etc.
  #4 (permalink)  
Antiguo 07/01/2011, 09:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Cita:
Hacer una tabla intermedia complica las sentencias sql con inner joins, etc. que no se me dan muy bien del todo, y a la hora de hacer inserciones en la base de datos también se complicaría.
Bueno, es tu decisión, pero te advierto que las ventajas a futuro de un modelo más normalizado y ortodoxo serán inmensas en el momento en que tu sistema ya esté funcionando un tiempo.

Mi sugerencia sería que buscaras un colaborador que domine mejor todo lo que sea Base de Datos, porque una vez que la base esté en funcionamiento ya no habrá vuelta atrás, y esas cosas se terminan pagando en performance que no se puede mejorar.
Una base en trabajo ya no se puede migrar sin un enorme esfuerzo. Siempre es mejor planear para el futuro, no para resolver ls problemas de hoy.... el futuro siempre te alcanza.
__________________
¿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 07/01/2011, 10:15
 
Fecha de Ingreso: junio-2009
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 3
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Pregunta de aficionado:
No es mejor crear una tabla comercio_categoria donde tenga el id_comercio y el id_categoria (con sus respectivas FK) y que sea allí donde se ingresen las categorías de cada comercio ?
  #6 (permalink)  
Antiguo 07/01/2011, 10:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Es lo que yo le proponía, pero como dice él mismo:
Cita:
Hacer una tabla intermedia complica las sentencias sql con inner joins, etc. que no se me dan muy bien del todo
Por eso le sugiero que se busque un colaborador que domine mejor el tema de SQL y bases de datos. Es una salida para el proyecto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 10/01/2011, 02:41
 
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Si estoy casi convencido pero el principal motivo por el que no lo hago es por la "inserción", aunque todavía estoy a tiempo.

Imaginad que es un formulario para el usuario que permite insertar al mismo tiempo el comercio con todos sus datos y además cuatro categorías al mismo tiempo.

¿cómo hago eso?

sólo se me ocurre con varias sentencias

INSERT INTO comercio (direccion, info, etc ) VALUES ('valor1', 'valor2', 'valor3')

INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ('valor_id_comercio', 'valor_cat_1')
INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ('valor_id_comercio', 'valor_cat_2')
INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ('valor_id_comercio', 'valor_cat_3')
INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ('valor_id_comercio', 'valor_cat_4')


Duda: Sé obtener todos los valores menos 'valor_id_comercio', que se genera automáticamente al ser una variable autonumérica o autoincremental.
Me suena que hay algo así como un SET que te ayuda en este caso, pero no sé utilizarlo y tampoco sé si vale para cuatro sentencias que están declaradas después.


Por lo que he podido ver al buscar información es una duda muy común y que curiosamente nunca he la he encontrado resuelta.
Muchísimas gracias chicos :)

Última edición por jj_bierzo; 10/01/2011 a las 02:58
  #8 (permalink)  
Antiguo 10/01/2011, 03:11
 
Fecha de Ingreso: enero-2011
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Me respondo a mi mismo, por si le sirve a alguien más.

buscando acabo de encontrar el método PHP mysql_insert_id()

http://us2.php.net/manual/en/function.mysql-insert-id.php

Con esto podría hacer:

Código:
mysql_query("INSERT INTO comercio (direccion, info, etc ) VALUES ('valor1', 'valor2', 'valor3')" );

$id_comercio = mysql_insert_id();

INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ($id_comercio, 'valor_cat_1')
INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ($id_comercio, 'valor_cat_2')
INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ($id_comercio, 'valor_cat_3')
INSERT INTO comercio_categoria (id_comercio, id_categoria) VALUES ($id_comercio, 'valor_cat_4')
Lo extraño esque no encuentro la forma de hacerlo simplemente con una sentencia sql, ¿qué ocurriría si no usase php?

Muchas gracias de nuevo :)
  #9 (permalink)  
Antiguo 10/01/2011, 03:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿ Relación 4:n "4 a muchos" ?

Usarías LAST_INSERT_ID() en un SELECT inmediatamente después del INSERT:
y obtendrías el valor en el PHP mismo como en cualquier SELECT.
O bien usarías un SP para administrar el problema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: categorias, relacion, tipo, foreignkey
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 13:38.