Está en la página 1de 8

PRAÁ CTICA VOLUNTARIA DE DISENÑ O

DE BASES DE DATOS
ENUNCIADO: PREGUNTAS PARA EXÁMENES TIPO TEST
Un grupo de profesores que imparten asignaturas similares en distintas titulaciones se han dado
cuenta de que les sería útil compartir las preguntas de examen de tipo test que cada uno de ellos
ha ido ideando a lo largo de su actividad docente. Para ello, han decidido crear una base de datos
en la que cada profesor pueda incluir información de las asignaturas que él imparte, incluyendo el
temario de las mismas, así como las preguntas tipo test que se refieren a cada tema.

En concreto la información que se desea almacenar en la base de datos es la siguiente:

• Para cada profesor implicado: su DNI, nombre y área de conocimiento.

• Para cada asignatura: su código, que se considera único, su nombre y la titulación a la que
pertenece. Una asignatura puede ser impartida por varios profesores, que, a su vez, pueden
impartir varias asignaturas. Se debe conocer qué profesores imparten cada asignatura.

• Una asignatura consta de varios temas. Para cada tema se debe almacenar el número de orden
que ocupa en el temario, el título del tema y una breve descripción de su contenido. Se
considera que un tema es propio de una única asignatura.
• Una pregunta de test consta de un enunciado y de varias opciones (como mínimo dos opciones;
no se establece un máximo). Cada opción, a su vez, consta de: el número de orden que la
opción presentará en la pregunta, el texto de la opción y un campo que indica si la opción debe
estar marcada en una respuesta correcta o no.
Por ejemplo, considérese una pregunta con cinco opciones en la que la respuesta correcta consiste
en marcar tres de esas opciones; la información que se almacenará deberá contener:

¿Cuáles de los siguientes son elementos químicos? Enunciado


1. Hierro V
2. Acero F
3. Plata V Opciones
4. Aluminio V
5. Bronce F

• Una pregunta sirve para evaluar los conocimientos sobre uno o varios temas de una o de varias
asignaturas. Por ejemplo, la pregunta anterior puede servir para el tema 5 de la asignatura
“Química Básica” de la Licenciatura en Geología y para el tema 3 de la asignatura
“Fundamentos de Química” de la Ingeniería Técnica Industrial. Se debe poder consultar qué
preguntas hay recogidas para cada tema de cada asignatura.
Además, se quiere tener información sobre en qué exámenes se ha utilizado cada pregunta y con
qué resultados. Para ello se añadirá a la base de datos la siguiente información:

• Datos sobre los exámenes que se han creado a partir de las preguntas de la base de datos. Para
cada examen se deberá conocer la asignatura evaluada, y la convocatoria.
• Cada examen constará de varias preguntas extraídas de la base de datos y debemos poder
consultar qué preguntas se han utilizado en cada examen. También queremos saber, para cada
pregunta del examen cuántos alumnos la han contestado correctamente, cuantos lo han hecho
incorrectamente y cuántos no la han contestado.
A partir de estas especificaciones se pide:

1. Realizar el diseño conceptual (modelo E/R) de la Base de Datos correspondiente.


2. Realizar el diseño lógico relacional de la misma, indicando, para cada relación, todas sus
claves y cualquier otra restricción de integridad que sea necesaria.
3. Obtener, para cada relación, las dependencias funcionales que le correspondan.
4. Analizar, para cada relación, en qué forma normal se encuentra y justificarlo.
5. Si como consecuencia del análisis realizado en el punto 4 se considera necesario, realizar
las descomposiciones que se consideren convenientes.
6. Escribir un archivo de texto con extensión SQL que permita, como mínimo:
- crear las tablas implicadas teniendo en cuenta las restricciones de integridad adecuadas
- cargar un pequeño juego de datos de prueba inicial en dichas tablas.

SOLUCIÓN
Diseño conceptual (modelo E/R) de la Base de Datos correspondiente

Respecto a la elección de claves identificativas de las entidades en esta solución se ha considerado


lo siguiente:

