Ver Mensaje Individual
  #12 (permalink)  
Antiguo 29/01/2013, 18:50
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: 17 años
Puntos: 2658
Respuesta: No consigo compilar esta base de datos

Bueno, después de una revisión exhaustiva, y gracias al corrector sintáctico del MySQL Workbench, junto con su log de ejecuciones, pude depurar al menos en general el script creado por tu aplicación, que lamento decirlo, es pura basura.

Hay varios y múltiples errores de construcción en el script y otros varios más a nivel conceptual de BBDD, que te deallo acá:

1) Había una coma menos en una tabla, lo que sin duda generaba un error sintáctico.

2) Los DROP TABLE IF EXISTS al inicio estaban todos en orden incorrecto. Cuando tienes tablas con FK el orden de borrado es exactamente el inverso al de creación, para evitar errores por dependencias de FK (se debe eliminar la tabla dependiente primero).

3) Había una incorrecta definición de las FK. Una FK es un campo o conjunto de campos que referencia a la clave primaria de otra tabla. En tu caso estabas creando FK que apuntaban a campos no PK.

4) Por extensión, MySQL permite crear FK hacia campos no PK siempre y cuando los campos referidos sean UNIQUE en su tabla, con lo que se transformarían en claves candidatas (CC), cumpliendo con la unicidad de valor. Pero los campos apuntados ni siquiera eran UNIQUE.

5) Existían dependencias circulares, que son de construcción y cumplimiento imposible. Eso es un defecto de diseño grave, que hace que una tabla A tenga la FK de la tabla B y la tabla B la FK de la tabla A. Eso es un error gravísimo de diseño.

6) Había tablas que contenían FKs innecesarias, lo que sugiere que las relaciones están mal definidas, por una definición defectuosa de Entidades y Relaciones a nivel lógico.

7) Existe evidencia de posibles relaciones N:N que requerirían tablas adicionales (exigencia del modelo E-R), y no están, por lo cual se les ha implementado soluciones incorrectas.

