[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