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

Relación MySql líneas y cabeceras

Estas en el tema de Relación MySql líneas y cabeceras en el foro de Mysql en Foros del Web. Hola. Estoy desarrollando un Ecommerce donde tengo una tabla de Artículos y relacionadas las tablas: fabricante, talla y color. El artículo puede tener o no ...
  #1 (permalink)  
Antiguo 26/08/2013, 06:39
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Pregunta Relación MySql líneas y cabeceras

Hola.

Estoy desarrollando un Ecommerce donde tengo una tabla de Artículos y relacionadas las tablas: fabricante, talla y color.

El artículo puede tener o no un fabricante talla o color. Pero en el caso de que haya algún artículos con alguno de estos datos, no debe dejar borrar el fabricante, talla o color.

Esta es la estructura de las tablas, sus claves y relaciones:

Código MySQL:
Ver original
  1. CREATE TABLE  `EC_articulos` (
  2.  `Id` INT( 9 ) NOT NULL AUTO_INCREMENT ,
  3.  `Codigo` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  4.  `Descripcion` VARCHAR( 150 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  5.  `Categoria` INT( 9 ) NOT NULL ,
  6.  `Fabricante` INT( 9 ) NOT NULL ,
  7.  `Talla` INT( 9 ) NOT NULL ,
  8.  `Color` INT( 9 ) NOT NULL ,
  9.  `Stock` INT( 9 ) NOT NULL ,
  10.  `Coste` DECIMAL( 9, 2 ) NOT NULL ,
  11.  `Info` LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  12. PRIMARY KEY (  `Id` )
  13. ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
  14.  
  15. CREATE TABLE  `EC_fabricante` (
  16. `Nombre` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  17. PRIMARY KEY (  `Id` )
  18. ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
  19.  
  20. CREATE TABLE  `EC_talla` (
  21.  `Id` INT( 9 ) NOT NULL AUTO_INCREMENT ,
  22.  `Nombre` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  23. PRIMARY KEY (  `Id` )
  24. ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
  25.  
  26. CREATE TABLE  `EC_Color` (
  27.  `Id` INT( 9 ) NOT NULL AUTO_INCREMENT ,
  28.  `Nombre` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  29. PRIMARY KEY (  `Id` )
  30. ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
  31.  
  32. ALTER TABLE  `ec_articulos` ADD INDEX (  `Fabricante` );
  33.  
  34. ALTER TABLE  `ec_articulos` ADD INDEX (  `Talla` );
  35.  
  36. ALTER TABLE  `ec_articulos` ADD INDEX (  `Color` )
  37.  
  38. ALTER TABLE  `ec_articulos` ADD FOREIGN KEY (  `Fabricante` ) REFERENCES  `ec_fabricante` (
  39. `Id`
  40.  
  41. ALTER TABLE  `ec_articulos` ADD FOREIGN KEY (  `Talla` ) REFERENCES  `ec_talla` (
  42. `Id`
  43.  
  44. ALTER TABLE  `ec_articulos` ADD FOREIGN KEY (  `Color` ) REFERENCES  `ec_color` (
  45. `Id`
  46.  
  47. ALTER TABLE  `ec_articulos` ADD INDEX (  `Categoria` );
  48.  
  49. ALTER TABLE  `ec_articulos` ADD FOREIGN KEY (  `Categoria` ) REFERENCES  `ec_categorias` (
  50. `Id`

El campo categoría si es obligatorio para crear un artículo.
Pero si dejo en blanco el fabricante, la talla o el color me sale este error:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[MySQL][ODBC 3.51 Driver][mysqld-5.0.45-community-nt]Cannot add or update a child row: a foreign key constraint fails (`webforeverp/ec_articulos`, CONSTRAINT `ec_articulos_ibfk_1` FOREIGN KEY (`Fabricante`) REFERENCES `ec_fabricante` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

/admin_ec_articulos.asp, line 378
  #2 (permalink)  
Antiguo 26/08/2013, 06:40
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Respuesta: Relación MySql líneas y cabeceras

He probando poniendo en artículos los campos de fabricante, talla y color con valor predeterminado NULL, peo da el mismo error.
  #3 (permalink)  
Antiguo 26/08/2013, 07:27
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 MySql líneas y cabeceras

Has creado una cosntraint mandatoria en los articulos sobre el fabricante. En tu modelo de datos es imposible que ingreses un artículo sin fabricante.
Precisamente para eso se define como FK.
A nivel de sistema y reglas de negocio, que un artículo no tenga fabricante (como lo planteas) es simplemente absurdo. Puedes no conocer al fabricante, pero la existencia del artículo habla de que al menos hay uno.
Hay muchas soluciones para tu problema. En MySQL puedes usar dos: O declaras esa FK como nulable, y cargas NULL en ese caso, o bien creas un fabricante "Desconocido", con su correspondiente PK (esto es más habitual), y lo usas en el caso de que no tengas datos.
¿Se entiende?
Por supuesto, esto depende de las reglas de negocio de tu sistema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 26/08/2013, 08:04
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Respuesta: Relación MySql líneas y cabeceras

Cita:
Iniciado por gnzsoloyo Ver Mensaje
O declaras esa FK como nulable, y cargas NULL en ese caso
Me quedo con esto, mi ecommerce será para distribuirlo, es decir, vengo una web bajo suscripción que incluye ecommerce y muchas cosas más.

Este es el motivo de dejarlo abierto.

Por ejemplo, si es una pizzería o una empresa de servicios no habría fabricante. Ya pensé en crear un valor en Fabricantes que fuese 'desconocido' o 'nulo' pero me suena a parche y a la hora de revisar el código y con los formularios de alta prefiero que se quede en blanco con valor null y listo.

¿como hago eso que dices?

Puse los tres campos con predeterminado null de esta manera:
Código MySQL:
Ver original
  1. ALTER TABLE  `ec_articulos` CHANGE  `Fabricante`  `Fabricante` INT( 9 ) NULL;
  2. ALTER TABLE  `ec_articulos` CHANGE  `Talla`  `Talla` INT( 9 ) NULL;
  3. ALTER TABLE  `ec_articulos` CHANGE  `Color`  `Color` INT( 9 ) NULL;

pero me sigue dando error.
  #5 (permalink)  
Antiguo 26/08/2013, 08:06
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Respuesta: Relación MySql líneas y cabeceras

lo mismo me pasa con talla y color, iba ha hacerlo bien, con tablas relacionada y stock por talla y color, pero de momento lo dejaré en dos campos. ¿podrías decirme qué tengo que modificar en el código?
  #6 (permalink)  
Antiguo 26/08/2013, 08:28
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 MySql líneas y cabeceras

No puedes declarar como nulable una FK mientras siga siendo FK. Lo que debes hacer es dropear la constraint como FK, y luego declararla nulable.
Cita:
Por ejemplo, si es una pizzería o una empresa de servicios no habría fabricante.
Error de análisis de sistemas: La pizzería sería fabricante en ese caso. Es decir, el producto es propio. Por supuesto que para eso la propia empresa debe incluirse en la lista de fabricantes...
__________________
¿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 26/08/2013, 08:38
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Respuesta: Relación MySql líneas y cabeceras

En el caso del fabricante sí, pero en talla y color, no debería ni aparecer ni el combo si lo que vende el cliente final nada tiene que ver con ropa.

A ver si me entero, que he pasado hace un año de Access a MySql y todavía estoy verde.

No me deja declarar como NULL la FK EC_fabricante->Id porque es autonumérica ¿tendría que quitar el autonumérico?

Si ejecuto esta sentencia la ignora:
Código MySQL:
Ver original
  1. ALTER TABLE  `ec_fabricante` CHANGE  `Id`  `Id` INT( 9 ) NULL AUTO_INCREMENT

antes había eliminado la relación.
  #8 (permalink)  
Antiguo 26/08/2013, 08:40
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Respuesta: Relación MySql líneas y cabeceras

Las otras dos relaciones (talla y color) tienen la misma estructura.
  #9 (permalink)  
Antiguo 26/08/2013, 09:25
 
Fecha de Ingreso: diciembre-2010
Mensajes: 236
Antigüedad: 13 años, 11 meses
Puntos: 6
Respuesta: Relación MySql líneas y cabeceras

Bueno, tengo que seguir y he optado por esta solución que no me gusta.

al crear nuevo hosting, después de crear las tablas añado estos campos, así me aseguro que existen siempre:

Código MySQL:
Ver original
  1. INSERT INTO `ec_color` (`Id`, `Nombre`) VALUES (1, '-');
  2. INSERT INTO `ec_fabricante` (`Id`, `Nombre`) VALUES (1, '-');
  3. INSERT INTO `ec_talla` (`Id`, `Nombre`) VALUES (1, '-');

En los formularios de mantenimiento de dichas tablas se ocultará el ID=1, es decir, al entrar por primera vez dirá que no hay registros.

Y por último en la tabla de artículos los 3 campos tendrán valor predeterminado 1, si se deja en blanco:

`Fabricante` INT( 9 ) NOT NULL DEFAULT '1' ,
`Talla` INT( 9 ) NOT NULL DEFAULT '1' ,
`Color` INT( 9 ) NOT NULL DEFAULT '1' ,


Esta solución no me gusta, me parece un parche ¿no hay otra forma de hacerlo?

Etiquetas: cabeceras, lineas, relacion
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 11:14.