[Php-avanzado] Tablas Clasificados Miramar
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Jue Ago 20 03:25:23 ART 2009
Hola Ezequiel,
El mar, 18-08-2009 a las 23:13 -0300, Ezequiel Mujica escribió:
> Hola a todos !!
>
> Leo:
> Te paso mis tablas para revisar.
Te respondo intercalado:
CREATE TABLE provincia (
idprovincia INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(100) NULL,
PRIMARY KEY(idprovincia)
)
TYPE=InnoDB;
CREATE TABLE rubro (
idrubro INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(80) NULL,
destacado BOOL NULL,
imagen VARCHAR(50) NULL,
PRIMARY KEY(idrubro)
)
TYPE=InnoDB;
Sugerencia: cambiá destacado a CHAR(1), porque preguntar si es igual a
TRUE o igual a "A" es lo mismo, y te permite agregar tipos de destacados
en el futuro.
La DB notará el impacto de esto recién a las decenas de miles de
registros...
CREATE TABLE xxx (
idxxx VARCHAR(30) NOT NULL,
PRIMARY KEY(idxxx)
)
TYPE=InnoDB;
Lo qué???
CREATE TABLE empresa (
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;
Si acá van las Empresas que tienen un id en la tabla Publicidad, esta
tabla debe llamarse "Empresas", en plurarl.
CREATE TABLE foto (
idfoto INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
foto1 VARCHAR(100) NULL,
foto2 VARCHAR(100) NULL,
foto3 VARCHAR(100) NULL,
foto4 VARCHAR(100) NULL,
foto5 VARCHAR(100) NULL,
foto6 VARCHAR(100) NULL,
foto7 VARCHAR(100) NULL,
foto8 VARCHAR(100) NULL,
info TEXT NULL,
PRIMARY KEY(idfoto)
)
TYPE=InnoDB;
Mal! Horrible!
Esto debe ser una simple relación uno-a-muchos.
Además es como si una misma foto, referenciada por el idfoto, pudiera
tener varias fotos!
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;
Muy bueno lo de la integridad referencial.
La escribiste a mano o estás usando algún generador visual? Contame
cuál!
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...
CREATE TABLE publicidad (
idpublicidad INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
rubro_idrubro INTEGER UNSIGNED NOT NULL,
empresa_idempresa INT NOT NULL,
nombre VARCHAR(100) NULL,
largo SMALLINT UNSIGNED NULL,
ancho SMALLINT UNSIGNED NULL,
tipo ENUM('jpg','swf','gif','png') NULL,
ruta VARCHAR(100) NULL,
ruta_imagen VARCHAR(100) NULL,
ubicacion VARCHAR(30) NULL,
costo SMALLINT UNSIGNED NULL,
impresiones INTEGER UNSIGNED NULL,
clics INTEGER UNSIGNED NULL,
PRIMARY KEY(idpublicidad, rubro_idrubro, empresa_idempresa),
INDEX publicidad_FKIndex1(rubro_idrubro),
INDEX publicidad_FKIndex2(empresa_idempresa),
FOREIGN KEY(rubro_idrubro)
REFERENCES rubro(idrubro)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY(empresa_idempresa)
REFERENCES empresa(idempresa)
ON DELETE CASCADE
ON UPDATE CASCADE
)
TYPE=InnoDB;
Las campos ENUM no sirven para listas que pueden extenderse como este
caso, en el que te puede interesar soportar otros formatos a futuro como
SVG o Java... además es una tablita fácil ;-)
Qué son las dos "rutas" que tiene?
CREATE TABLE aviso (
idaviso INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
usuario_idusuario INTEGER UNSIGNED NOT NULL,
rubro_idrubro INTEGER UNSIGNED NOT NULL,
localidad_idlocalidad INTEGER UNSIGNED NOT NULL,
foto_idfoto INTEGER UNSIGNED NOT NULL,
titulo VARCHAR(50) NOT NULL,
detalle VARCHAR(250) NOT NULL,
estado ENUM('nuevo','usado','noaplica') NULL,
moneda ENUM('pesos','dolares') NULL,
precio VARCHAR(5) NULL,
centavos VARCHAR(2) NULL,
stock INTEGER UNSIGNED NULL,
alta DATE NULL,
baja DATE NULL,
visitas INTEGER UNSIGNED NULL DEFAULT 0,
habilitado BOOL NULL,
masinfo BOOL NULL,
destacados INTEGER UNSIGNED ZEROFILL NULL DEFAULT 000,
prioridad SMALLINT UNSIGNED NULL,
PRIMARY KEY(idaviso, usuario_idusuario, rubro_idrubro,
localidad_idlocalidad, foto_idfoto),
INDEX aviso_FKIndex1(usuario_idusuario),
INDEX aviso_FKIndex2(rubro_idrubro),
INDEX aviso_FKIndex3(localidad_idlocalidad),
INDEX aviso_FKIndex4(foto_idfoto),
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(localidad_idlocalidad)
REFERENCES localidad(idlocalidad)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(foto_idfoto)
REFERENCES foto(idfoto)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
El campo "localidad" en esta tabla no me suena del todo... a qué
localidad vas a referenciar?
foto_idfoto no va acá por la relación uno-a-muchos que tenés.
"estado" y "moneda" también son tablas aparte. Normalizando se evita
tener que modificar la estructura de las tablas!
"precio" y "centavos" no debería ser varchar, pero "centavos" sobra y
te saca hasta de 1FN!!! Un flotante es lo correcto para esto.
"stock" y "visitas" no son cosas que figuren en tu SRS. las vas a
agregar?
Qué es "masinfo" ?
Tampoco indica tu SRS que haya que priorizar los avisos. ESte sistema
es más grande que el especificaste...
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?
> Saludos, Ezequiel.-
=mente!
--
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