Ver Mensaje Individual
  #9 (permalink)  
Antiguo 27/11/2009, 05:07
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Código sql:
Ver original
  1. CREATE TABLE `libro` (
  2. `cod_libro` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nom_libro` VARCHAR(100) NOT NULL,
  4. `tema_libro` VARCHAR(100) NOT NULL,
  5. `desc_libro` VARCHAR(400) DEFAULT NULL,
  6. `año_libro` SMALLINT UNSIGNED DEFAULT NULL,
  7. `num_libro` VARCHAR(4) NOT NULL,
  8. `cod_autor` INT(10) UNSIGNED NOT NULL,
  9. `cod_editorial` INT(10) UNSIGNED NOT NULL,
  10. PRIMARY KEY (`cod_libro`),
  11. KEY `FK_cod_autor` (`cod_autor`),
  12. KEY `FK_cod_editorial` (`cod_editorial`),
  13. CONSTRAINT `FK_cod_autor` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_editorial` FOREIGN KEY (`cod_editorial`) REFERENCES `editorial` (`cod_editorial`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En términos generales, la tabla esta bien definida. El problema está en el modelado lógico: No puedes establecer una relación de tipo N:1 entre Libro y Autor, porque un libro puede tener uno o más de un autor, y cada autor puede tener a su vez uno o más libros. Es una relación N:N, con lo que se debe crear una tabla que la regule y que contenga ambas claves, digamos LIBRO_AUTOR.

Una nota que te puedo hacer es que hay muchos campos con los tipos mal definidos, como por ejemplo, las fechas.
Las fechas las estás definiendo como VARCHAR(20), lo cual no sólo es un desperdicio de espacio, sino que además te dará problemas a la hora de las búsquedas por año, meses o días, ya que tendrás que usar funciones de conversión entre caracteres y fecha. Esto no hace más que impactar sobre la performance, por más que no se note con tablas de pocos registros.
Veamos el caso:
Código sql:
Ver original
  1. --
  2. -- Definition of table `presta_libro`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `presta_libro`;
  6. CREATE TABLE `presta_libro` (
  7. `fecha_presta` VARCHAR(20) NOT NULL,
  8. `fecha_devo` VARCHAR(20) DEFAULT NULL,
  9. `cod_libro` INT(10) UNSIGNED NOT NULL,
  10. `ci_usuario` INT(10) UNSIGNED NOT NULL,
  11. KEY `FK_cod_libro` (`cod_libro`),
  12. KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
  13. CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

En este caso ambas fechas deberían ser Datetime, sobre todo si la devoluvión de los libros tiene una hora de cierre antes de su penalización.
Podría quedar:
Código sql:
Ver original
  1. --
  2. -- Definition of table `presta_libro`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `presta_libro`;
  6. CREATE TABLE `presta_libro` (
  7. `fecha_presta` DATETIME NOT NULL,
  8. `fecha_devo` DATETIME DEFAULT NULL,
  9. `cod_libro` INT(10) UNSIGNED NOT NULL,
  10. `ci_usuario` INT(10) UNSIGNED NOT NULL,
  11. KEY `FK_cod_libro` (`cod_libro`),
  12. KEY `FK_cod_usuario` USING BTREE (`ci_usuario`),
  13. CONSTRAINT `FK_ci_usuario` FOREIGN KEY (`ci_usuario`) REFERENCES `usuario` (`ci_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  14. CONSTRAINT `FK_cod_libro` FOREIGN KEY (`cod_libro`) REFERENCES `libro` (`cod_libro`) ON DELETE CASCADE ON UPDATE CASCADE
  15. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
En esta tabla, además, está faltando la PK, que bien podría ser la fecha+codigo de usuario + código de libro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)