Practica1-PosibleSolución

De FdIwiki ABD
Saltar a: navegación, buscar

Posible solución para el apartado 5 (opcional) de la práctica 1.


APARTADO 5

Definimos las claves primarias y ajenas de todas las tablas:

Autor:

  • - PRIMARY KEY (Id)

Libro:

  • - PRIMARY KEY (ISBN)

EsAutorDe:

  • - PRIMARY KEY (Autor, Libro)
  • - FOREIGN KEY (Autor) REFERENCES Autor(Id)
  • - FOREIGN KEY (Libro) REFERENCES Libro(ISBN)

Materias:

  • - PRIMARY KEY(Libro, Nombre)
  • - FOREIGN KEY (Libro) REFERENCES Libro(ISBN)

Copia:

  • - PRIMARY KEY(Libro, NumeroDeCopia)
  • - FOREIGN KEY (Libro) REFERENCES Libro(ISBN)

Ubicacion:

  • - PRIMARY KEY(NumeroDeCentro)

Signatura:

  • - PRIMARY KEY(Libro, Copia, Ubicacion)
  • - FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro)
  • - FOREIGN KEY (Libro) REFERENCES Libro(ISBN)
  • - FOREIGN KEY (Copia) REFERENCES Copia(NumeroDeCopia)

Usuario:

  • - PRIMARY KEY(DNI)

Bibliotecario:

  • - PRIMARY KEY(DNI)
  • - FOREIGN KEY (DNI) REFERENCES Usuario(DNI)
  • - FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro)

Estudiante:

  • - PRIMARY KEY(DNI)
  • - FOREIGN KEY (DNI) REFERENCES Usuario(DNI)

Profesores:

  • - PRIMARY KEY(DNI)
  • - FOREIGN KEY (DNI) REFERENCES Usuario(DNI)
  • - FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro)

Multa:

  • - PRIMARY KEY(DNI, FechaDeMulta)
  • - FOREIGN KEY (DNI) REFERENCES Usuario(DNI)

Prestamo:

  • - PRIMARY KEY(Usuario, Libro, Copia, FechaInicial)
  • - FOREIGN KEY (Libro) REFERENCES Libro(ISBN)
  • - FOREIGN KEY (Copia) REFERENCES Copia(NumeroDeCopia)
  • - FOREIGN KEY (Usuario) REFERENCES Usuario(DNI)
  • - FOREIGN KEY (UsuarioMultado) REFERENCES Multa(DNI)
  • - FOREIGN KEY (FechaDeMulta) REFERENCES Multa(FechaDeMulta)


5.1 - 5.2

- Autor: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- Libro: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- AutorDe: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- Materias: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- Copia: 1ºFN. No tiene una calidad aceptable.

- Ubicación: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- Signatura: 2ºFN. No tiene una calidad aceptable.

- Usuario: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- Bibliotecario: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN

- Profesores: 2ºFN. No tiene una calidad aceptable.

- Multa: 3ºFN. Tiene una calidad aceptable porque está en 3ºFN.

- Prestamo: 2ºFN. No tiene una calidad aceptable.

5.3

Copia:

La dividimos en dos tablas porque su atributo NumeroDeCopia es multivalor. Tendríamos entonces:

CREATE TABLE Copia (

  • Libro CHAR(50) not null,
  • Disponible CHAR(1) not null,
  • CHECK(Disponible IN ('S','N')),
  • PRIMARY KEY (Libro),
  • FOREIGN KEY (Libro) REFERENCES Libro (ISBN)

);

CREATE TABLE NumCopia(

  • Libro CHAR(50) not null,
  • NumeroDeCopia INTEGER not null,
  • PRIMARY KEY (Libro, NumeroDeCopia),
  • FOREIGN KEY (Libro) REFERENCES Libro (ISBN)

);

Signatura:

La dividimos en dos tablas, una con los atributos Ubicación y CodigoDeLocalizacion, cuya clave primaria sea Ubicación, y otra que sería la propia tabla Signatura, pero solo con los atributos Ubicación, Copia y Libro, cuya clave primaria sea Copia, Libro.

CREATE TABLE Signatura (

  • Ubicacion INTEGER not null,
  • Copia INTEGER not null,
  • Libro CHAR(50) not null,
  • PRIMARY KEY(Libro, Copia),
  • FOREIGN KEY (Ubicacion) REFERENCES Ubicación (NumeroDeCentro),
  • FOREIGN KEY (Libro) REFERENCES Libro (ISBN),
  • FOREIGN KEY (Copia) REFERENCES Copia(NumeroDeCopia)

);

CREATE TABLE SignaturaCodigo (

  • Ubicacion INTEGER not null,
  • CodigoDeLocalizacion CHAR (20) not null,
  • PRIMARY KEY (Ubicacion),
  • FOREIGN KEY (Ubicacion) REFERENCES Ubicación (NumeroDeCentro)

);

Profesores:

Consideramos que un profesor puede además trabajar en otra Ubicación, es decir, que puede impartir clase en dos lugares distintos. Por lo tanto estamos en la 2ºFN y necesitamos dividir la tabla en dos:

CREATE TABLE Profesores (

  • DNI char(9) not null,
  • Direccion_Calle char(50) not null,
  • Direccion_Numero Integer not null,
  • Telefono varchar(12) not null,
  • PRIMARY KEY(DNI),
  • FOREIGN KEY (DNI) REFERENCES Usuario(DNI)

);

CREATE TABLE UbicacionProfesores(

  • Ubicacion INTEGER not null,
  • DNI char(9) not null,
  • PRIMARY KEY(DNI, Ubicacion),
  • FOREIGN KEY (DNI) REFERENCES Usuario(DNI),
  • FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro)

);

Prestamo:

En la tabla préstamo tenemos una multitud de DF que nos hacen ver que está en 2ºFN. Debemos por ello dividirla en tres tablas para cumplir las tres DF:

CREATE TABLE Usuario (

  • Libro CHAR(50) not null,
  • Copia INTEGER not null,
  • FechaInicial TIMESTAMP not null,
  • FechaMaxima TIMESTAMP not null,
  • FechaDevolucion TIMESTAMP,
  • Usuario CHAR (9) not null,
  • PRIMARY KEY(Usuario, Libro, Copia, FechaInicial),
  • FOREIGN KEY (Libro) REFERENCES Libro(ISBN),
  • FOREIGN KEY (Copia) REFERENCES Copia(NumeroDeCopia),
  • FOREIGN KEY (Usuario) REFERENCES Usuario(DNI)

);

CREATE TABLE MultasUsuarios (

  • Usuario CHAR (9) not null,
  • UsuarioMultado CHAR (9) null,
  • FechaDeMulta TIMESTAMP null,
  • PRIMARY KEY(Usuario),
  • FOREIGN KEY (Usuario) REFERENCES Usuario(DNI),
  • FOREIGN KEY (UsuarioMultado) REFERENCES Multa (DNI),
  • FOREIGN KEY (FechaDeMulta) REFERENCES Multa (FechaDeMulta)

);

CREATE TABLE Devoluciones(

  • FechaMaxima TIMESTAMP not null,
  • FechaDevolucion TIMESTAMP,
  • FechaDeMulta TIMESTAMP null,
  • PRIMARY KEY (FechaMaxima, FechaDevolucion),
  • FOREIGN KEY (FechaDeMulta) REFERENCES Multa (FechaDeMulta)

);

--David Caballero (discusión) 18:22 17 mar 2015 (CET)