Examen Junio 2012

Anuncio
Maestría en Bioinformática – Bases de Datos y Sistemas de Información
Examen Junio 2012
Instrucciones





La duración del examen es de 2 horas
Escriba de un solo lado y numere todas las hojas
Indique cédula y nombre en cada una de las hojas
Escriba con lápiz y en forma prolija
Comience cada ejercicio en una nueva hoja
Cédula
Nombre
Total de hojas
Espacio reservado para la corrección
Obligatorios
Obligatorio 1
Obligatorio 2
Obligatorio 3
Total
Examen
Resultado final
Ejercicio 1
Ejercicio 2
Ejercicio 3
Total
Obligatorios
Examen
Porcentaje
Nota
Página 1 de 6
Maestría en Bioinformática – Bases de Datos y Sistemas de Información
Ejercicio 1
(16 puntos)
Todas las respuestas deben ser breves y concretas. Cada parte representa 2 puntos.
a) Mencione la diferencia entre esquema e instancia de una base de datos
El esquema de una base está dado por sus estructuras, mientras que la instancia está
determinada por los datos que se mantienen en las estructuras (análogamente a lo que
ocurre con el tipo de datos y el valor de una variable). Por otro lado, la instancia tiende
a cambiar muy frecuentemente a causa de la operación de los sistemas, mientras que
el esquema tiende a no cambiar frecuentemente y cuando lo hace generalmente es
debido a mantenimiento (correctivo, perfectivo o evolutivo).
b) Nombre y describa dos atributos de calidad de esquemas
Completitud: Este atributo de calidad es tan importante que se conoce como el principio
del 100%, y dice que un modelo debe ser completo en el sentido que todos los
elementos de interés deben estar representados en el modelo.
Correctitud: Este es otro atributo no negociable y significa que los modelos deben
representar correctamente la realidad que pretenden modelar.
c) Nombre y describa el significado de la “I” de las propiedades ACID de las transacciones
La propiedad de Isolation (aislamiento) nos dice que toda transacción en curso debe
estar aislada de otras transacciones en el sentido que no se verá afectada por ellas. El
estándar de SQL describe 4 niveles de aislamiento (o isolation levels) y los RDBMSs
implementan diferentes niveles de aislamiento (no necesariamente iguales a los del
estándar) mediante mecanismos de locking.
d) ¿Cuál es la diferencia entre las operaciones de conjuntos UNION y UNION ALL?
UNION ALL es una operación sobre multiconjuntos y no elimina repetidos, mientras
que UNION sí lo hace, necesitando para esto ordenar los conjuntos lo que lo hace
computacionalmente más costoso.
e) Mencione dos objetos de base de datos que no sean tablas o constraints y justifique su
utilidad
Índices: son estructuras (normalmente arborescentes) diseñadas para mejorar la
performance de los accesos a los datos.
Vistas: son consultas almacenadas con un nombre, y pueden ser útiles tanto para
simplificar y modularizar el código SQL, como para otorgar privilegios sobre los datos
con una granularidad más fina que la de tabla.
f)
Considere la siguiente sentencia DDL y escriba otra que permita definir una Primary
Key por las columnas tipo_doc y nro_doc
create table personas(
tipo_doc integer not null,
nro_doc integer not null,
nombre varchar(60)
);
alter table personas
add constraint pk_personas
primary key (tipo_doc, nro_doc);
Página 2 de 6
Maestría en Bioinformática – Bases de Datos y Sistemas de Información
g) Considere que sobre la tabla de la parte anterior se ejecutan las siguientes sentencias,
y diga cuántas tuplas retornará la consulta
insert into personas(tipo_doc, nro_doc, nombre) values (1, 4101309, 'Juan');
insert into personas(tipo_doc, nro_doc, nombre) values (2, 22403455, null);
select nro_doc from personas where nombre = null;
La consulta no retornará tuplas ya que la comparación con null siempre se evalúa como
falsa.
h) Considerando la tabla creada en la parte f, escriba las sentencias necesarias para crear
una tabla “codiguera” de tipos de documentos, y escriba las sentencias necesarias para
asegurar que no se podrá insertar un tipo de documento no válido en la tabla de
personas
create table tipos_documento(
id_tipo_doc integer not null primary key,
nom_tipo_doc varchar(10) not null
);
alter table personas
add constraint fk_personas_tdoc
foreign key (tipo_doc) references tipos_documento(id_tipo_doc);
Ejercicio 2
(54 puntos)
Una empresa de servicios necesita implantar un sistema para manejar sus facturas de compra
y de venta. Todas las facturas tienen un número, una fecha, y varias líneas (por lo menos una).
Cada línea de factura tiene una descripción, un importe sin IVA, el monto del IVA, y el monto
total. Las facturas de venta deben registrar los datos del cliente, que puede ser nacional o
extranjero. Si es nacional se debe mantener el RUT (que lo identifica), el nombre, la dirección y
si es consumidor final (si o no). Si es extranjero se debe mantener el nombre y el país. Los
servicios a extranjeros están exentos de IVA (IVA=0). Las facturas de compra deben registrar
los datos del proveedor, que siempre es nacional: el RUT (que lo identifica), el nombre y la
dirección.
a) [15 puntos] Realizar un modelo conceptual que modele los requerimientos planteados,
puede asumir requerimientos que no estén en la letra siempre y cuando los explicite
Página 3 de 6
Maestría en Bioinformática – Bases de Datos y Sistemas de Información
RNE:
o
o
o
o
En LineaFactura, el atributo total es derivable y se calcula como importe + iva
Los conjuntos de entidades FacturaCompra y FacturaVenta son disjuntos
Los conjuntos de entidades ClienteNacional y ClienteExtranjero son disjuntos
El atributo iva de toda entidad de LineaFactura de una FacturaVenta para un
ClienteExtranjero es 0
b) [10 puntos] Traducir el modelo conceptual de la parte anterior a modelo lógico
Decisiones de diseño:




