[Php-avanzado] Consulta para Leo

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Jue Nov 12 01:14:56 ARST 2009


Hola Carolina,

El mar, 10-11-2009 a las 03:14 -0300, Silverzero escribió:
> Hola,
> 
> Esas tablas son la relacion evento<->subcategorias, les puse raices
> porque no se me ocurría otro nombre, 

	El nombre clásico es Eventos_SubCategorias, indicando que es la
relación de las dos tablas.
	En tu caso sería Evento_Evento_Cat

> (me imaginé las diferentes subcategorías como las raíces de cada
> evento, actividad o lugar)...

	Pero esto no es un árbol!
	Cuando mapeas un árbol, tiene que poder tener una cantidad arbitraria
de niveles, y acá tenés solo dos.

> sé que el nombre no es muy explícito sin una previa aclaración...

	Vamos a tener que inventar los comentarios ;-)

> Después el resto lo dejé todo igual como te lo habia pasado la última
> vez, lo único que agregué fué un campo en las tablas de los votos, que
> es el puntaje de cada voto para sumarlos y poder hacer el promedio del
> puntaje actual del evento, actividad o lugar.

	No estaba ese campo en la versión anterior, porque como no hay que
poner lo que se pueda calcular, la idea era agregar registros a cada
voto y con un count saber cuantos votos tiene... incluso esto te
permite, si quisieras, hasta registrar quién es el que vota..


	Te hago comentarios más abajo:


>         El lun, 09-11-2009 a las 18:12 -0300, Silverzero escribió:
>         
>         > Hola Leo,
>         >
>         > Acá vá:
>         >
>         > -- phpMyAdmin SQL Dump
>         > -- version 2.11.9.5
>         > -- http://www.phpmyadmin.net
>         > --
>         > -- Servidor: localhost
>         > -- Tiempo de generación: 09-11-2009 a las 19:10:53
>         > -- Versión del servidor: 5.0.81
>         > -- Versión de PHP: 5.2.9
>         >
>         > SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
>         >
>         > --
>         > -- Base de datos: `salimas_sitio`
>         > --
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `actividades`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `actividades` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `fecha` date NOT NULL,
>         >   `desde` date NOT NULL,
>         >   `hasta` date NOT NULL,
>         >   `horario` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `titulo` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `descripcion` text collate utf8_unicode_ci NOT NULL,
>         >   `imagen` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `url` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `precio` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `id_visitante` int(11) NOT NULL,
>         >   `id_lugar` int(11) NOT NULL,
>         >   `id_stat` int(2) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=2 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `actividades_cat`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `actividades_cat` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=13 ;

	Ok. Estas son las Categorías...

>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `actividades_subcat`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `actividades_subcat` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `id_actividad_cat` int(11) NOT NULL,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=123 ;

	...y estas las SubCategorías, que siempre referencian a una Categoria.

>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `actividades_raices`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `actividades_raices` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `id_act` int(11) NOT NULL,
>         >   `id_subcat` int(11) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=1 ;

	Pues no... esta tabla dice que una Actividad, puede tener cero, una, o
muchas SubCategorias, pero tu SRS dice que podés tener una Actividad con
Categoría y ninguna SubCategoría, y este almacenamiento no lo permite.
	De hecho justamente de esta situación (Actividad sin SubCategorias) fue
que planteaste al principio de esta conversación la problemática de tu
almacenamiento.

	Para que una actividad pueda tener una (o muchas) Categoria sin
SubCategorias tenés que plantear una relación Actividad_Categoria y para
guardar las Subcategorías elegidas, si las hay, otra relación
Actividad_SubCategoría.

	Lo mismo para los Eventos y Lugares.

