Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Cuando estudiamos en el tema 1, cómo el modelo relacional se encuadraba dentro del marco de la
arquitectura ANSI de tres capas, utilizamos el siguiente gráfico:
Esquemas externos. En ellos se describen solamente una parte de la BD, ya que muchos
usuarios necesitarán únicamente una visión parcial y personalizada de la estructura del
ámbito acotado en el que trabajan. Para estos usuarios se define una vista externa o
subesquema de la BD. Por ejemplo en un sistema bancario, las personas que trabajan con las
nóminas sólo podrán ver la parte de la BD con información sobre los empleados, mientras
que los cajeros sólo podrán tener acceso a la información de las cuentas.
En el modelo relacional, los usuarios pueden trabajar directamente sobre el esquema conceptual o
sobre las vistas que de él se definan. Existe una independencia lógica entre los datos accesibles a
través de una vista y en cómo estén estructurados realmente en el esquema conceptual, ya que es
posible cambiar la estructura lógica de una base de datos, sin que eso conlleve necesariamente una
modificación sobre la estructura de las vistas definidas
Seguridad. Cada usuario puede obtener permisos para acceder a la base de datos
únicamente a través de ciertas vistas que contienen los datos específicos que ese usuario está
autorizado a ver. Esto simplifica en gran medida la gestión de los permisos asociados a los
usuarios sobre los datos.
Simplicidad de consulta. Una vista pueda extraer datos de varias tablas diferentes y
presentarlos como una única tabla, haciendo que las consultas multitabla se formulen como
consultas de una única tabla con respecto a la vista.
Simplicidad estructurada. Las vistas pueden dar a un usuario una visión “personalizada”
de la estructura de la base de datos, abstrayendo al mismo, de la estructura real de la base de
datos.
Aislamiento frente al cambio. Una vista puede presentar una imagen consistente de la
estructura de la base de datos, incluso si las tablas fuente subyacentes se dividen,
reestructuran o cambian de nombre.
Rendimiento. Las vistas crean la apariencia de una tabla, pero el SGBD debe traducir las
consultas sobre la vista a consultas sobre las tablas fuentes subyacentes.
Por tanto, dadas sus desventajas, no se deben definir indiscriminadamente vistas sobre nuestras
bases de datos y utilizarlas en detrimento de las tablas fuentes. Habrá que considerar en cada caso
las ventajas proporcionadas por el uso de vistas ponderándolas con sus desventajas.
La sentencia CREATE VIEW es la que se utiliza para crear vistas. Su sintaxis es muy sencilla:
Por ejemplo:
En función de los datos gestionados por las vistas, podemos encontrarnos con varios tipos:
Vistas verticales. Permiten acceder a todos los registros de la tabla, aunque en lugar de
poder acceder a todos los atributos, sólo a un subconjunto de ellos.
Vistas con subconjuntos fila/columna. Son una combinación de las dos anteriores.
Vistas compuestas. Son vistas en las que los registros resultados se obtienen tras combinar
varias tablas fuentes.
¿Qué significado tiene insertar un registro en una vista, suprimirlo o actualizarlo? Para algunas
vistas estas operaciones pueden ser traducidas obviamente a operaciones equivalentes respecto a las
tablas fuentes de la vista. Sin embargo en otros casos: vistas agrupadas, vistas compuestas y vistas
verticales, está traducción no es nada obvia y por lo tanto el SGBD no podrá determinar cómo
traducir esa sentencia. Pensemos si no en las siguientes vistas:
De acuerdo al estándar ISO, una vista puede ser actualizada si la consulta que la define satisface las
siguientes restricciones:
No debe especificarse DISTINCT, es decir, las filas duplicadas no deben ser eliminadas de
los resultados de la consulta.
La cláusula FROM debe especificar solamente una tabla actualizable, es decir, la vista debe
temer una única tabla fuente para la cual el usuario tenga los privilegios requeridos.
En el caso de las vistas verticales que satisfagan los puntos anteriores, éstas serán actualizables si se
definen valores por defecto, o se permiten la inclusión de nulos en los atributos que formen parte de
la tabla asociada, pero que no formen parte de la vista.
Las reglas definidas por el estándar son muy restrictivas. Hay muchas vistas que pueden ser
actualizadas teóricamente y que no satisfacen todas las restricciones. Además, hay vistas que
pueden soportar algunas de las operaciones de actualización pero no otras. La mayoría de las
implementaciones SQL comerciales tienen reglas de actualización de vistas que son
considerablemente más permisivas que el estándar.
Si una vista se define mediante una consulta que incluye la cláusula WHERE, sólo los registros que
satisfagan la condición ahí expresada serían visibles. En la siguiente vista, sólo los registros, cuya
oficina sea la 11, 12 o 13 aparecerán:
La vista anterior, es una vista actualizable, ya que cumple todas las condiciones expresadas en el
punto anterior. Por lo tanto, una sentencia como la siguiente es perfectamente válida:
El sistema insertaría ese registro en la tabla RepVentas. Sin embargo, la fila insertada no satisface la
condición WHERE asociada a la vista por lo que si hacemos un SELECT * FROM RepEste, el
registro que acabamos de insertar no aparecería, lo cual puede resultar un poco desconcertante.
Para evitar que ocurra lo anterior, SQL nos permite añadirle una cláusula a la sentencia de creación
de vista, que garantice que las actualizaciones que se realicen sobre las mismas deban cumplir las
restricciones expresadas en el WHERE y de no hacerlo, no serán permitidas. Para ello, bastará con
añadir WITH CHECK OPTION al final de la definición:
La opción de comprobación añade una carga de trabajo adicional a las operaciones INSERT y
UPDATE, pero ayuda a asegurar la integridad de la base de datos.
Borrar una vista es muy sencillo. Basta con invocar a la sentencia DROP VIEW seguido del nombre
de la vista que queremos eliminar. Por ejemplo:
5 Vistas en MySQL
Podemos observar que coincide con la expresada en el estándar SQL con leves diferencias. MySQL
permite definir diferentes valores para el parámetro ALGORITHM. Este parámetro le indica al
sistema cómo debe actuar a la hora de traducir una consulta sobre una vista:
UNDEFINED: Dejamos que sea MySQL quien decida el algoritmo por si mismo. Es el
caso por defecto.
MERGE: En este caso, MySQL tratará de combinar la consulta realizada sobre la vista con
la consulta que define la vista, de manera que el resultado pueda ser más óptimo.
TEMPTABLE: En el momento de hacer una consulta sobre la vista se crea una tabla
temporal donde se guardan los registros de la vista y sobre esa tabla virtual se realizaría la
consulta. El uso de esta opción tiene una gran ventaja y una gran desventaja:
o Desventaja: La vista no es actualizable, por lo que cualquier cambio se deberá
hacer en la tabla original.
o Ventaja: Los bloqueos se liberan antes, ya que la consulta de la vista se hace a partir
de la tabla temporal, lo que posibilita que otros threads puedan realizar otras
operaciones sobre la tabla original, obteniendo de esta manera un rendimiento
mayor.
En MySQL, las vistas no serán actualizables si contienen:
Con respecto a la posibilidad de agregar registros mediante sentencias INSERT, es necesario que las
columnas de la vista actualizable también cumplan los siguientes requisitos adicionales:
La vista debe contemplar todas las columnas de la tabla en la base de datos que no tengan
indicado un valor por defecto.
Las columnas de la vista deben ser referencias a columnas simples y no columnas derivadas.
Una columna derivada es una que deriva de una expresión.
6 Vistas Materializadas
En un sistema de gestión de base de datos que siga el modelo relacional, una vista es una tabla
virtual, que representa el resultado de una consulta. Siempre que se consulta o se actualiza una vista
normal, el SGBD convierte estas operaciones en consultas o actualizaciones de las tablas usadas
para definir la vista.
Una vista materializada utiliza una aproximación diferente: el resultado de la consulta se almacena
en una tabla caché real, que será actualizada de forma periódica a partir de las tablas originales.
Además, dado que la vista se almacena como una tabla real, se puede hacer con ella lo mismo que
con cualquier otra tabla, siendo especialmente importante la capacidad de crear índices en cualquier
columna, lo cual puede aumentar significativamente la velocidad de las consultas. En una vista
normal, lo habitual es que sólo se permita utilizar índices sobre aquellas columnas que ya tienen
definido un índice en la tabla original; a veces ni siquiera se ofrece esa posibilidad.
Las vistas materializadas fueron implementadas por primera vez en el gestor de base de datos
Oracle. Otros sistemas como SQL Server las llaman vistas indexadas. En MySQL no es posible
trabajar con este tipo de vistas.