Cita:
Iniciado por primary 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 originalmysql> DROP TABLE IF EXISTS categoria;
Query OK, 0 ROWS affected (0.09 sec)
mysql> CREATE TABLE CATEGORIA (
-> CATEGORIA_ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> DESCRIPCION VARCHAR(100),
-> CATEGORIA_PADRE INT UNSIGNED NULL,
-> KEY(CATEGORIA_PADRE),
-> FOREIGN KEY (CATEGORIA_PADRE)
-> REFERENCES CATEGORIA(CATEGORIA_ID) ON DELETE cascade
-> );
Query OK, 0 ROWS affected (0.00 sec)
mysql>
mysql> INSERT INTO CATEGORIA VALUES
-> (1, 'POLITICA', NULL),
-> (2, 'DEPORTE', NULL),
-> (3, 'POLITICA', NULL),
-> (4, 'SOCIEDAD', NULL),
-> (5, 'MINISTERIO DE JUSTICIA', 1),
-> (6, 'MINISTERIO DE INTERIOR', 1),
-> (7, 'FUTBOL', 2),
-> (8, 'OTROS', 2),
-> (9, 'ACTUALIDAD', 3),
-> (10, 'TODAS', 3);
Query OK, 10 ROWS affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql>
mysql> SELECT *
-> FROM categoria;
+--------------+------------------------+-----------------+
| CATEGORIA_ID | DESCRIPCION | CATEGORIA_PADRE |
+--------------+------------------------+-----------------+
| 1 | POLITICA | NULL |
| 2 | DEPORTE | NULL |
| 3 | POLITICA | NULL |
| 4 | SOCIEDAD | NULL |
| 5 | MINISTERIO DE JUSTICIA | 1 |
| 6 | MINISTERIO DE INTERIOR | 1 |
| 7 | FUTBOL | 2 |
| 8 | OTROS | 2 |
| 9 | ACTUALIDAD | 3 |
| 10 | TODAS | 3 |
+--------------+------------------------+-----------------+
10 ROWS IN SET (0.00 sec)
mysql>
mysql> SELECT
-> C1.categoria_id cat_padre,
-> C1.descripcion desc_padre,
-> C2.categoria_id cat_hija,
-> C2.descripcion desc_hija
-> FROM categoria C2 LEFT JOIN categoria C1 ON C2.categoria_padre = C1.categoria_id;
+-----------+------------+----------+------------------------+
| cat_padre | desc_padre | cat_hija | desc_hija |
+-----------+------------+----------+------------------------+
| NULL | NULL | 1 | POLITICA |
| NULL | NULL | 2 | DEPORTE |
| NULL | NULL | 3 | POLITICA |
| NULL | NULL | 4 | SOCIEDAD |
| 1 | POLITICA | 5 | MINISTERIO DE JUSTICIA |
| 1 | POLITICA | 6 | MINISTERIO DE INTERIOR |
| 2 | DEPORTE | 7 | FUTBOL |
| 2 | DEPORTE | 8 | OTROS |
| 3 | POLITICA | 9 | ACTUALIDAD |
| 3 | POLITICA | 10 | TODAS |
+-----------+------------+----------+------------------------+
10 ROWS IN SET (0.00 sec)
O bien, simplificando la query y sólo recuperando lo necesario sería:
Código SQL:
Ver originalmysql> SELECT
-> C1.categoria_id cat_padre,
-> C1.descripcion desc_padre,
-> C2.categoria_id cat_hija,
-> C2.descripcion desc_hija
-> FROM categoria C1 INNER JOIN categoria C2 ON C1.categoria_id = C2.categoria_padre;
+-----------+------------+----------+------------------------+
| cat_padre | desc_padre | cat_hija | desc_hija |
+-----------+------------+----------+------------------------+
| 1 | POLITICA | 5 | MINISTERIO DE JUSTICIA |
| 1 | POLITICA | 6 | MINISTERIO DE INTERIOR |
| 2 | DEPORTE | 7 | FUTBOL |
| 2 | DEPORTE | 8 | OTROS |
| 3 | POLITICA | 9 | ACTUALIDAD |
| 3 | POLITICA | 10 | TODAS |
+-----------+------------+----------+------------------------+
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.