Ver Mensaje Individual
  #7 (permalink)  
Antiguo 26/12/2009, 15:25
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: ¿Como seria la relaciones de las tablas producto, categoria y subcategoria

Suponiendo esos datos, y con estas estructuras:
Código MySQL:
Ver original
  1. CREATE TABLE  `producto` (
  2.   `PRODUCTO_ID` int(10) unsigned NOT NULL auto_increment,
  3.   `CATEGORIA_ID` int(10) unsigned NOT NULL,
  4.   `SUBCAT_ID` int(10) unsigned NOT NULL,
  5.   `PRODUCTO_NOMBRE` varchar(100) NOT NULL,
  6.   `PRECIO_UNITARIO` decimal(8,2) NOT NULL,
  7.   `STOCK` int(11) NOT NULL,
  8.   PRIMARY KEY  USING BTREE (`PRODUCTO_ID`),
  9.   KEY `FK_producto_cat` (`CATEGORIA_ID`),
  10.   KEY `FK_producto_subcat` (`SUBCAT_ID`,`CATEGORIA_ID`),
  11.   CONSTRAINT `FK_producto_subcat` FOREIGN KEY (`SUBCAT_ID`, `CATEGORIA_ID`) REFERENCES `subcategoria` (`SUBCAT_ID`, `CATEGORIA_ID`),
  12.   CONSTRAINT `FK_producto_cat` FOREIGN KEY (`CATEGORIA_ID`) REFERENCES `categoria` (`CATEGORIA_ID`)
  13.  
  14. CREATE TABLE  `categoria` (
  15.   `CATEGORIA_ID` int(10) unsigned NOT NULL auto_increment,
  16.   `CATEGORIA_NOMBRE` varchar(50) NOT NULL,
  17.   `CATEGORIA_DESC` varchar(100) NOT NULL,
  18.   PRIMARY KEY  USING BTREE (`CATEGORIA_ID`)
  19.  
  20. CREATE TABLE  `subcategoria` (
  21.   `SUBCAT_ID` int(10) unsigned NOT NULL,
  22.   `CATEGORIA_ID` int(10) unsigned NOT NULL,
  23.   `SUBCAT_NOMBRE` varchar(100) NOT NULL,
  24.   PRIMARY KEY  (`SUBCAT_ID`,`CATEGORIA_ID`),
  25.   KEY `FK_subcategoria_1` (`CATEGORIA_ID`),
  26.   CONSTRAINT `FK_subcategoria_1` FOREIGN KEY (`CATEGORIA_ID`) REFERENCES `categoria` (`CATEGORIA_ID`)

Categoría contendría:
Código MySQL:
Ver original
  1. SELECT * FROM categoria c;
  2. +--------------+------------------+------------------------------------------------------------+
  3. | CATEGORIA_ID | CATEGORIA_NOMBRE | CATEGORIA_DESC                                             |
  4. +--------------+------------------+------------------------------------------------------------+
  5. |            1 | COMPUTACION      | ARTICULOS E INSUMOS DE COMPUTACION                         |
  6. |            2 | VIDEO            | ARTICULOS E INSUMOS PARA REPRODUCCION Y GRABACION DE VIDEO |
  7. +--------------+------------------+------------------------------------------------------------+

Subcategoria contendría:
Código MySQL:
Ver original
  1. SELECT CATEGORIA_ID, SUBCAT_ID, SUBCAT_NOMBRE
  2. FROM subcategoria
  3. ORDER BY CATEGORIA_ID;
  4. +--------------+-----------+-----------------+
  5. | CATEGORIA_ID | SUBCAT_ID | SUBCAT_NOMBRE   |
  6. +--------------+-----------+-----------------+
  7. |            1 |         1 | MONITOR         |
  8. |            1 |         2 | IMPRESORA       |
  9. |            1 |         3 | ROUTER          |
  10. |            1 |         4 | SCANER          |
  11. |            2 |         1 | TELEVISOR       |
  12. |            2 |         2 | PROYECTOR       |
  13. |            2 |         3 | CAMARA DE VIDEO |
  14. |            2 |         4 | DVD             |
  15. +--------------+-----------+-----------------+

Producto, finalmente, tendría:
Código MySQL:
Ver original
  1. SELECT * FROM producto p;
  2. +-------------+--------------+-----------+---------------------+-----------------+-------+
  3. | PRODUCTO_ID | CATEGORIA_ID | SUBCAT_ID | PRODUCTO_NOMBRE     | PRECIO_UNITARIO | STOCK |
  4. +-------------+--------------+-----------+---------------------+-----------------+-------+
  5. |           1 |            1 |         1 | LG 29SA1RL          |          344.48 |     1 |
  6. |           2 |            1 |         1 | PANASONIC TC-21GX30 |          275.52 |     1 |
  7. |           3 |            2 |         1 | BENQ G920HDA        |          156.52 |     1 |
  8. |           4 |            2 |         1 | ACER X223W          |          159.99 |     1 |
  9. +-------------+--------------+-----------+---------------------+-----------------+-------+

Obviamente, se comprende que para obtener una consulta que te devuelva el listado con indicacion de qué es cada cosa, debe hacerse cruzando las tres tablas, o al menos dos de ellas:

Código MySQL:
Ver original
  1.   PRODUCTO_ID,
  2.   CATEGORIA_NOMBRE,
  3.   SUBCAT_NOMBRE,
  4.   PRODUCTO_NOMBRE,
  5.   PRECIO_UNITARIO,
  6.   STOCK
  7. FROM producto p
  8.   INNER JOIN subcategoria s USING(categoria_id, subcat_id)
  9.   INNER JOIN CATEGORIA USING(categoria_id);
  10.  
  11. +-------------+------------------+---------------+---------------------+-----------------+-------+
  12. | PRODUCTO_ID | CATEGORIA_NOMBRE | SUBCAT_NOMBRE | PRODUCTO_NOMBRE     | PRECIO_UNITARIO | STOCK |
  13. +-------------+------------------+---------------+---------------------+-----------------+-------+
  14. |           1 | COMPUTACION      | MONITOR       | LG 29SA1RL          |          344.48 |     1 |
  15. |           2 | COMPUTACION      | MONITOR       | PANASONIC TC-21GX30 |          275.52 |     1 |
  16. |           3 | VIDEO            | TELEVISOR     | BENQ G920HDA        |          156.52 |     1 |
  17. |           4 | VIDEO            | TELEVISOR     | ACER X223W          |          159.99 |     1 |
  18. +-------------+------------------+---------------+---------------------+-----------------+-------+
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 27/12/2009 a las 15:40