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