Foros del Web » Programando para Internet » PHP »

Sistema de Categorias ¿cómo lo hago?

Estas en el tema de Sistema de Categorias ¿cómo lo hago? en el foro de PHP en Foros del Web. Resulta que estoy creando un sistema de noticias por categorías, pero no sé como catalogar las categorías, me explico: Tengo 3 categorías madre (Videojuegos, Actualizaciones, ...
  #1 (permalink)  
Antiguo 08/07/2003, 08:17
V_G
Invitado
 
Mensajes: n/a
Puntos:
Sistema de Categorias ¿cómo lo hago?

Resulta que estoy creando un sistema de noticias por categorías, pero no sé como catalogar las categorías, me explico:
Tengo 3 categorías madre (Videojuegos, Actualizaciones, Afiliados), y dentro de cada categoría madre hay subcategorías, así:
- Videojuegos [PS2, GC, GBA, PC, XBX, etc..]
- Actualizaciones [articulos, reportajes, reviews, etc..]
- Afiliados [afiliado1, afiliado2, etc..]

¿Qué idea se les ocurre? A mi se me habia ocurrido crear una tabla por cada categoría madre, y dentro las subcategorías, pero esto es un poco "cutre".

PD: El sistema usa db MySQL y PHP.

Les agradezco sus ideas por adelantado.
  #2 (permalink)  
Antiguo 08/07/2003, 08:23
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 21 años, 1 mes
Puntos: 1
loq ue puedes hacer es crear las categorias con un id auotoincrementable y depues cada uno que este dentro lo guardas con su id propio y con el de la categoria seria algo asi

categoria:
id nombre descripcion
1 videojuegos esta actegoria es para....
2 actualizaciones esta categoriaes para lo que sea
3 afiliados est....

subcategorias
id nombre descripcion idcategoria
1 ps2 nose 1
2 gba gba 1
3 articulos arti... 2
4 xbx .... 1


y etc

Un Saludo
  #3 (permalink)  
Antiguo 08/07/2003, 08:44
V_G
Invitado
 
Mensajes: n/a
Puntos:
Ok, muchas gracias por tu ayuda, voy a probarlo.
  #4 (permalink)  
Antiguo 08/07/2003, 08:47
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

A mi se me ocurren dos soluciones. Una es usar una tabla para almacenar las categorias madre y otra tabla que almacene las hijas. La otra es guardar todas las categorias en una sola tabla creando una especie de arbol. Dependiendo del tipo de consultas que vayas a hacer, te sera mas util una u otra.

1.- Dos tablas:

Tabla: Categorias_madre (ID_madre (clave primaria),Nombre_categoria)
Tabla: Categorias_hija (ID_hija (clave primaria),Nombre_categoria,ID_madre)

Ej:

Categorias_madre
-----------------------
ID_madre----Texto
-----------------------
1---------------Videojuegos
2---------------Actualizaciones
3---------------Afiliados

Categorias_hija
--------------------
ID_hija--Texto-------ID_madre
-------------------------------
1---------PS2---------1
2---------GC----------1
3---------articulos---2
4---------afiliado1---3


ID_madre en Categorias_hija es la clave foranea que relaciona ambas tablas, almacena el ID_madre de Categorias_madre que corresponda. Para sacar las categorias hijas de determinada categoria madre, sabiendo el ID_madre es simplemente:

SELECT * FROM Categorias_hija WHERE ID_madre='laID'

Inconveniente metodo 1: Si quieres crear un nivel mas de categorias deberias crear otra tabla (Subcategorias, por ejemplo).

2.- Una sola tabla:

Tabla: Categorias (ID (clave primaria), Texto, ID_madre)

Ej:

Categorias
--------------------
ID--Texto--------------ID_madre
--------------------------------------
1---Videojuegos------0
2---Actualizaciones--0
3---Afiliados-----------0
4---PS2----------------1
5---GC-----------------1
6---articulos----------2
7---afiliado1----------3


En este caso tenemos todas las categorias tanto las madres como las hijas. Se distingen porque las madres tendan en ID_madre el valor 0, mientras que las hijas tendran el valor del ID de la categoria madre. La consulta seria similar (igual cambiando el nombre de la tabla).

Ventaja del metodo 2: que puedes crear sin problemas otro nivel de categoria, por ejemplo una subcategoria de Actualizaciones-Articulos simplemente poniendo en ID_madre el ID de Articulos.
Inconveniente del metodo 2: Se dificulta su manejo con consultas complejas.

Espero haber sido de ayuda.

PD: ¿No deberia ir en el foro de Base de Datos? Ya que es un problema de estructura de la base de datos, no de como se accede desde PHP.

PD: Si quieres que las categorias pertenezcan a varias categorias madre, debes crear otra tabla que almacene esas multiples relaciones en lugar de almacenarlas en la misma tabla que las categorias.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 08/07/2003, 08:49
Avatar de camargo  
Fecha de Ingreso: abril-2002
Ubicación: Kerétaro, Méjiko
Mensajes: 1.045
Antigüedad: 22 años
Puntos: 2
lo que te quizo explicar DINASEN, solo que con codigo;) :xD
Código:
CREATE TABLE cat_juegos (
id int(9) NOT NULL auto_increment,
categoria char(255) NOT NULL,
descripcion longtext NOT NULL,
PRIMARY KEY(id) );
y
Código:
CREATE TABLE subcat_juegos (
id int(9) NOT NULL auto_increment,
id_categoria char(255) NOT NULL,
descripcion longtext NOT NULL,
PRIMARY KEY(id) );
Entonces llego la hora del PHP, q es cuando daras a conocer las categorias que existen:
Código PHP:
$sql mysql_query("SELECT * FROM cat_juegos");
while(
$row=mysql_fetch_array($sql)){
echo 
"<a href=subcategorias.php?id=".$row[id].">".$row['categoria']."</a>";

Despues pasamos a un file llamado subcategorias.php
Nota: A la hora de agregar una subcategoria es necesario rellenar el cambo de ID_CATEGORIA de la tabla para saber a que ID de la tabla CATEGORIAS nos referimos,, y si por ejemplo escogimos en el 1er script la numero 1,, necesitaremos el sig codigo:
Código PHP:
$sql mysql_query("SELECT * FROM subcat_juegos WHERE id = '$id'");
while(
$row=mysql_fetch_array($sql)){
echo 
"".nl2br($row[descripcion])."";

Listo ,, soy profesional en codigo..xDDD jej..
Salu2
__________________
http://www.chorcha.com
  #6 (permalink)  
Antiguo 08/07/2003, 08:51
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Tampoco es necesario utilizar dos tablas...
utilizando una sola tabla alcanza y sobra :
Código:
ID | Id_padre | Categoria
 1        0         Videojuegos
 2        0         Actualizaciones
 3        0         Afiliados
 4        1         PS2
 5        1         PC
 6        2         Artículos
Y así.
Ese tipo de estructura en árbol es la más utilizada para este tipo de tareas, aunque hay otra manera de guardar los datos, un poco más compleja en su entendimiento, pero más eficiente a la hora de recorrer el árbol.

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #7 (permalink)  
Antiguo 08/07/2003, 08:56
Avatar de camargo  
Fecha de Ingreso: abril-2002
Ubicación: Kerétaro, Méjiko
Mensajes: 1.045
Antigüedad: 22 años
Puntos: 2
Tambien con un SELECT * DISTINCT de la misma tabla puedes llegar a solucionar tu problema ;)
__________________
http://www.chorcha.com
  #8 (permalink)  
Antiguo 08/07/2003, 09:24
V_G
Invitado
 
Mensajes: n/a
Puntos:
Pues, ahora que lo veo, prefiero usar el segundo método de Josemi o el método de Webstudio (Que son muy parecidos). Ya que me interesa que en el futuro pueda agregar más categorias madre.

De todas formas, muchas gracias a todos
  #9 (permalink)  
Antiguo 08/07/2003, 09:28
V_G
Invitado
 
Mensajes: n/a
Puntos:
Ah!, se me olvidaba preguntar otra cosa a Webstudio: ¿cuál es la otra manera de guardar los datos??
  #10 (permalink)  
Antiguo 08/07/2003, 10:11
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Se trata de asignarle valores a derecha e izquierda a los nodos del arbol, utilizando el método de recorrido Preorden.ç
Pero mejor explicado está en este tutorial de SitePoint. Yo estaba pensando crear un objeto que maneje este tipo de estructuras de manera transparente al usuario, después les comento si avanzo en algo :

http://www.sitepoint.com/print/1105

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #11 (permalink)  
Antiguo 08/07/2003, 13:30
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Interesante link. Imperdonable que me lo haya perdido (visito habitualmente sitepoint para ver los nuevos articulos, se puede pensar en el como maestrosdelweb en ingles).

Esta claro que todo depende del uso que le vayas a dar al arbol (comentan que la insercion es mas lenta). Lo ideal seria definir una clase virtual que definiese el interface y 3 clases hijas concretas, cada una implementando cada uno de los metodos para mantener los indices (la estructura de arbol). Teniendo en cuenta que solo es el indice, incluso se podrian hacer metodos para pasar de un metodo a otro, para poder asi pasar dinamicamente de uno a otro. Asi, usando el mismo interfaz (codigo) en tu script principal, podrias usar una u otra clase concreta dependiendo de las necesidades concretas de la aplicacion.

Saludos.

PD: Claro que si Webstudio hace la clase, pues mejor
__________________
Josemi

Aprendiz de mucho, maestro de poco.
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 23:59.