[Php-avanzado] Tablas Clasificados Miramar
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Jue Ago 27 20:04:06 ART 2009
Hola Ezequiel,
El mar, 25-08-2009 a las 19:59 -0300, Ezequiel Mujica escribió:
> Hola Leo,
> Van mis comentarios en rojo ..
No soy como Stallman que maneja el correo com Emacs, pero sí tengo
desactivados los colores, tipografías e imágenes.
Igual se entiende perfecto!
Dejo solo lo relevante:
> CREATE TABLE xxx (
> idxxx VARCHAR(30) NOT NULL,
> PRIMARY KEY(idxxx)
> )
> TYPE=InnoDB;
>
> Lo qué???
> ESTA TABLA NO ESTA DEL TODO DEFINIDA, MI IDEA ES CREAR UNA
> TABLA DE PALABRAS PROHIBIDAS, UNA LISTA NEGRA DE PALABRAS QUE NO DEBEN
> UTILIZARCE, COMO QUERIA PREGUNTARTE A VOS QUE ES MEJOR... O QUE
> RECOMENDAS ES QUE QUEDO PELADA...
Si vas a tener una lista negra, armala con expresiones regulares porque
si no el trabajo administrativo es enorme.
La tabla no cambia, estoy hablando de implementación.
Igual para esta entrega esto debería quedar afuera, y será una
funcionalidad de Clasificados 2010 ;-)
> Muy bueno lo de la integridad referencial.
> La escribiste a mano o estás usando algún generador
> visual? Contame
> cuál!
> UN POCO DE TODO ACÁ, PARA CHECKEAR POR LAS DUDAS SUELO USAR
> MySQL WORKBENCH.. TOTALMENTE LIBRE ;-)
Yo no hay caso de que me acostumbre a los nombres que les pone a los
campos de las relaciones.
Seguramente son cosas de la edad...
Ojo con los borrados en cascada en los ON DELETE!!!
Haceme acordar de que te cuente dos cosas sobre la integridad y la
validación de los datos...
> CREATE TABLE usuario (
> idusuario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
> localidad_idlocalidad INTEGER UNSIGNED NOT NULL,
> nombre VARCHAR(25) NOT NULL,
> apellido VARCHAR(25) NOT NULL,
> fecha_nac DATE NULL,
> login VARCHAR(25) NOT NULL,
> email VARCHAR(40) NOT NULL,
> pass VARCHAR(25) NOT NULL,
> habilitado BOOL NOT NULL,
> domicilio VARCHAR(30) NULL,
> telefono VARCHAR(25) NULL,
> celular VARCHAR(25) NULL,
> eshop BOOL NULL,
> PRIMARY KEY(idusuario),
> INDEX usuario_FKIndex1(localidad_idlocalidad),
> FOREIGN KEY(localidad_idlocalidad)
> REFERENCES localidad(idlocalidad)
> ON DELETE NO ACTION
> ON UPDATE NO ACTION
> )
> TYPE=InnoDB;
>
> Qué es "eshop"? No lo relaciono con nada de la SRS...
> ESHOP SERIA UNA TIENDA VIRTUAL, QUE PODRIA TENER CADA
> CLIENTE POR UN ABONO MENSUAL "X" .. SE ME HABIA OCURRIDO PARA QUE SEA
> ALGO A FUTURO
Ah!!... entonces está mal :(
Es como si en Provincias y Ciudades tuvieras un booleano en la
Provincia para indicar si tiene o no tiene Ciudades...
Simplemente, si la relación está vacía no tiene, y si no está vacía sí
tiene.
> "precio" y "centavos" no debería ser varchar, pero
> "centavos" sobra y
> te saca hasta de 1FN!!! Un flotante es lo correcto para esto.
> OK, ESO ME PASA POR USAR COMO GUIA LOS SITIOS CLÁSICOS
> SOBRE LA MATERIA.... :-(
Demonios!
Qué sitio guarda así???
Si te consuela, he visto tablas en que para una fecha se usan 3
campos... no tengo ni idea de cómo se las arreglan para ordenar por
fecha usando índices y órdenes múltiples sin que deje de funcionar...
>
> "stock" y "visitas" no son cosas que figuren en tu SRS.
> las vas a
> agregar?
> SON COSAS QUE TENIA PENSADO HACER, PERO X TIEMPO NO LAS IBA
> A AGREGAR AHORA.
> DE TODAS FORMAS AGREGO "VISITAS" Y DEJO STOCK PARA UNA 2ª
> VERSIÓN.-
Ok.
>
> Qué es "masinfo" ?
> ESTO LO ELIMINÉ, PORQUE QUEDO DE OTRA IDEA QUE HABIA TENIDO
> PARA EL FORMATO DE LOS AVISOS.-
Esto te pasó por hacerle poco caso a la SRS!!!
>
> Tampoco indica tu SRS que haya que priorizar los
> avisos. Este sistema
> es más grande que el especificaste...
> ESTO SI LO AGREGO :-D ME INTERESO EL TEMA.-
Comparto el interés, el tema es que lleges a tener esto funcionando
antes de que te mueras del aburrimiento... porque con el tiempo,
trabajar sobre el mismo problema siempre aburre.
> Si el usuario que publica se llama usuario, cómo se
> llama el usuario
> que administra? No necesitás guardar su user y pass para que
> se loguee?
> PEQUEÑO DETALLE :-S
telodije!
CREATE TABLE rubro (
idrubro INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(80) NULL,
destacado CHAR(1) NULL,
imagen VARCHAR(50) NULL,
PRIMARY KEY(idrubro)
)
TYPE=InnoDB;
Sugerencia: para todo lo que es archivos, dejá al menos 128 caracteres
de tamaño
CREATE TABLE provincia (
idprovincia INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(100) NULL,
PRIMARY KEY(idprovincia)
)
TYPE=InnoDB;
CREATE TABLE tipos_publicidad (
idtipos_publicidad INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
tipo VARCHAR(5) NULL,
PRIMARY KEY(idtipos_publicidad)
)
TYPE=InnoDB;
Sólo 5 caracteres? Vas a codificar el nombre del tipo?
CREATE TABLE xxx (
idxxx INT NOT NULL,
palabra VARCHAR(25) NULL,
PRIMARY KEY(idxxx)
)
TYPE=InnoDB;
CREATE TABLE usuarios_root (
idusuarios_root INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(25) NULL,
apellido VARCHAR(25) NULL,
login VARCHAR(25) NULL,
pass VARCHAR(25) NULL,
email VARCHAR(40) NULL,
habilitado BOOL NULL,
nivel_acceso CHAR NULL,
PRIMARY KEY(idusuarios_root)
)
TYPE=InnoDB;
25 para nombre y apellido es muuuuuy poco.
40 para el e-mail es una miseria!!!
Y esto no requiere de una tabla para los niveles de acceso? Me la
imagino una tabla no relacionada, sino con el fin de que la combo de las
opciones se lea de algún lado en vez de tenerla en el código.
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(30) NULL,
domicilio VARCHAR(100) NULL,
email VARCHAR(80) NULL,
telefono VARCHAR(50) NULL,
celular VARCHAR(50) NULL,
PRIMARY KEY(idempresa)
)
TYPE=InnoDB;
30 es muy poco para el nombre!
De paso ponele un índice por nombre...
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),
INDEX localidad_FKIndex1(provincia_idprovincia),
FOREIGN KEY(provincia_idprovincia)
REFERENCES provincia(idprovincia)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
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,
url VARCHAR(100) NULL,
path VARCHAR(100) NULL,
ubicacion VARCHAR(30) NULL,
costo SMALLINT UNSIGNED NULL,
impresiones INTEGER UNSIGNED NULL,
clics INTEGER UNSIGNED NULL,
PRIMARY KEY(idpublicidad, rubro_idrubro, empresas_idempresa,
tipos_publicidad_idtipos_publicidad),
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;
Qué lugar raro para el costo!
CREATE TABLE usuario (
idusuario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
localidad_idlocalidad INTEGER UNSIGNED NOT NULL,
nombre VARCHAR(25) NOT NULL,
apellido VARCHAR(25) NOT NULL,
fecha_nac DATE NULL,
login VARCHAR(25) NOT NULL,
email VARCHAR(40) NOT NULL,
pass VARCHAR(25) NOT NULL,
habilitado BOOL NOT NULL,
domicilio VARCHAR(30) NULL,
telefono VARCHAR(25) NULL,
celular VARCHAR(25) NULL,
eshop BOOL NULL,
PRIMARY KEY(idusuario),
INDEX usuario_FKIndex1(localidad_idlocalidad),
FOREIGN KEY(localidad_idlocalidad)
REFERENCES localidad(idlocalidad)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
nombre y apellido son muy chicos...
el email también es miserable!
... y le sobra el eshop por los motivos dados arriba.
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 VARCHAR(250) 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),
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;
detalle tiene pinta de necesitar un text. Con varchar llegás solo a
255. Te alcanza???
Qué es "stock"?
CREATE TABLE fotos (
idfoto INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
aviso_rubro_idrubro INTEGER UNSIGNED NOT NULL,
aviso_usuario_idusuario INTEGER UNSIGNED NOT NULL,
aviso_idaviso INTEGER UNSIGNED NOT NULL,
aviso_moneda_idmoneda INTEGER UNSIGNED NOT NULL,
aviso_estado_aviso_idestado_aviso INTEGER UNSIGNED NOT NULL,
path VARCHAR(100) NULL,
PRIMARY KEY(idfoto, aviso_rubro_idrubro, aviso_usuario_idusuario,
aviso_idaviso, aviso_moneda_idmoneda,
aviso_estado_aviso_idestado_aviso),
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 CASCADE
ON UPDATE CASCADE
)
TYPE=InnoDB;
Salvo que hayas pensado algo muy, pero muy rebuscado, a esta tabla le
sobran cuatro (4) campos.
En qué pensaste para que la foto tenga por ejemplo la moneda del precio
del aviso???
Bueno Ezequiel, revisando la tabla de "fotos", la normalización está
correcta.
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