Práctica 1 - Apartado 5

De FdIwiki ABD
Saltar a: navegación, buscar

APARTADO 5: Analiza la calidad de tu Base de Datos (OPCIONAL) Para cada tabla determina: (antes, necesitas definir qué claves Primarias y Ajenas tiene)

CREATE TABLE Autor( Id CHAR(50) not null, Apellidos CHAR(50) not null, Nombre CHAR(50) not null, SegundoNombre CHAR(50), PRIMARY KEY (Id) );

CREATE TABLE Libro ( ISBN CHAR (50) not null, Titulo CHAR (50) not null, AñoDePublicacion INTEGER not null, Editorial CHAR(50) not null, PRIMARY KEY (ISBN) );

CREATE TABLE EsAutorDe( Autor CHAR (50) not null, Libro CHAR(50) not null, PosicionEnPortada INTEGER not null, PRIMARY KEY (Autor, Libro), FOREIGN KEY (Autor) REFERENCES Autor(Id), FOREIGN KEY (Libro) REFERENCES Libro(ISBN) );


CREATE TABLE Materias( Libro CHAR(50) not null, Nombre CHAR(50) not null, PRIMARY KEY(Libro, Nombre), FOREIGN KEY (Libro) REFERENCES Libro(ISBN) );

CREATE TABLE Copia( Libro CHAR(50) not null, NumeroDeCopia INTEGER not null, Disponible CHAR(1) not null, CHECK(Disponible IN ('S','N')), PRIMARY KEY(Libro, NumeroDeCopia), FOREIGN KEY (Libro) REFERENCES Libro(ISBN) );

CREATE TABLE Ubicacion( NumeroDeCentro INTEGER not null, Telefono varchar(12) unique, Direccion_Calle CHAR(50) not null, Direccion_Numero INTEGER not null, PRIMARY KEY(NumeroDeCentro) );

CREATE TABLE Signatura( Ubicacion INTEGER not null, Copia INTEGER not null, Libro CHAR(50) not null, CodigoDeLocalizacion CHAR (20) not null, PRIMARY KEY(Libro, Copia), FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro), FOREIGN KEY (Libro) REFERENCES Libro(ISBN), FOREIGN KEY (Copia) REFERENCES Copia(NumeroDeCopia) );

CREATE TABLE Usuario ( DNI CHAR(9) not null, Nombre CHAR(50) not null, Apellidos CHAR(50) not null, PRIMARY KEY(DNI) );

CREATE TABLE Bibliotecario( DNI CHAR(9) not null, NumeroDePersonal INTEGER UNIQUE not null, Ubicacion INTEGER not null, PRIMARY KEY(DNI), FOREIGN KEY (DNI) REFERENCES Usuario(DNI), FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro) ); CREATE TABLE Estudiante( DNI CHAR(9) not null, CodigoDeExpediente CHAR(50) UNIQUE not null, PRIMARY KEY(DNI), FOREIGN KEY (DNI) REFERENCES Usuario(DNI) );

CREATE TABLE Profesores( Ubicacion INTEGER not null, DNI char(9) not null, Direccion_Calle char(50) not null, Direccion_Numero Integer not null, Telefono varchar(12) not null, PRIMARY KEY(DNI, Ubicacion), FOREIGN KEY (DNI) REFERENCES Usuario(DNI), FOREIGN KEY (Ubicacion) REFERENCES Ubicacion(NumeroDeCentro)

);


CREATE TABLE Multa( DNI CHAR(9) not null, FechaDeMulta TIMESTAMP not null, DiasDeSancion INTEGER not null, PRIMARY KEY(DNI, FechaDeMulta), FOREIGN KEY (DNI) REFERENCES Usuario(DNI) );


CREATE TABLE Prestamo( Libro CHAR(50) not null, Copia INTEGER not null, FechaInicial TIMESTAMP not null, FechaMaxima TIMESTAMP not null, FechaDevolucion TIMESTAMP, Usuario CHAR (9) not null, UsuarioMultado CHAR (9) null, FechaDeMulta TIMESTAMP 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), FOREIGN KEY (UsuarioMultado) REFERENCES Multa(DNI), FOREIGN KEY (FechaDeMulta) REFERENCES Multa(FechaDeMulta) );

5.1 En qué FN está?

Autor: 3º FN. Es una calidad aceptable. ID -> (Apellidos, Nombre, SegundoNombre). Libro: 3º FN. Es una calidad aceptable. (ISBN) -> (Titulo, APublicacion, Editorial). AutorDe: 3º FN. Es una calidad aceptable. (Autor, Libro) -> PosEnPortada. Materias:3º FN. Es una calidad aceptable. Copias: 3º FN. Es una calidad aceptable. (Libro, NCopias) -> Disponible. Ubicación: 3º FN. Es una calidad aceptable. NCentro -> (Teléfono, DCalle, DNumero). Signature: 3º FN. Es una calidad aceptable. (Ubicación, Copia, Libro) -> CodigoLocalización. Usuario: 3º FN. Es una calidad aceptable. DNI -> (Nombre, Apellidos). Bibliotecario: 3º FN. Es una calidad aceptable. DNI -> (NPersonal, Ubicacion). Profesor: 1º FN. DNI - > (DCalle, DNumero, Telefono) Multa: 3º FN. Es una calidad aceptable. (DNI, FMulta) - > Sanción. Prestamo: 2º FN. (Libro, Copia, FInicial, Usuario)-> (FMaxima, FDevolucion) (FechaMaxima, FechaDevolucion) -> FechaMulta. (Usuario, FechaMulta) -> UsuarioMultado.

5.2 Es una calidad aceptable?

No es una calidad aceptable. Lo mínimo para suponer un buen rendimiento de la base de datos es una 3º FN.

5.3 Si no lo es: Vas a descomponer la tabla para que quede en una calidad adecuada.

CREATE TABLE PrestUsuario( 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) );

Para solucionar esta DF (Usuario, FechaMulta) -> UsuarioMultado. No merece la pena crear una tabla para añadir datos del Usuario fuera de la tabla Usuario. Por ello es mejor añadir campo Multado(bool) y Días de Multa a la tabla Usuario para cada usuario.

Para solucionar esta DF (FechaMaxima, FechaDevolucion) -> FechaMulta. Eliminamos el campo FechaMulta ya que es redundante tener un campo que contiene el resultado de una operación aritmética simple entre otras dos.

Con esta DF DNI - > (DCalle, DNumero, Telefono), tenemos el problema de que hay un campo que no depende de la clave primaria : Ubicación. Un profesor puede tener varias ubicaciones y en una ubicación puede haber varios profesores. Por ello vamos a normaliza la tabla creando dos tablas.

Se quedarían así :


CREATE TABLE ProfPersonal( 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 ProfUbicacion( 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) );