[Php-avanzado] tablas 1.3 de autoclas

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Jue Sep 3 12:49:01 ART 2009


Hola Carlos,

El jue, 03-09-2009 a las 12:01 -0300, Carlos Brandes escribió:
> Leonardo:te conesto intercalado.
> 

>         
>                Ok.... eso de tener "departamentos" te va a dar a vos y
>         a Javier un
>         dolor de cabeza...
>                Además, con enviar la estructura es suficiente.... me
>         mandaste todos
>         los datos! 
>  
>         (este curso me enseño a compartir, sobre todas las cosas ;) en
>         realidad solo me intereza la ciudad y la provincia donde vive
>         el anunciante"por el tema de las busquedas que hagan los
>         interesados", no asi la direccion especifica, ya que el
>         contacto se realizara por otros carriles)

	Está perfecto y me alegra que veas que es mejor compartir que no
hacerlo... pero con los "departamentos" o como los llamamos acá
"partidos" en medio de la relación, las consultas para la interfaz de
carga de los anunciantes es más larga....

>                Todos los jueves estaré de 18 a 22hs con el curso de
>         PHP Avanzado del
>         2do cuatrimestre.
>                Podés pasar a consultar o a entregar cualquier día,
>         pero si avisás
>         antes, mejor, para saber que tenés lugar. Igual, prefiero que
>         vengas sin
>         avisar a que no vengas por no haber avisado...
>                Cuanto antes entregues, mejor... 
> 
> Si si es lo que quiero hacer

	Genial!


>         --
>         -- Estructura de tabla para la tabla `anunciantes`
>         --
>         
>         CREATE TABLE `anunciantes` (
>          `id_anunciante` int(11) unsigned NOT NULL auto_increment,
>          `nombre` varchar(50) collate latin1_spanish_ci NOT NULL,
>          `apellido` varchar(50) collate latin1_spanish_ci NOT NULL,
>          `usuario` varchar(30) collate latin1_spanish_ci NOT NULL,
>          `password` varchar(30) collate latin1_spanish_ci NOT NULL,
>          `email` varchar(100) collate latin1_spanish_ci NOT NULL,
>          `id_localidad` int(11) unsigned NOT NULL,
>          `sexo` enum('femenino','masculino') collate latin1_spanish_ci
>         NOT
>         NULL,(corregido)
>          `telefono` varchar(30) collate latin1_spanish_ci NOT NULL,
>          PRIMARY KEY  (`id_anunciante`),
>          UNIQUE KEY `id_ciudad` (`id_localidad`)
>         ) ENGINE=MyISAM DEFAULT CHARSET=latin1
>         COLLATE=latin1_spanish_ci
>         AUTO_INCREMENT=1 ;
>         
>         
>                Ajá, sexo es un enum... y de dónde vas a leer los datos
>         para cargar en
>         una combo o armar botones de radio?
>                Los campos ENUM son para restringir la posibilidad de
>         ingresar datos,
>         pero no reemplazan a las relaciones....
>                La clave única que definiste significa que no podrá
>         haber dos
>         anunciantes en la misma ciudad... es esto correcto para tu
>         sistema? (esto no lo entiendo a nivel de relaciones. pero hice
>         lo que me sugeriste)
>  
>                Definí para mejorar la performance un índice por
>         "usuario"+"password" y
>         otro para mostrar por apellido y nombre (o al revés).
>         
> Que te parece esto asi?? 
> 
> 
>         CREATE TABLE `anunciantes` (
>           `id_anunciante` int(11) unsigned NOT NULL auto_increment,
>           `nombre` varchar(50) collate latin1_spanish_ci NOT NULL,
>           `apellido` varchar(50) collate latin1_spanish_ci NOT NULL,
>           `usuario` varchar(30) collate latin1_spanish_ci NOT NULL,
>           `password` varchar(30) collate latin1_spanish_ci NOT NULL,
>           `email` varchar(100) collate latin1_spanish_ci NOT NULL,
>           `id_localidad` int(11) unsigned NOT NULL,
>           `sexo` varchar(10) collate latin1_spanish_ci NOT NULL,
>         (corregido)
>           `telefono` varchar(30) collate latin1_spanish_ci NOT NULL,
>           PRIMARY KEY  (`id_anunciante`),
>           UNIQUE KEY `id_ciudad` (`id_localidad`),
>           KEY `usuario` (`usuario`,`password`),
>           KEY `apellido` (`apellido`,`nombre`)
>         ) ENGINE=MyISAM DEFAULT CHARSET=latin1
>         COLLATE=latin1_spanish_ci AUTO_INCREMENT=1 ;

	Estimado Carlos, si "sexo" es un varchar, no estás en 2NF...

	Una "pensada" más y lo tenés listo!

