[Php-avanzado] tablas 1.3 de autoclas

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Jue Ago 27 20:45:28 ART 2009


Hola Carlos!

El jue, 27-08-2009 a las 16:25 -0300, Carlos Brandes escribió:
> Leonardo estoy absolutamente seguro que hace falta que te mande
> el .sql que te paso en este momento, miralo por favor y vemos. 

	Ok.

> Use el mysql-workbench, me gusto, baje el de la pagina oficial, pero
> no lo pude hacer funcionar (para usuarios guindows). Baje otro de por
> ahi que si funciono.

	Ahh... esas cosas de las herramientas que solucionan problemas y crean
otros...

> SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
> SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,
> FOREIGN_KEY_CHECKS=0;
> SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
> 
> CREATE SCHEMA IF NOT EXISTS `autoclas` DEFAULT CHARACTER SET latin1
> COLLATE latin1_swedish_ci ;
> USE `autoclas`;

	Ya que este coso define un esquema, hacé que el idioma sea español en
vez de sueco: COLLATE latin1_swedish_ci

	No estoy seguro de que un hosting permita que subas tu propio esquema,
así que si falla sacá esta parte sin miedo.

> -- -----------------------------------------------------
> -- Table `autoclas`.`provincias`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`provincias` (
>   `id_provincia` INT NOT NULL AUTO_INCREMENT ,
>   `provincia` VARCHAR(50) NOT NULL ,
>   PRIMARY KEY (`id_provincia`) )
> ENGINE = innoDB;
> 
> 
> -- -----------------------------------------------------
> -- Table `autoclas`.`ciudades`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`ciudades` (
>   `id_ciudad` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `provincias_id_provincia` INT UNSIGNED NOT NULL ,
>   `ciudad` VARCHAR(100) NOT NULL ,
>   PRIMARY KEY (`id_ciudad`) ,
>   INDEX provincias_id_provincia (`provincias_id_provincia` ASC) ,
>   CONSTRAINT `provincias_id_provincia`
>     FOREIGN KEY (`provincias_id_provincia` )
>     REFERENCES `autoclas`.`provincias` (`id_provincia` )
>     ON DELETE NO ACTION
>     ON UPDATE NO ACTION)
> ENGINE = InnoDB
> DELAY_KEY_WRITE = '1;
> 
> 
> -- -----------------------------------------------------
> -- Table `autoclas`.`anunciantes`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`anunciantes` (
>   `id_anunciante` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `usuario` VARCHAR(20) NOT NULL ,
>   `password` VARCHAR(20) NOT NULL ,
>   `nombre` VARCHAR(30) NOT NULL ,
>   `apellido` VARCHAR(30) NOT NULL ,
>   `email` VARCHAR(50) NOT NULL ,
>   `telefono` VARCHAR(40) NOT NULL ,
>   `id_ciudad` INT NULL ,
>   `ciudades_id_ciudad` INT UNSIGNED NOT NULL ,
>   PRIMARY KEY (`id_anunciante`, `ciudades_id_ciudad`) ,
>   UNIQUE INDEX usuario (`usuario` ASC, `password` ASC) ,
>   INDEX fk_anunciantes_ciudades (`ciudades_id_ciudad` ASC) ,
>   CONSTRAINT `fk_anunciantes_ciudades`
>     FOREIGN KEY (`ciudades_id_ciudad` )
>     REFERENCES `autoclas`.`ciudades` (`id_ciudad` )
>     ON DELETE NO ACTION
>     ON UPDATE NO ACTION)
> ENGINE = innoDB;

	Nombre y apellido son muy cortos.
	El email debería ser un poco más largo.
	Ojo! Tenés:

  `id_ciudad` INT NULL ,
  `ciudades_id_ciudad` INT UNSIGNED NOT NULL ,

	en donde supongo que el primero lo escribiste vos, y el segundo se
escribió al hacer la relación gráficamente. Deberías borrar el tuyo o
cambiar la definición para usarlo y borrar el segundo.

	El UNIQUE INDEX usuario (`usuario` ASC, `password` ASC) es una
