Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/09/2010, 12:16
Bliztz
 
Fecha de Ingreso: agosto-2009
Mensajes: 15
Antigüedad: 15 años, 3 meses
Puntos: 0
Relacion ternaria -> base de datos

Buenas,

Tengo una duda acerca de como pasar de una relacion ternaria (en el modelo ER) a un conjunto de tablas. Haber Yo tengo 3 entidades:

Turno (idturno,dia,inicio,fin)
Usuario (idusuario,usuario,contrasena)
Red (idred)

La relación es que un usuario puede reservar una red durante un turno con la restricción de que solo puede realizar una unica reserva. Entonces yo he hecho lo siguiente:

Código SQL:
Ver original
  1. CREATE TABLE usuario
  2. (
  3. idusuario   tinyint UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
  4. usuario     VARCHAR(10) NOT NULL UNIQUE,
  5. contrasena  VARCHAR(10) NOT NULL,
  6. administrador   BOOLEAN NOT NULL DEFAULT 0,
  7.  
  8. PRIMARY KEY (idusuario),
  9. UNIQUE INDEX (usuario,contrasena)
  10. )ENGINE=InnoDB;
  11.  
  12. CREATE TABLE turno
  13. (
  14. idturno     tinyint UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
  15. dia     tinyint UNSIGNED NOT NULL,
  16. inicio      TIME NOT NULL,
  17. fin         TIME NOT NULL,
  18.  
  19. PRIMARY KEY (idturno),
  20. UNIQUE INDEX (dia,inicio)
  21. )ENGINE=InnoDB;
  22.  
  23. CREATE TABLE red
  24. (
  25. idred       tinyint UNSIGNED NOT NULL UNIQUE,
  26.  
  27. PRIMARY KEY (idred)
  28. )ENGINE=InnoDB;
  29. INSERT INTO red VALUES (1),(2),(3);
  30.  
  31. CREATE TABLE reserva
  32. (
  33. idusuario   tinyint UNSIGNED NOT NULL UNIQUE,
  34. idturno     tinyint UNSIGNED NOT NULL,
  35. idred       tinyint UNSIGNED NOT NULL,
  36.  
  37.  
  38. PRIMARY KEY (idusuario),
  39. FOREIGN KEY (idusuario) REFERENCES usuario (idusuario) ON DELETE CASCADE ON UPDATE CASCADE,
  40. FOREIGN KEY (idred) REFERENCES red (idred) ON DELETE CASCADE ON UPDATE CASCADE,
  41. FOREIGN KEY (idturno) REFERENCES turno (idturno) ON DELETE CASCADE ON UPDATE CASCADE
  42. )ENGINE=InnoDB;


Mis dudas son:
-¿Es la forma correcta de hacerlo?
-¿Estaria en 3FN?
-La entidad de red no tiene mas atributos que el propio identificador ¿esta mál crear una tabla para ella? (No se me ocurre otra forma de hacerlo)
-De esta forma la primary key coincide con la foreign key: ¿Hay que definir ambas ose puede especificar la referencia en la primary key? (MySQL tiende a crearme indices con todo y acabo teniendolos repetidos)

Y ya que estoy aprovecho y pregunto una cosilla mas por si alguien sabe respondermelas:
-¿Con que cardinalidad se representaria cada una de las entidades en el diagrama ER? (Yo tengo puesto: turno-1, red-1, usuario-n)


Gracias de antemno ^^