Las facturas de compra y venta se mantendrán en una única tabla, y se
diferenciarán mediante una columna tipo que podrá ser C (Compra) o V (Venta),
las columnas id_cliente y rut_proveedor deberán admitir nulos.
Los clientes nacionales y extranjeros se mantendrán en una única tabla y se
diferenciarán mediante una columna tipo que podrá valer N (Nacional) y E
(Extranjero), las columnas rut, pais, direccion y consumidorfinal deberán admitir
nulos.
Se creará una codiguera de países
En LineasFactura el total se mantendrá físicamente y se controlará la restricción
mediante una Check Constraint, aunque podría no mantenerse y ofrecer una vista
con el atributo calculado.
Constraints:













PK: Proveedores(rut)
PK: Facturas(numero)
PK: LineasFactura(numero_factura, numerolinea)
PK: Clientes(id)
PK: Paises(id)
FK: Facturas(id_cliente) references Clientes(id)
FK: Facturas(rut_proveedor) references Proveedores(rut)
FK: LineasFactura(numero_factura) references Facturas(numero)
FK: Clientes(id_pais) references Paises(id)
CHECK: LineasFactura(total = importe + iva)
CHECK: Facturas(tipo in (‘C’, ‘V’))
CHECK: Clientes(tipo in (‘N’, ‘E’))
CHECK: Clientes(consumidorfinal in (‘S’, ‘N’))
Página 4 de 6
Maestría en Bioinformática – Bases de Datos y Sistemas de Información
c) [10 puntos] Implementar el modelo lógico de la parte anterior mediante sentencias DDL
create table facturas (
numero integer not null primary key,
fecha date not null,
tipo char(1) not null,
id_cliente integer,
rut_proveedor integer
);
create table lineasfactura (
numero_factura integer,
numerolinea integer,
descripcion varchar2(100),
importe number(10,2),
iva number(10,2),
total number(10,2)
);
alter table lineasfactura add constraint pk_lineasfactura
primary key (numero_factura,numerolinea);
create table clientes (
id integer not null primary key,
tipo char(1) not null,
rut integer,
nombre varchar2(40) not null,
direccion varchar2(100),
consumidorfinal char(1),
id_pais integer
);
create table paises (
id integer not null primary key,
nombre varchar2(40) not null
);
create table proveedores (
rut integer not null primary key,
nombre varchar2(40) not null,
direccion varchar2(100) not null
);
alter table facturas add constraint fk_facturas_cliente
foreign key (id_cliente) references clientes(id);
alter table facturas add constraint fk_facturas_proveedor
foreign key (rut_proveedor) references proveedores(rut);
alter table lineasfactura add constraint fk_lineasfactura_facturas
foreign key (numero_factura) references facturas(numero);
alter table clientes add constraint fk_clientes_pais
foreign key (id_pais) references paises(id);
alter table lineasfactura add constraint check_total
check (total = importe + iva);
alter table facturas add constraint check_tipo_factura
check (tipo in ('C', 'V'));
alter table clientes add constraint check_tipo_cliente
check (tipo in ('N', 'E'));
alter table clientes add constraint check_cf_cliente
check (consumidorfinal in ('S', 'N'));
Página 5 de 6
Maestría en Bioinformática – Bases de Datos y Sistemas de Información
d) [5 puntos] Explique cómo podría lograr (sin usar triggers) que si se elimina una factura
se eliminen automáticamente las líneas de esa factura, y que se evite que se elimine
un cliente o proveedor si hay facturas de ese cliente o proveedor
Utilizando las cláusulas ON DELETE (CASCADE / NO ACTION) de las FK:
alter table lineasfactura add constraint fk_lineasfactura_facturas
foreign key (numero_factura) references facturas(numero)
on delete cascade;
alter table facturas add constraint fk_facturas_cliente
foreign key (id_cliente) references clientes(id)
on delete no action;
alter table facturas add constraint fk_facturas_proveedor
foreign key (rut_proveedor) references proveedores(rut)
on delete no action;
e) [7 puntos] Escriba una consulta que retorne todas las facturas (sin líneas), con: el
número de factura, la fecha y los importes (sin IVA, IVA y total) positivos si son de
venta o negativos si son de compra
create view v_facturas as
select
f.numero,
f.fecha,
sum(lf.importe) importe,
sum(lf.iva) iva,
sum(lf.total) total
from
facturas f,
lineasfactura lf
where
f.numero = lf.numero_factura
and f.tipo = 'V'
group by
f.numero, f.fecha
union all
select
f.numero,
f.fecha,
-sum(lf.importe) importe,
-sum(lf.iva) iva,
-sum(lf.total) total
from
facturas f,
lineasfactura lf
where
f.numero = lf.numero_factura
and f.tipo = 'C'
group by
f.numero, f.fecha;
f)
[7 puntos] Escriba una consulta que permita calcular el IVA a pagar en un mes dado
(por ejemplo, entre el 01/05/2012 y el 31/05/2012), que se calcula como el IVA de venta
menos el IVA de compra.
Utilizando la vista creada en la parte anterior:
alter session set nls_date_format = 'dd/mm/yy';
select sum(iva) iva_a_pagar
from v_facturas
where fecha between '01/05/12' and '31/05/12';
Página 6 de 6
Descargar