• Para las entidades PROFESOR y ASIGNATURA se han elegiso como claves DNI y Código
respectivamente, ya que en ambos casos se garantiza que tienen valores únicos.
• Para la entidad PREGUNTA se ha añadido el atributo Código que deberá ser único y ese es
el que se elige como clave. El atributo Enunciado no es una clave válida por dos motivos:
o No se puede garantizar que tenga un valor único ya que puede haber muchas
preguntas con un mismo eneunciado, como por ejemplo “¿Cuál de las siguientes
afirmaciones es cierta?”
o Aunque todos los enunciados fuesen únicos, este deberá ser un campo
alfanúmerico de tamaño grande, lo que lo hace poco adecuado como clave que se
debe propagar a otras tablas.
• Las entidades TEMA, EXAMEN y OPCIÓN son entidades débiles por identificación:
o TEMA: El título o el Nº de Orden del tema no son claves válidas ya que en la base de
datos habrá muchos temas con el mismo Nº de Orden (por ejemplo, habrá un Tema
1 por cada asignatura) y podrá haber varios temas de asignaturas distintas que
tengan el mismo título. Por eso se ha elegido como clave de TEMA la concatenación
del Código de la Asignatura y el Nº de orden del tema. Por ello TEMA es entidad
débil por identificación dependiente de ASIGNATURA.
o EXAMEN: La convocatoria (entendida como curso académico más mes o bien como
curso más PRIMERA/SEGUNDA) no es una clave válida ya que, por ejemplo, habrá
muchos exámenes de PRIMERA convocatoria del curso 2014-15, uno por
asignatura. Considerando que en cada convocatoria solo puede haber un examen
de cada asignatura hemos optado por elegir como clave de EXAMEN la
concatenación de Código de Asignatura y Convocatoria por lo que EXAMEN es
también entidad débil por identificación dependiente de ASIGNATURA. En el caso
de que se quiera considerar que puede haber varios exámenes de una misma
asignatura en la misma convocatoria (por ejemplo, si admitimos que un grupo
puede tener un examen distinto al de otro grupo en la misma convocatoria de la
misma asignatura) la clave no podría se esta y tendríamos que añadir nuevos
atributos a examen, como, por ejemplo un Código único que lo identificase.
o OPCIÓN: Al igual que en TEMA, el Nº de Orden o el Texto no son claves adecuadas
porque no son únicas. Se ha optado por elegir como clave de OPCIÓN la
concatenación del Código de Pregunta y del Nº de Opción, por lo que OPCIÓN es
una entidad débil por identificación dependiente de PREGUNTA.

En los tres casos de entidades débiles, se puede optar como alternativa por añadir un
atributo identificativo que sea la clave (CódigoTema, CódigoExamen, CódigoOpción), en
cuyo caso la entidad correspondiente dejaría de ser débil y no se representaría en el
diagrama con el doble rectángulo.
Diseño lógico relacional de la Base de Datos
PROFESOR (DNI, Nombre, Area)

Clave primaria: DNI


ASIGNATURA (CODIGO, Nombre, Titulacion)

Clave primaria: CODIGO


Clave candidata: Nombre, Titulación (porque no puede haber dos asignaturas con el mismo
nombre en la misma titulación)
TEMA (CODASIGNAT, NºOrden, Titulo, Descripcion)

Clave primaria: CODASIGNAT, NºOrden


Clave candidata: CODASIGNAT, Título (porque no puede haber dos temas con el mismo
Título en la misma asignatura)
Clave externa: CODASIGNAT sobre ASIGNATURA
(NOTA) En el caso de que se hubiese optado por poner como clave primaria un atributo
CODIGOTEMA, se debería señalar como clave candidata CODASIGNAT+NºOrden. En este
caso, CODIGOTEMA sería la clave que se propagaría como clave externa a EVALUA.
PREGUNTA (CODIGO, Enunciado)

Clave primaria: CODIGO


OPCION (CODPREGUNTA, NºOrden, Texto, SeDebeMarcar)

Clave primaria: CODPREGUNTA, NºOrden