redundancia. Si el usuario es único, naturalmente que la dupla usuario y
password será única...


> -- -----------------------------------------------------
> -- Table `autoclas`.`caracteristicas`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`caracteristicas` (
>   `id_caracteristica` INT(2) UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `caracteristica` ENUM('malo','regular','bueno','optimo') NOT NULL ,
>   PRIMARY KEY (`id_caracteristica`) )
> ENGINE = innoDB;

	No creo que tenga sentido usar ENUM para esto, porque si querés agregar
otra característica hay que modificar la tabla.
	Será una tabla con 4 registros que vos cargarás, pero esta limitación
no tiene sentido en algo que puede crecer.

> -- -----------------------------------------------------
> -- Table `autoclas`.`combustibles`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`combustibles` (
>   `id_combustible` INT(2) UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `cobustible` ENUM('diesel','gnc','nafta') NOT NULL ,
>   PRIMARY KEY (`id_combustible`) )
> ENGINE = innoDB;

	Idem anterior!

> -- -----------------------------------------------------
> -- Table `autoclas`.`condiciones`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`condiciones` (
>   `id_condicion` INT(2) NOT NULL ,
>   `condicion` ENUM('particular','agencia') NOT NULL ,
>   PRIMARY KEY (`id_condicion`) )
> ENGINE = innoDB;


	Idem anterior!

> -- -----------------------------------------------------
> -- Table `autoclas`.`monedas`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`monedas` (
>   `id_moneda` INT(2) UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `moneda` ENUM('pesos','dolares','euros') NOT NULL ,
>   PRIMARY KEY (`id_moneda`) )
> ENGINE = innoDB;

	Idem anterior!

> -- -----------------------------------------------------
> -- Table `autoclas`.`operaciones`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`operaciones` (
>   `id_operacion` INT(2) UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `operacion` ENUM('compra','venta','permuta') NOT NULL ,
>   PRIMARY KEY (`id_operacion`) )
> ENGINE = innoDB;

	Idem anterior!

