Ver Mensaje Individual
  #12 (permalink)  
Antiguo 03/02/2014, 07:10
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: este diseño es correcto

Cita:
Iniciado por primary Ver Mensaje
Hola jurema, bueno te comento que mi problema no tiene nada que ver con pogramacion simplemente quiero entender bien la estructura que estoy montando sin tener dudas, respecto a los campos nulos que comento gnzsoloyo si que lo entendi pero mi duda es que como tendria muchos subcategorias no solo dos como en el ejemplo en este caso tendria entres 4 o 6 queria saber si es buena idea dejar tantos campos nulos o en el caso de repetidos entonces si solucionarlo con que con programacion solucioanarlo.
Sigue pareciendo que hay un error de comprensión: Las subcategorías, por definición, no poseerían nulos en la solución propuesta, porque todas forzosamente dependerían de una categoría padre.
Sólo las categorías padre, es decir las superiores podrían tener un NULLL en la FK. nada más. Y como son categorías padre, son forzosamente pocas también, por lo que el problema simplemente, no existe.
¿Queda claro el tema?

Creo que te estás complicando anticipadamente sin necesidad.

Probemos si se visualiza mejor mi planteo de esta forma:
Código SQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS categoria;
  2. Query OK, 0 ROWS affected (0.09 sec)
  3.  
  4. mysql> CREATE TABLE CATEGORIA (
  5.     ->     CATEGORIA_ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  6.     ->     DESCRIPCION VARCHAR(100),
  7.     ->     CATEGORIA_PADRE INT UNSIGNED NULL,
  8.     ->     KEY(CATEGORIA_PADRE),
  9.     ->     FOREIGN KEY (CATEGORIA_PADRE)
  10.     ->     REFERENCES CATEGORIA(CATEGORIA_ID) ON DELETE cascade
  11.     ->     );
  12. Query OK, 0 ROWS affected (0.00 sec)
  13.  
  14. mysql>
  15. mysql> INSERT INTO CATEGORIA VALUES
  16.     ->     (1, 'POLITICA', NULL),
  17.     ->     (2, 'DEPORTE', NULL),
  18.     ->     (3, 'POLITICA', NULL),
  19.     ->     (4, 'SOCIEDAD', NULL),
  20.     ->     (5, 'MINISTERIO DE JUSTICIA', 1),
  21.     ->     (6, 'MINISTERIO DE INTERIOR', 1),
  22.     ->     (7, 'FUTBOL', 2),
  23.     ->     (8, 'OTROS', 2),
  24.     ->     (9, 'ACTUALIDAD', 3),
  25.     ->     (10, 'TODAS', 3);
  26. Query OK, 10 ROWS affected (0.00 sec)
  27. Records: 10  Duplicates: 0  Warnings: 0
  28.  
  29. mysql>
  30. mysql> SELECT *
  31.     -> FROM categoria;
  32. +--------------+------------------------+-----------------+
  33. | CATEGORIA_ID | DESCRIPCION            | CATEGORIA_PADRE |
  34. +--------------+------------------------+-----------------+
  35. |            1 | POLITICA               |            NULL |
  36. |            2 | DEPORTE                |            NULL |
  37. |            3 | POLITICA               |            NULL |
  38. |            4 | SOCIEDAD               |            NULL |
  39. |            5 | MINISTERIO DE JUSTICIA |               1 |
  40. |            6 | MINISTERIO DE INTERIOR |               1 |
  41. |            7 | FUTBOL                 |               2 |
  42. |            8 | OTROS                  |               2 |
  43. |            9 | ACTUALIDAD             |               3 |
  44. |           10 | TODAS                  |               3 |
  45. +--------------+------------------------+-----------------+
  46. 10 ROWS IN SET (0.00 sec)
  47.  
  48. mysql>
  49. mysql> SELECT
  50.     ->     C1.categoria_id cat_padre,
  51.     ->     C1.descripcion desc_padre,
  52.     ->     C2.categoria_id cat_hija,
  53.     ->     C2.descripcion desc_hija
  54.     -> FROM categoria C2 LEFT JOIN categoria C1 ON C2.categoria_padre = C1.categoria_id;
  55. +-----------+------------+----------+------------------------+
  56. | cat_padre | desc_padre | cat_hija | desc_hija              |
  57. +-----------+------------+----------+------------------------+
  58. |      NULL | NULL       |        1 | POLITICA               |
  59. |      NULL | NULL       |        2 | DEPORTE                |
  60. |      NULL | NULL       |        3 | POLITICA               |
  61. |      NULL | NULL       |        4 | SOCIEDAD               |
  62. |         1 | POLITICA   |        5 | MINISTERIO DE JUSTICIA |
  63. |         1 | POLITICA   |        6 | MINISTERIO DE INTERIOR |
  64. |         2 | DEPORTE    |        7 | FUTBOL                 |
  65. |         2 | DEPORTE    |        8 | OTROS                  |
  66. |         3 | POLITICA   |        9 | ACTUALIDAD             |
  67. |         3 | POLITICA   |       10 | TODAS                  |
  68. +-----------+------------+----------+------------------------+
  69. 10 ROWS IN SET (0.00 sec)

O bien, simplificando la query y sólo recuperando lo necesario sería:
Código SQL:
Ver original
  1. mysql> SELECT
  2.     ->     C1.categoria_id cat_padre,
  3.     ->     C1.descripcion desc_padre,
  4.     ->     C2.categoria_id cat_hija,
  5.     ->     C2.descripcion desc_hija
  6.     -> FROM categoria C1 INNER JOIN categoria C2 ON C1.categoria_id = C2.categoria_padre;
  7. +-----------+------------+----------+------------------------+
  8. | cat_padre | desc_padre | cat_hija | desc_hija              |
  9. +-----------+------------+----------+------------------------+
  10. |         1 | POLITICA   |        5 | MINISTERIO DE JUSTICIA |
  11. |         1 | POLITICA   |        6 | MINISTERIO DE INTERIOR |
  12. |         2 | DEPORTE    |        7 | FUTBOL                 |
  13. |         2 | DEPORTE    |        8 | OTROS                  |
  14. |         3 | POLITICA   |        9 | ACTUALIDAD             |
  15. |         3 | POLITICA   |       10 | TODAS                  |
  16. +-----------+------------+----------+------------------------+
  17. 6 ROWS IN SET (0.00 sec)
Si hay más niveles de subcategorías dependientes de subcategorías, se requieren otros LOEFT JOINs adicionales, pero la idea base sería esa.

El resto es mostrar por programación.
__________________
¿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; 03/02/2014 a las 07:17