Clave candidata: CODPREGUNTA, Texto (porque no puede haber dos opciones con el mismo
texto en la misma pregunta)
Clave externa: CODPREGUNTA sobre PREGUNTA
Restricción: SeDebeMarcar solo puede tomar dos valores (SI/NO, V/F, Verdader/Falso, 0/1,
…)
(NOTA) En el caso de que se hubiese optado por poner como clave primaria un atributo
CODIGOOPCION, se debería señalar como clave candidata CODPREGUNTA+ NºOrden.
EXAMEN (CODASIGNAT, Convocatoria)

Clave primaria: CODASIGNAT, Convocatoria


Clave externa: CODASIGNAT sobre ASIGNATURA
Convocatoria deberá poder recoger un mes y un año o un curso y 1ª/2ª o algo así. También
pueden usar varias columnas para determinar la convocatoria.
(NOTA) En el caso de que se hubiese optado por poner como clave primaria un atributo
CODIGOEXAMEN, se debería señalar como clave candidata CODASIGNAT+ Convocatoria ( a
menos que se quisiera considerar que de la misma asignatura y en la misma convocatoria
puede haber varios exámenes). En este caso, CODIGOEXAMEN sería la clave que se
propagaría como clave externa a INCLUYE.
IMPARTE (DNI, CODASIGNAT)

Clave primaria: DNI, CODASIGNAT


Clave externa: DNI sobre PROFESOR
Clave externa: CODASIGNAT sobre ASIGNATURA
EVALUA (CODPREGUNTA, CODASIGNAT, NºOrdenTema)

Clave primaria: CODPREGUNTA, CODASIGNAT, NºOrdenTema


Clave externa: CODPREGUNTA sobre PREGUNTA
Clave externa: CODASIGNAT, NºOrdenTema sobre TEMA
INCLUYE (CODPREGUNTA, CODASIGNAT, Convocatoria, NºCorrectas, NºIncorrectas,
NºNoContestadas)

Clave primaria: CODPREGUNTA, CODASIGNAT, Convocatoria


Clave externa: CODPREGUNTA sobre PREGUNTA
Clave externa: CODASIGNAT, Convocatoria sobre EXAMEN

Obtener, para cada relación, las dependencias funcionales que le


correspondan.
PROFESOR (DNI, Nombre, Area)

DF1 = { DNI  Nombre, Area }


ASIGNATURA (CODIGO, Nombre, Titulacion)

DF2= { CODIGO  Nombre, Titulacion,


Nombre, Titulación  CODIGO }
TEMA (CODASIGNAT, NºOrden, Titulo, Descripcion)

DF3 = { CODASIGNAT, NºOrden  Titulo, Descripcion,


CODASIGNAT, Título  NºOrden }
PREGUNTA (CODIGO, Enunciado)