Depurando todo, y eliminando algunas cosa de de ciertas tablas (sólo las FK indebidas) quedaría mas o menos así:
Código MySQL:
Ver original
  1. CREATE DATABASE IF NOT EXISTS hotel;
  2. USE hotel;
  3.  
  4. DROP TABLE IF EXISTS es_incluido;
  5.  
  6. DROP TABLE IF EXISTS proveedor;
  7. DROP TABLE IF EXISTS factura_proveedor;
  8. DROP TABLE IF EXISTS servicio;
  9.  
  10. DROP TABLE IF EXISTS factura;
  11. DROP TABLE IF EXISTS formadepago;
  12. DROP TABLE IF EXISTS habitacion;
  13. DROP TABLE IF EXISTS cliente;
  14. DROP TABLE IF EXISTS empleado;
  15.  
  16.  
  17. CREATE TABLE formadepago (
  18. Id INT(10) NOT NULL,
  19. Interes FLOAT(3,2) UNIQUE,
  20.     CONSTRAINT PK_formadepago PRIMARY KEY (Id) ) ENGINE=INNODB;
  21.    
  22. CREATE TABLE cliente (
  23. DNI CHAR(9) NOT NULL,
  24. Nombre CHAR(50),
  25. Apellidos CHAR(50),
  26. Domicilio CHAR(50),
  27. Telefono INT(9),
  28. Anterioridad ENUM ('Si','No'),
  29.     CONSTRAINT PK_cliente PRIMARY KEY (DNI) ) ENGINE=INNODB;
  30.    
  31. CREATE TABLE precio (
  32. Tipo ENUM ('Individual','Doble') NOT NULL,
  33. CONSTRAINT PK_precio PRIMARY KEY (Tipo) ) ENGINE=INNODB;
  34.  
  35. CREATE TABLE habitacion (
  36. Numero INT(3) NOT NULL,
  37. Superficie INT(3),
  38. Bar ENUM ('Si','No'),
  39. Terraza ENUM ('Si','No'),
  40. Banio ENUM ('Si','No'),
  41. TV ENUM ('Si','No'),
  42. N_camas INT(1),
  43. Fecha_reserva DATE,
  44. /*Estancia*/
  45. Fecha_salida DATE,
  46. Estado ENUM ('Libre','Ocupada') NOT NULL,
  47. Tipo ENUM ('Individual','Doble') NOT NULL,
  48. DNI CHAR(9) NOT NULL,
  49.     CONSTRAINT FK_habitacion_precio FOREIGN KEY (Tipo) REFERENCES precio(Tipo),
  50.     CONSTRAINT FK_habitacion_cliente FOREIGN KEY (DNI) REFERENCES cliente(DNI),
  51.     CONSTRAINT PK_habitacion PRIMARY KEY (Numero) ) ENGINE=INNODB;
  52.  
  53. CREATE TABLE factura (
  54. Codigo_f INT(5) NOT NULL,
  55. Fecha_entrada DATE,
  56. Fecha_salida DATE,
  57. Importe_total FLOAT(6,2),
  58. Supletoria ENUM ('Si','No'),
  59. Id INT(10) NOT NULL,
  60. DNI CHAR(9) NOT NULL,
  61. Numero INT(3) NOT NULL,
  62.     CONSTRAINT PK_factura PRIMARY KEY (Codigo_f),
  63.     CONSTRAINT FK_factura_formadepago FOREIGN KEY (Id) REFERENCES formadepago(Id) ON DELETE CASCADE ON UPDATE CASCADE,
  64.     CONSTRAINT FK_factura_cliente FOREIGN KEY (DNI) REFERENCES cliente(DNI) ON DELETE CASCADE ON UPDATE CASCADE,
  65.         CONSTRAINT FK_factura_hab FOREIGN KEY (Numero) REFERENCES habitacion(Numero) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=INNODB;
  66.  
  67.  CREATE TABLE empleado (
  68. N_registro INT(3) NOT NULL,
  69. Nombre CHAR(50),
  70. Fecha_incorporacion DATE,
  71. Sueldo FLOAT (6,2),
  72. NIF CHAR(9) NOT NULL,
  73. Codigo_s INT(5) NOT NULL,  
  74.     CONSTRAINT PK_empleado PRIMARY KEY (N_registro) ) ENGINE=INNODB;
  75.    
  76. CREATE TABLE proveedor (
  77. NIF CHAR(9) NOT NULL,
  78. Nombre_comercial CHAR(50) UNIQUE,
  79. Direccion CHAR(50),
  80. N_registro INT(3) NOT NULL,
  81. Codigo_fp INT(5) NOT NULL,
  82.     CONSTRAINT PK_proveedor PRIMARY KEY (N_registro),
  83.     CONSTRAINT FK_proveedor_empleado FOREIGN KEY (N_registro) REFERENCES empleado(N_registro)) ENGINE=INNODB;
  84.  
  85. CREATE TABLE factura_proveedor (
  86. Codigo_fp INT(5) NOT NULL,
  87. Fecha DATE,
  88. Importe FLOAT(6,2),
  89. Encargado CHAR(50),
  90. NIF CHAR(9) NOT NULL,
  91.     CONSTRAINT PK_factura_proveedor PRIMARY KEY (Codigo_fp) ) ENGINE=INNODB;
  92.  
  93. CREATE TABLE servicio (
  94. Codigo_s VARCHAR(9),
  95. Descripcion CHAR(50) UNIQUE,
  96. Fecha DATE,
  97. Coste FLOAT(5,2),
  98. N_registro INT(3) NOT NULL,
  99. CONSTRAINT PK_servicio PRIMARY KEY (Codigo_s),
  100. CONSTRAINT FK_servicio_empleado FOREIGN KEY (N_registro) REFERENCES empleado(N_registro) ) ENGINE=INNODB;
  101.  
  102.  
  103. CREATE TABLE limpia (
  104. Fecha DATE,
  105. Numero INT(3) NOT NULL,
  106. N_registro INT(3) NOT NULL,
  107.     CONSTRAINT PK_limpia PRIMARY KEY (Fecha),
  108.     CONSTRAINT FK_limpia_habitacion FOREIGN KEY (Numero) REFERENCES habitacion(Numero),
  109.     CONSTRAINT FK_limpia_empleados FOREIGN KEY (N_registro) REFERENCES empleado(N_registro) ) ENGINE=INNODB;
  110.    
  111. CREATE TABLE usa_a (
  112. Fecha DATE NOT NULL,
  113. Codigo_s INT(5),
  114. Codigo_s_usado INT(5),
  115.     CONSTRAINT PK_usa_a PRIMARY KEY (Fecha) ) ENGINE=INNODB;
  116.    
  117. CREATE TABLE es_incluido (
  118. Codigo_f INT(5) NOT NULL,
  119. Codigo_s INT(5) NOT NULL,
  120. PRIMARY KEY(Codigo_f,Codigo_s)) ENGINE=INNODB;

Como te digo, esta no es la solución. Aún no hice que se reconstruyera el diagrama para analizar mejor el diseño global, pero ese script no producirá errores.

Luego de que lo revise todo, te comento el resto.

Saludos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)