> Todavis no tengo claro como usarlos en las consultas(a los indices,
> pero encontre algo aca.
> http://www.ignside.net/man/mysql/indices.php ) 


	Despreocupate!
	Una vez definidos los índices, el RDBMS se da cuenta de usarlos cuando
hay una relación que usa un campo con índice, cuando hay un WHERE que
consulta por campos en el índice y cuando hay un ORDER BY que ordena por
campos en un índice.

	Naturalmente que sin ningún índice las consultas funcionan y se
escriben igual, pero los índices ayudan al RDBMS a encontrar las cosas
más rápido, lo que resulta de querys que se ejecutan óptimamente.

	Ojo! Seguís con el UNIQUE KEY `id_ciudad` (`id_localidad`).
	Una clave única significa que en toda la tabla puede haber solo una
entrada con ese dato... por eso te decía que con esa definición de
tabla, no puede haber 2 anunciantes en la misma ciudad.
	Un caso típico de uso de claves únicas es por ejemplo la CUIT en una
tabla de empresas. Así te garantizás que nunca pueda haber 2 empresas
con la misma CUIT, lo cual es claramente inválido (e ilegal facturar a
una empresa con la CUIT mal)


>         -- --------------------------------------------------------
>         
>         --
>         -- Estructura de tabla para la tabla `avisos`
>         --
>         
>         CREATE TABLE `avisos` (
>          `id_avisos` int(10) unsigned NOT NULL auto_increment,
>         (corregido) (se me chispoteo, fijate que en el resto de las
>         tablas los campos claves estan en singular)

	Vi que fuiste consistente en los nombres de los campos... a mi me toca
avisar de las cosas que veo que desentonan.
	Fijate por ejemplo aquí mismo como `kilometros` está en plural y el
nombre es correcto para hablar del campo sin que "suene mal"
semánticamente hablando.

	Si nos ponemos exquisitos, el campo `kilometros` suena mal cuando es un
"cero kilómetro", cosa que se resolvería llamando al campo
`kilometraje`.
	A mi no me hubiera pasado nunca, porque de vago llamaría a ese campo
"kil" ;-)
	No te digo esto para que le cambies el nombre, sino solo para que
discutamos al respecto!


>          `kilometros` int(11) NOT NULL,
>          `precio` float NOT NULL,
>          `fecha_publicacion` date NOT NULL,
>          `descripcion` varchar(150) collate latin1_spanish_ci NOT
>         NULL,
>          `id_moneda` int(11) NOT NULL,
>          `id_anunciante` int(11) NOT NULL,
>          `id_operacion` int(11) NOT NULL,
>          `id_condicion` int(11) NOT NULL,
>          `id_modelo` int(11) NOT NULL,
>          `id_combustible` int(11) NOT NULL,
>          `id_caracteristica` int(11) NOT NULL,
>          PRIMARY KEY  (`id_avisos`)
>         ) ENGINE=MyISAM DEFAULT CHARSET=latin1
>         COLLATE=latin1_spanish_ci
>         AUTO_INCREMENT=1 ;
>         
>                Es más correcto que la clave esté en singular, y no en
>         plural. Te vas a
>         confundir al escribir el código.
>         


	Seguimos!

-- 

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