>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `diccionario`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `diccionario` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `frase` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=38 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `eventos`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `eventos` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `fecha` date NOT NULL,
>         >   `desde` date NOT NULL,
>         >   `hasta` date NOT NULL,
>         >   `horario` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `titulo` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `descripcion` text collate utf8_unicode_ci NOT NULL,
>         >   `imagen` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `url` varchar(100) collate utf8_unicode_ci NOT NULL,
>         >   `precio` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `id_visitante` int(11) NOT NULL,
>         >   `id_lugar` int(11) NOT NULL,
>         >   `id_stat` int(2) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=4 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `eventos_cat`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `eventos_cat` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=15 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `eventos_raices`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `eventos_raices` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `id_evento` int(11) NOT NULL,
>         >   `id_subcat` int(11) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=1 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `eventos_subcat`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `eventos_subcat` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `id_evento_cat` int(11) NOT NULL,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=123 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `localidades`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `localidades` (
>         >   `cod_loc` int(4) NOT NULL auto_increment,
>         >   `cod_prov` int(2) NOT NULL,
>         >   `desc` varchar(31) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`cod_loc`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=2383 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `lugares`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `lugares` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `fecha` date NOT NULL,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `direccion` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `telefono` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `email` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `horario` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `precio` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `descripcion` text collate utf8_unicode_ci NOT NULL,
>         >   `imagen` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `url` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `id_visitante` int(11) NOT NULL,
>         >   `cod_loc` int(4) NOT NULL,
>         >   `id_stat` int(2) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=11 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `lugares_cat`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `lugares_cat` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=16 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `lugares_raices`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `lugares_raices` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `id_lug` int(11) NOT NULL,
>         >   `id_subcat` int(11) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=1 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `lugares_subcat`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `lugares_subcat` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `id_lugar_cat` int(11) NOT NULL,
>         >   `nombre` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=1 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `provincias`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `provincias` (
>         >   `cod_prov` int(2) NOT NULL,
>         >   `desc` varchar(30) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`cod_prov`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `status`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `status` (
>         >   `id` int(11) NOT NULL,
>         >   `stat` varchar(10) collate utf8_unicode_ci NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `visitantes`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `visitantes` (
>         >   `id` int(11) NOT NULL auto_increment,
>         >   `fecha` date NOT NULL,
>         >   `nombres` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `apellidos` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `alias` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `email` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `pass` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `avatar` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `ocupacion` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `about` text collate utf8_unicode_ci NOT NULL,
>         >   `intereses` text collate utf8_unicode_ci NOT NULL,
>         >   `url` varchar(50) collate utf8_unicode_ci NOT NULL,
>         >   `id_stat` int(2) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci
>         > AUTO_INCREMENT=3 ;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `votos_actividades`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `votos_actividades` (
>         >   `id` int(11) NOT NULL,
>         >   `votos` int(11) NOT NULL default '0',
>         >   `puntaje` int(11) NOT NULL default '0',
>         >   `id_actividad` int(11) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `votos_eventos`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `votos_eventos` (
>         >   `id` int(11) NOT NULL,
>         >   `votos` int(11) NOT NULL default '0',
>         >   `puntaje` int(11) NOT NULL default '0',
>         >   `id_evento` int(11) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci;
>         >
>         > -- --------------------------------------------------------
>         >
>         > --
>         > -- Estructura de tabla para la tabla `votos_lugares`
>         > --
>         >
>         > CREATE TABLE IF NOT EXISTS `votos_lugares` (
>         >   `id` int(11) NOT NULL,
>         >   `votos` int(11) NOT NULL default '0',
>         >   `puntaje` int(11) NOT NULL default '0',
>         >   `id_lugar` int(11) NOT NULL,
>         >   PRIMARY KEY  (`id`)
>         > ) ENGINE=MyISAM DEFAULT CHARSET=utf8
>         COLLATE=utf8_unicode_ci;

	Estaba pensando que los votos pueden integrarse. En su momento no me
sonaba bien esto porque se veía muy repetido, estructuralmente y
funcionalmente hablando.

	Podría ser una tabla de TiposDeEvento con, por ahora, 3 registros
conteniendo Lugares, Eventos y Actividades y la tabla de Votos tener id,
voto, puntaje, id_ref y id_tipo, en la que según el "tipo" se
corresponderá con un TiposDeEvento y le da sentido semántico a id_ref,
que es una referencia al ID de la tabla correspondiente.

	Da lo mismo con 3 tablas que con estas dos, pero quería planteártelo.

	Lo que no me cierra es eso de editar los votos en vez de agregar
registros y luego sumar, contar o promediar... además eso hace que el
campo "puntaje" no tenga sentido, o sea muy complejo de calcular. Cómo
pensabas calcularlo???

>         > ¡Gracias!
>         > ¡Saludos!
>         >

	Por nada!
-- 

Leonardo Tadei
leonardot en pegasusnet.com.ar
http://blog.pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado