[Php-avanzado] Tablas ClasificadosMiramar ( I`m Back !!! )

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Lun Oct 19 01:06:57 ARST 2009


Hola Ezequiel!

El dom, 18-10-2009 a las 21:57 -0300, Ezequiel Mujica escribió:
> Hola Leo... no me perdí... pero los tiempos que tengo son mínimos  :S

	Ni lo menciones...

> Van mis comentarios intercalados y las tablas corregidas en
> adjunto ...

	A ver:


>         CREATE TABLE provincia (
>          idprovincia INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          nombre VARCHAR(100) NULL,
>          PRIMARY KEY(idprovincia)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE nivelacceso (
>          idnivelacceso INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          nivel CHAR NULL,
>          PRIMARY KEY(idnivelacceso)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE rubro (
>          idrubro INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          nombre VARCHAR(80) NULL,
>          destacado CHAR(1) NULL,
>          imagen VARCHAR(150) NULL,
>          PRIMARY KEY(idrubro)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE xxx (
>          idxxx INT NOT NULL,
>          palabra VARCHAR(25) NULL,
>         
>         // Dale un ancho mayor, para poder incluir alguna frase o
>         comodines para
>         tratar como expresiones regulares.
>    // OK, LE DI 200 DE ANCHO, ESPERO QUE ALCANCE :D

	Esperemos que sí!


>          PRIMARY KEY(idxxx)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE tipos_publicidad (
>          idtipos_publicidad INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          tipo VARCHAR(5) NULL,
>         
>         // Solo 5??? g-r-a-t-i-s son 6 letras y ya no cabe... ni
>         hablar de tipo
>         c-o-m-e-r-c-i-o El espacio en disco es muy barato!
>    // ES VERDAD, PENSABA CODIFICARLO... PERO VISTO LOS COMENTARIOS
> DECIDI DARLE ALGO MAS DE ESPACIO. 

	Ezequiel, codificado, significa que es un INT, para relacionarlo con la
tabla de las descripciones de los tipos...

>         
>          PRIMARY KEY(idtipos_publicidad)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE moneda (
>          idmoneda INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          moneda VARCHAR(30) NULL,
>          PRIMARY KEY(idmoneda)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE estado_aviso (
>          idestado_aviso INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          estado VARCHAR(10) NULL,
>          PRIMARY KEY(idestado_aviso)
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE empresas (
>          idempresa INT NOT NULL AUTO_INCREMENT,
>          nombre VARCHAR(100) NOT NULL,
>          domicilio VARCHAR(100) NULL,
>          email VARCHAR(80) NULL,
>          telefono VARCHAR(50) NULL,
>          celular VARCHAR(50) NULL,
>          PRIMARY KEY(idempresa)

	a esta le podrías agregar un índice unique para el nombre, o para
alguna cosa que sea única por empresa, así no se cargan repetidas.

>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE usuarios_root (
>          idusuarios_root INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          nivelacceso_idnivelacceso INTEGER UNSIGNED NOT NULL,
>          nombre VARCHAR(100) NULL,
>          apellido VARCHAR(100) NULL,
>          login VARCHAR(30) NULL,
>          pass VARCHAR(30) NULL,
>          email VARCHAR(100) NULL,
>          habilitado BOOL NULL,
>          PRIMARY KEY(idusuarios_root, nivelacceso_idnivelacceso),
>         
>         // Esta clave doble te va a dar varios dolores de cabeza. Por
>         qué la
>         clave no es simplemente idusuarios_root??? Así los id de
>         usuario son
>         únicos.
>    // ES VERDAD... CORREGIDO...
> 
>         
>          INDEX usuarios_root_FKIndex1(nivelacceso_idnivelacceso),
>          FOREIGN KEY(nivelacceso_idnivelacceso)
>            REFERENCES nivelacceso(idnivelacceso)
>              ON DELETE NO ACTION
>              ON UPDATE CASCADE
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE localidad (
>          idlocalidad INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          provincia_idprovincia INTEGER UNSIGNED NOT NULL,
>          nombre VARCHAR(80) NULL,
>          codpostal VARCHAR(10) NULL,
>          PRIMARY KEY(idlocalidad),

	acá también vale la pena pensar en un unique...

>          INDEX localidad_FKIndex1(provincia_idprovincia),
>          FOREIGN KEY(provincia_idprovincia)
>            REFERENCES provincia(idprovincia)
>              ON DELETE NO ACTION
>              ON UPDATE CASCADE
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE publicidad (
>          idpublicidad INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          rubro_idrubro INTEGER UNSIGNED NOT NULL,
>          empresas_idempresa INT NOT NULL,
>          tipos_publicidad_idtipos_publicidad INTEGER UNSIGNED NOT
>         NULL,
>          nombre VARCHAR(100) NULL,
>          largo SMALLINT UNSIGNED NULL,
>          ancho SMALLINT UNSIGNED NULL,
>         
>         // Que largo y ancho se limiten solo a 256 suena a muy poco...
>         supongo
>         que ahí irá una medida en píxeles.
>    // CORREGIDO, LA VERDAD NO ME DI CTA. DE LA LIMITACION DE LOS 256..
> PASADO A INT. 
> 
>         
>          url VARCHAR(100) NULL,
>          path VARCHAR(100) NULL,
>          ubicacion VARCHAR(30) NULL,
>          impresiones INTEGER UNSIGNED NULL,
>          clics INTEGER UNSIGNED NULL,
>          PRIMARY KEY(idpublicidad, rubro_idrubro, empresas_idempresa,
>         tipos_publicidad_idtipos_publicidad),

	Esta clave primaria, además de ser horrible para manejar, no le veo el
sentido...
	Me la explicás?
	Con que la clave sea solo el auto incremental, debería ser suficiente.

>          INDEX publicidad_FKIndex1(rubro_idrubro),
>          INDEX publicidad_FKIndex2(empresas_idempresa),
>          INDEX
>         publicidad_FKIndex3(tipos_publicidad_idtipos_publicidad),
>          FOREIGN KEY(rubro_idrubro)
>            REFERENCES rubro(idrubro)
>              ON DELETE CASCADE
>              ON UPDATE CASCADE,
>          FOREIGN KEY(empresas_idempresa)
>            REFERENCES empresas(idempresa)
>              ON DELETE CASCADE
>              ON UPDATE CASCADE,
>          FOREIGN KEY(tipos_publicidad_idtipos_publicidad)
>            REFERENCES tipos_publicidad(idtipos_publicidad)
>              ON DELETE NO ACTION
>              ON UPDATE CASCADE
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE usuario (
>          idusuario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          localidad_idlocalidad INTEGER UNSIGNED NOT NULL,
>          nombre VARCHAR(100) NOT NULL,
>          apellido VARCHAR(100) NOT NULL,
>          fecha_nac DATE NULL,
>          login VARCHAR(25) NOT NULL,
>          email VARCHAR(100) NOT NULL,
>          pass VARCHAR(25) NOT NULL,
>          habilitado BOOL NOT NULL,
>          domicilio VARCHAR(30) NULL,
>          telefono VARCHAR(25) NULL,
>          celular VARCHAR(25) NULL,
>          PRIMARY KEY(idusuario),
>          INDEX usuario_FKIndex1(localidad_idlocalidad),

	acá el login debe ser único también, si no la autentificación va a
tener un fallo de seguridad grave.

>          FOREIGN KEY(localidad_idlocalidad)
>            REFERENCES localidad(idlocalidad)
>              ON DELETE NO ACTION
>              ON UPDATE CASCADE
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE aviso (
>          idaviso INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          usuario_idusuario INTEGER UNSIGNED NOT NULL,
>          rubro_idrubro INTEGER UNSIGNED NOT NULL,
>          moneda_idmoneda INTEGER UNSIGNED NOT NULL,
>          estado_aviso_idestado_aviso INTEGER UNSIGNED NOT NULL,
>          titulo VARCHAR(50) NOT NULL,
>          detalle TEXT NOT NULL,
>          precio FLOAT NULL,
>          stock INTEGER UNSIGNED NULL,
>          alta DATE NULL,
>          baja DATE NULL,
>          visitas INTEGER UNSIGNED NULL DEFAULT 0,
>          habilitado BOOL NULL,
>          destacados INTEGER UNSIGNED ZEROFILL NULL DEFAULT 000,
>          prioridad SMALLINT UNSIGNED NULL,
>          PRIMARY KEY(idaviso, usuario_idusuario, rubro_idrubro,
>         moneda_idmoneda, estado_aviso_idestado_aviso),

	Arg!!! Qué clave primaria!!!
	No alcanza solo con idaviso? Por qué no alcanza?

>          INDEX aviso_FKIndex1(usuario_idusuario),
>          INDEX aviso_FKIndex2(rubro_idrubro),
>          INDEX aviso_FKIndex3(moneda_idmoneda),
>          INDEX aviso_FKIndex4(estado_aviso_idestado_aviso),
>          FOREIGN KEY(usuario_idusuario)
>            REFERENCES usuario(idusuario)
>              ON DELETE CASCADE
>              ON UPDATE CASCADE,
>          FOREIGN KEY(rubro_idrubro)
>            REFERENCES rubro(idrubro)
>              ON DELETE CASCADE
>              ON UPDATE CASCADE,
>          FOREIGN KEY(moneda_idmoneda)
>            REFERENCES moneda(idmoneda)
>              ON DELETE NO ACTION
>              ON UPDATE CASCADE,
>          FOREIGN KEY(estado_aviso_idestado_aviso)
>            REFERENCES estado_aviso(idestado_aviso)
>              ON DELETE NO ACTION
>              ON UPDATE CASCADE
>         )
>         TYPE=InnoDB;
>         
>         CREATE TABLE fotos (
>          idfoto INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>          aviso_estado_aviso_idestado_aviso INTEGER UNSIGNED NOT NULL,
>          aviso_moneda_idmoneda INTEGER UNSIGNED NOT NULL,
>          aviso_rubro_idrubro INTEGER UNSIGNED NOT NULL,
>          aviso_usuario_idusuario INTEGER UNSIGNED NOT NULL,
>          aviso_idaviso INTEGER UNSIGNED NOT NULL,
>         
>         // Pues no... con solo el aviso_idaviso y usando la relación
>         tenés el
>         estado, la moneda, el rubro y el usuario. Estos 4 campos no
>         van acá.
>    // CORREGIDO A MANOPLA... LA HERRAMIENTA CASE ESTABA EMPERRADA EN
> NO DEJARME SACAR LOS DEMAS CAMPOS... 

	Debe ser por la integridad referencial con la clave injustificadamente
larga de la tabla Avisos...

>         
>          path VARCHAR(100) NULL,
>          PRIMARY KEY(idfoto, aviso_estado_aviso_idestado_aviso,
>         aviso_moneda_idmoneda, aviso_rubro_idrubro,
>         aviso_usuario_idusuario,
>         aviso_idaviso),
>          INDEX fotos_FKIndex1(aviso_idaviso, aviso_usuario_idusuario,
>         aviso_rubro_idrubro, aviso_moneda_idmoneda,
>         aviso_estado_aviso_idestado_aviso),
>          FOREIGN KEY(aviso_idaviso, aviso_usuario_idusuario,
>         aviso_rubro_idrubro, aviso_moneda_idmoneda,
>         aviso_estado_aviso_idestado_aviso)
>            REFERENCES aviso(idaviso, usuario_idusuario, rubro_idrubro,
>         moneda_idmoneda, estado_aviso_idestado_aviso)
>              ON DELETE NO ACTION
>              ON UPDATE NO ACTION
>         )
>         TYPE=InnoDB;
>         
>         
>                Saludos!


	Listo!!!


PD: esta ves, sí que fue rápido!


-- 

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