Dilema de relación entre categorías y objetos

Iniciado por WHK, 5 Agosto 2011, 09:12 AM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Holas, tengo un pequeño problema sin solucionar, quería ver si alguien me puede dar una mano porque no encuentro información al respecto en gg y no se si tendrá algún nombre o función específica que lo haga.

Tengo la tabla frutas
Tengo una tabla categorías
Tengo una tabla contenido de categorías

En categorías tengo hartas cosas como por ejemplo paises por donde ha pasado.

El problema es el siguiente:
La fruta puede llevar mas de una etiqueta, digamos 3 y que además pasó por 2 paises, asi que ya tengo 2 categorías con 5 items, el problema es como relaciono esto con la tabla de frutas para poder hacer una busqueda a futuro?

Pensé en agregar una columna por cáda categoría en la tabla de la fruta pero no me sirve porque un administrador puede sacar o agregar categorías
El problema es que puede tener varias categorías o ninguna.

Tampoco me sirve serializar las categorías o separarlas por comas porque después necesito hacer un filtro de busqueda por checkboxes y no puedo estar buscando con like '%,$id,%' porque es muy impreciso e incomodo.

Que pasa si deseo listar todas las frutas que tengan la estampa 1,2 y 3 y que hayan pasado por mexico y chile?

Que puedo hacer en éste caso?

Estructura:
Código (sql) [Seleccionar]
CREATE TABLE IF NOT EXISTS `categorias` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nombre` char(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Volcar la base de datos para la tabla `categorias`
--

INSERT INTO `categorias` (`id`, `nombre`) VALUES
(1, 'paises_recorridos'),
(2, 'estampas');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `contenido_categorias`
--

CREATE TABLE IF NOT EXISTS `contenido_categorias` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_categoria` int(11) NOT NULL,
 `nombre` char(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Volcar la base de datos para la tabla `contenido_categorias`
--

INSERT INTO `contenido_categorias` (`id`, `id_categoria`, `nombre`) VALUES
(1, 1, 'Chile'),
(2, 1, 'México'),
(3, 1, 'Estados unidos'),
(4, 1, 'Argentina'),
(5, 2, 'Estampa de supermegacalidad'),
(6, 2, 'Estampa de madurez alta'),
(7, 2, 'Estampa sin fertilizante'),
(8, 2, 'Estampa de brillo');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `frutas`
--

CREATE TABLE IF NOT EXISTS `frutas` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `nombre` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Volcar la base de datos para la tabla `frutas`
--

INSERT INTO `frutas` (`id`, `nombre`) VALUES
(1, 'Pera'),
(2, 'Manzana'),
(3, 'Kiwi'),
(4, 'Plátano');


Claro que no lo quiero para frutas ni paises xD es solo un ejemplo de lo que quiero hacer con otros datos y tags con categorías de tags.

Creo haber visto esto en wordpress, mientras tanto le daré un vistazo al código fuente.

Edito:------------------------------------
Ya vi wordpress y lo que hace es crear dos tablas nuevas con relación de datos:
Estructura term_relationships
Estructura term_taxonomy


Habrá algo más cómodo y rápido que hacer una tabla como pasarela de relaciones?

Novlucker

La verdad que ahora no se me ocurre otra manera de la que comentas, porque dado que tienes todos los contenidos de categorias en una única tabla y a su vez quieres subdividir la búsqueda, o bien tienes una tabla intermedia, o bien tienes tablas para cada grupo de contenido de categoría, vease una tabla para paises, una para estampas, etc. :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Nakp

solo necesitas una tabla para registrar que tal fruta esta asociada a tal "contenido de categoria", suponiendo que una pera paso por chile y por méxico, y además tiene la estampa de madurez alta, el registro tendria algo como


id_frutaid_contenido_categoria
11
12
15

ahora, la consulta esta un poco mas pensada (talvez el diseño de la bbdd sea el malo :P) pero tendrías que hacer algo como

Código (sql) [Seleccionar]
select id_fruta from relaciones where id_contenido_categoria in(1,2,5) group by id_fruta having count(distinct id_contenido_categoria) = 3

donde el count sea igual al numero de categorias que deseas incluir :P
Ojo por ojo, y el mundo acabará ciego.