Ver Mensaje Individual
  #10 (permalink)  
Antiguo 27/11/2009, 09:31
alx_salazar
 
Fecha de Ingreso: septiembre-2008
Mensajes: 192
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: aUXILIO!!!! Ayuda muy importante n se que le pasa a java con mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.


hola nuevamente ahora si que me confundi!!!!!! ahh gracia spor lo de las date nno me habia dado cuenta
mira lo que quiero hacer es lo siguiente

necesito

tengo la tabla

-usuario: cod_usuario, nombre,apellido,direccion.
-libro:cod_libro,nombre,tema,descripcion,"este debe tener el autor y el editor"
-editorial: cod_editorial, nombre, dirección, etc.
-presta_libro:

ahora debo crear la tabla autor/libro y en este caso el editorial donde se queda ya que un editorial puede tener varios libros seria n:n

estoy que no se como.
puedes porfavor darme un explicacion mas detallada.