DF4 = { CODIGO  Enunciado,


OPCION (CODPREGUNTA, NºOrden, Texto, SeDebeMarcar)

DF5 = { COD PREGUNTA, NºOrden  Texto, SeDebeMarcar,


CODPREGUNTA, Texto  NºOrden }
EXAMEN (CODASIGNAT, Convocatoria)

DF6 = { Ø }
IMPARTE (DNI, CODASIGNAT)

DF7 = { Ø }
EVALUA (CODPREGUNTA, CODASIGNAT, NºOrdenTema)

DF8 = { Ø }
INCLUYE (CODPREGUNTA, CODASIGNAT, Convocatoria, NºCorrectas, NºIncorrectas,
NºNoContestadas)

DF9 = { CODPREGUNTA, CODASIGNAT, Convocatoria  NºCorrectas, NºIncorrectas,


NºNoContestadas }

NOTA

En el caso de que no se hubiesen considerado las entidades como débiles y se hubiesen incluidos
atributos identificativos para ellas, las dependencias funcionales quedarían de la siguiente manera:

TEMA (CODIGOTEMA, CODASIGNAT, NºOrden, Titulo, Descripcion)

DF3 = { CODIGOTEMA  CODASIGNAT, NºOrden, Titulo, Descripcion,


CODASIGNAT, NºOrden  CODIGOTEMA,
CODASIGNAT, Título  CODIGOTEMA }
EXAMEN (CODIGOEXAMEN, CODASIGNAT, Convocatoria)

DF6 = { CODIGOEXAMEN  CODASIGNAT, Convocatoria


CODASIGNAT, Convocatoria  CODIGOEXAMEN(**) }
(**) La segunda solo si no se admiten varios exámenes de la misma asignatura en la
misma convocatoria
OPCION (CODIGOOPCION, CODPREGUNTA, NºOrden, Texto, SeDebeMarcar)

DF5 = { CODIGOOPCION  COD PREGUNTA, NºOrden Texto, SeDebeMarcar,


COD PREGUNTA, NºOrden  CODIGOOPCION ,
CODPREGUNTA, Texto  CODIGOOPCION }

Analizar, para cada relación, en qué forma normal se encuentra y


justificarlo.
Todas están en FNBC porque para cada una de ellas, en todas las dependendencias funcionales el
antecedente es una superclave.
Sentencias SQL de creación de tablas

CREATE TABLE PROFESOR (


DNI VARCHAR(10) NOT NULL PRIMARY KEY,
Nombre VARCHAR(50) NOT NULL,
Area VARCHAR(50) NOT NULL
);

CREATE TABLE ASIGNATURA (


CODIGO INTEGER NOT NULL PRIMARY KEY,
Nombre VARCHAR(50) NOT NULL,
Titulacion VARCHAR(50) NOT NULL
);

CREATE TABLE TEMA (


CODASIGNAT INTEGER NOT NULL REFERENCES ASIGNATURA,
NumOrdenTema INTEGER NOT NULL,
Titulo VARCHAR(50) NOT NULL,
Descripcion VARCHAR(200),
PRIMARY KEY (CODASIGNAT, NumOrdenTema),
UNIQUE (CODASIGNAT, Titulo)
);

CREATE TABLE PREGUNTA (


CODPREGUNTA INTEGER NOT NULL PRIMARY KEY,
enunciado VARCHAR(200) NOT NULL,
);

CREATE TABLE OPCION (


CODPREGUNTA INTEGER NOT NULL REFERENCES PREGUNTA,
NumOrdenOpcion INTEGER NOT NULL,
Texto VARCHAR(50) NOT NULL,
SeDebeMarcar CHAR(1) NOT NULL CHECK (SeDebeMarcar='V' OR
SeDebeMarcar='F'),
PRIMARY KEY (CODPREGUNTA, NumOrdenOpcion),
UNIQUE (CODPREGUNTA, Texto)
);

CREATE TABLE EXAMEN(


CODASIGNAT INTEGER NOT NULL REFERENCES ASIGNATURA,
Convocatoria VARCHAR(20) NOT NULL,
PRIMARY KEY (CODASIGNAT, Convocatoria)
);

CREATE TABLE IMPARTE(


DNI VARCHAR(10) NOT NULL REFERENCES PROFESOR,
CODASIGNAT INTEGER NOT NULL REFERENCES ASIGNATURA,
PRIMARY KEY(DNI,CODASIGNAT)
);
CREATE TABLE EVALUA(
codPregunta INTEGER NOT NULL REFERENCES PREGUNTA,
CODASIGNAT INTEGER NOT NULL,
NumOrdenTema INTEGER NOT NULL,
FOREING KEY (CODASIGNAT, NumOrdenTema) REFERENCES TEMA,
PRIMARY KEY(codPregunta, CODASIGNAT, NumOrdenTema)
);

CREATE TABLE INCLUYE(


CODPREGUNTA INTEGER NOT NULL REFERENCES PREGUNTA,
CODASIGNAT INTEGER NOT NULL,
Convocatoria VARCHAR(20) NOT NULL,
NumCorrectas INTEGER,
NumIncorrectas INTEGER,
NumBlanco INTEGER,
FOREING KEY (CODASIGNAT, Convocatoria) REFERENCES EXAMEN,
PRIMARY KEY(codExamen, codPregunta)
);

También podría gustarte