> -- -----------------------------------------------------
> -- Table `autoclas`.`marcas`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`marcas` (
>   `id_marca` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `marca` VARCHAR(100) NOT NULL ,
>   PRIMARY KEY (`id_marca`) )
> ENGINE = innoDB;
> 
> 
> -- -----------------------------------------------------
> -- Table `autoclas`.`modelos`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`modelos` (
>   `id_modelo` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `marcas_id_marca` INT UNSIGNED NOT NULL ,
>   `modelo` VARCHAR(30) NOT NULL ,
>   PRIMARY KEY (`id_modelo`) ,
>   INDEX marcas_id_marca (`marcas_id_marca` ASC) ,
>   CONSTRAINT `marcas_id_marca`
>     FOREIGN KEY (`marcas_id_marca` )
>     REFERENCES `autoclas`.`marcas` (`id_marca` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE)
> ENGINE = innoDB;
> 
> 
> -- -----------------------------------------------------
> -- Table `autoclas`.`avisos`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`avisos` (
>   `id_aviso` INT UNSIGNED NOT NULL ,
>   `klilometros` VARCHAR(45) NULL ,
>   `precio` INT NULL ,
>   `fecha_publicacion` DATE NULL ,
>   `descripcion` VARCHAR(100) NULL ,
>   `monedas_id_moneda` INT(2) NULL ,
>   `anunciantes_id_anunciante` INT NULL ,
>   `operaciones_id_operacion` INT(2) NULL ,
>   `condiciones_id_condicion` INT(2) NULL ,
>   `modelos_id_modelo` INT NULL ,
>   `combustibles_id_combustible` INT(2) NULL ,
>   `caracteristicas_id_caracteristica` INT(2) NULL ,
>   PRIMARY KEY (`id_aviso`) ,
>   INDEX monedas_id_moneda (`monedas_id_moneda` ASC) ,
>   INDEX anunciantes_id_anunciante (`anunciantes_id_anunciante` ASC) ,
>   INDEX operaciones_id_operacion (`operaciones_id_operacion` ASC) ,
>   INDEX condiciones_id_condicion (`condiciones_id_condicion` ASC) ,
>   INDEX modelos_id_modelo (`modelos_id_modelo` ASC) ,
>   INDEX combustibles_id_combustibles (`combustibles_id_combustible`
> ASC) ,
>   INDEX caracteristicas_id_caracteristica
> (`caracteristicas_id_caracteristica` ASC) ,
>   CONSTRAINT `monedas_id_moneda`
>     FOREIGN KEY (`monedas_id_moneda` )
>     REFERENCES `autoclas`.`monedas` (`id_moneda` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE,
>   CONSTRAINT `anunciantes_id_anunciante`
>     FOREIGN KEY (`anunciantes_id_anunciante` )
>     REFERENCES `autoclas`.`anunciantes` (`id_anunciante` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE,
>   CONSTRAINT `operaciones_id_operacion`
>     FOREIGN KEY (`operaciones_id_operacion` )
>     REFERENCES `autoclas`.`operaciones` (`id_operacion` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE,
>   CONSTRAINT `condiciones_id_condicion`
>     FOREIGN KEY (`condiciones_id_condicion` )
>     REFERENCES `autoclas`.`condiciones` (`id_condicion` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE,
>   CONSTRAINT `modelos_id_modelo`
>     FOREIGN KEY (`modelos_id_modelo` )
>     REFERENCES `autoclas`.`modelos` (`id_modelo` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE,
>   CONSTRAINT `combustibles_id_combustibles`
>     FOREIGN KEY (`combustibles_id_combustible` )
>     REFERENCES `autoclas`.`combustibles` (`id_combustible` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE,
>   CONSTRAINT `caracteristicas_id_caracteristica`
>     FOREIGN KEY (`caracteristicas_id_caracteristica` )
>     REFERENCES `autoclas`.`caracteristicas` (`id_caracteristica` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE)
> ENGINE = InnoDB;

	los kilómetros varchar en vez de INT o FLOAT ????
	El precio INT en vez de FLOAT ??? (vale, nadie va a vender un auto con
centavos en el precio, pero los decimales se ven lindos y clarifican los
puntos de miles. Por otra parte, tu SRS dice que se peude extender a
otros rubros)

	Ojo con el borrado en cascada! Significa que si por ejemplo borrás una
moneda, todos los avisos en esa moneda se borrarán solos.
	Esto no está mal, ya que preservás la integridad, pero a veces hace
falta impedir borrar cosas si están en uso más que borrar todas las
relacionadas...

> -- -----------------------------------------------------
> -- Table `autoclas`.`imagenes`
> -- -----------------------------------------------------
> CREATE  TABLE IF NOT EXISTS `autoclas`.`imagenes` (
>   `id_imagen` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
>   `avisos_id_aviso` INT UNSIGNED NOT NULL ,
>   `path` VARCHAR(100) NOT NULL ,
>   PRIMARY KEY (`id_imagen`) ,
>   INDEX avisos_id_aviso (`avisos_id_aviso` ASC) ,
>   CONSTRAINT `avisos_id_aviso`
>     FOREIGN KEY (`avisos_id_aviso` )
>     REFERENCES `autoclas`.`avisos` (`id_aviso` )
>     ON DELETE CASCADE
>     ON UPDATE CASCADE)
> ENGINE = innoDB;

	Todo lo no comentado se ve bien.


> Con respecto a esto que te estoy pasando, tengo una pila de dudas, que
> creo que te voy a formular el dia sabado.

	Ok!

> PD: Estoy tratando de respetar lo escrito en la srs, pero le sacaria y
> le agregaria algunas cosas que hoy nop me parecen importantes.

	A priori no es problema para mi. Modificá la SRS (y mandame una copia
así la tengo) y modificá el sistema.
	Pero recordá también qu esta práctica llevada al extremo significa que
el sistema nunca se termina, y es bueno plantear etapas que terminen y
luego comenzar con otra más que dejar las cosas siempre a medias.

	Saludos!
-- 

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