2008-10-17 22 views
73

Solo trato de tener una idea general de las vistas que se utilizan en RDBMSes. Es decir, sé lo que es una vista y cómo hacer una. También sé para qué los he usado en el pasado.¿Para qué sirven las vistas?

Pero quiero asegurarme de tener un conocimiento profundo de para qué sirve una vista y para qué no debería ser útil una vista. Más específicamente:

  1. ¿Para qué sirve una vista?
    • ¿Hay alguna situación en la que es tentador usar una vista cuando no debe usar una?
    • ¿Por qué usaría una vista en lugar de algo así como una función con valores de tabla o viceversa?
    • ¿Hay alguna circunstancia que una vista pueda ser útil y que no sea evidente a primera vista?

(Y para que conste, algunas de estas preguntas son intencionadamente ingenuo. Esto es en parte un cheque concepto.)

+1

similar a la pregunta publicada aquí: http://stackoverflow.com/questions/1278521/why-do-you-create-a-view-in-a-database – MedicineMan

Respuesta

37

1) ¿Para qué sirve una vista?

IOPO En un solo lugar

• Si tenemos en cuenta los datos en sí o las consultas que hacen referencia las tablas combinadas, utilizando una vista evita la redundancia innecesaria.

• Las vistas también proporcionan una capa de abstracción que impide el acceso directo a las tablas (y las esposas resultantes que hacen referencia a las dependencias físicas). De hecho, creo que es buenas prácticas para ofrecer acceso de sólo abstraída a los datos subyacentes (el uso de vistas y funciones con valores de tabla), incluyendo vistas como

CREATE VIEW AS
      SELECT * FROM tblData


que hafta admitir que hay un buen trato de "Haz lo que digo, no lo que hago" en ese consejo;)

2) ¿Hay alguna situación en la que es tentador usar una vista cuando no debes usarla?

El rendimiento en las uniones de vista solía ser una preocupación (por ejemplo, SQL 2000). No soy un experto, pero no me he preocupado por un tiempo. (Tampoco puedo pensar en dónde uso actualmente las combinaciones de ver.)

Otra situación en la que una vista puede ser excesiva es cuando la vista solo se referencia desde una ubicación de llamada y en su lugar se puede usar una tabla derivada. Al igual que un tipo anónimo es preferible a una clase en .NET si el tipo anónimo solo se utiliza/hace referencia una vez.

    • Véase la descripción de la tabla derivada en   http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) ¿Por qué utilizar una vista, en lugar de algo así como una función de valor de tabla o viceversa?

(Aparte de los motivos de rendimiento) Una función con valores de tabla es funcionalmente equivalente a una vista con parámetros. De hecho, un caso de uso de función de tabla simple común es simplemente agregar un filtro de cláusula WHERE a una vista existente en un solo objeto.

4) ¿Hay alguna circunstancia que una vista pueda ser útil y que no sea evidente a primera vista?

No puedo pensar en ningún uso no aparente de la parte superior de mi cabeza. (Supongo que si pudiera, eso los haría aparentes;)
+7

No estaría de acuerdo con que tenga sentido crear una vista en un tabla cuando es SELECCIONADA * FROM tblData. ¿Puede ofrecer una explicación de por qué esto sería beneficioso? –

+0

IOPO - En un solo lugar - ¿Es esta una frase de diseño bien conocida? No puedo encontrar muchas referencias al respecto? Tiene otras formas, p. ¿SECO? – Robert

40

En cierto modo, una vista es como una interfaz. Puede cambiar la estructura de la tabla subyacente todo lo que desee, pero la vista le permite al código no tener que cambiar.

Las vistas son una buena forma de proporcionar algo simple para informar escritores. Si los usuarios de su empresa desean acceder a los datos de algo parecido a Crystal Reports, puede darles algunas vistas en su cuenta que simplifiquen los datos, incluso pueden desnormalizarlos.

19

Las vistas se pueden usar para proporcionar seguridad (es decir, los usuarios pueden tener acceso a vistas que solo acceden a ciertas columnas en una tabla); las vistas pueden proporcionar seguridad adicional para actualizaciones, inserciones, etc. Las vistas también proporcionan una manera de alias nombres (como sp's) pero las vistas son más un aislamiento de la tabla real.

16

En cierto sentido, las vistas se desnormalizan. La desnormalización a veces es necesaria para proporcionar datos de una manera más significativa. Esto es lo que hacen muchas aplicaciones de todos modos a través del modelado de dominio en sus objetos. Ayudan a presentar los datos de una manera que se aproxima más a la perspectiva de una empresa.

+0

-1 "views denormalize"? lo siento, pero eso no tiene sentido a menos que esté calificado de alguna manera. –

+14

Ellos absolutamente desnormalizar. Si tiene tablas relacionadas que están normalizadas en el formulario 3er nomial y crea una vista para "aplanar" esa relación, ¿cómo no se trata de desnormalización? – Kilhoffer

5

Las vistas pueden centralizar o consolidar datos. En donde estoy, tenemos varias bases de datos diferentes en un par de servidores vinculados diferentes. Cada base de datos contiene datos para una aplicación diferente. Algunas de esas bases de datos contienen información que se relaciona con varias aplicaciones diferentes. Lo que haremos en esas circunstancias es crear una vista en la base de datos de esa aplicación que simplemente extraiga datos de la base de datos donde realmente se almacenan los datos, de modo que las consultas que escribimos no parezcan estar pasando por diferentes bases de datos.

9

Además de lo que han dicho los otros, las vistas también pueden ser útiles para eliminar consultas SQL más completas de la aplicación.

Como un ejemplo, en lugar de en una aplicación haciendo:

sql = "select a, b de unión tabla1 seleccionar a, b de Tabla2";

Usted podría abstracto que a una vista:

CREATE VIEW union_table1_table2_v como
seleccionar a, b de la Tabla1
unión
seleccionar a, b de tabla2

y en el código de la aplicación, simplemente tiene:

sql = "seleccionar a, b de union_table1_table2_v";

Además, si las estructuras de datos cambian alguna vez, no tendrá que cambiar el código de la aplicación, volver a compilar y volver a desplegar. simplemente cambiaría la vista en el db.

+0

¿Por qué quiero escribir sql complejo en la base de datos en lugar de la aplicación? –

+3

Cuanto más complicada sea su consulta, más probabilidades habrá de que cambie en el futuro, en parte debido a que acaba de llegar a más tablas. Cuando las estructuras DB cambian, también debe cambiar su código y hacer una versión. Si esa complejidad se abstrae en una vista, el administrador de bases de datos puede realizar cambios estructurales en las tablas subordinadas sin que tenga que cambiar el código. – CodingWithSpike

6

El OP preguntó si había situaciones donde podría ser tentador usar una vista, pero no es apropiado.

Lo que no desea utilizar es un sustituto de combinaciones complejas. Es decir, no permita que su hábito de programación procedural de dividir un problema en partes más pequeñas lo lleve a utilizar varias vistas unidas en lugar de una unión más grande. Hacerlo matará la eficiencia del motor de la base de datos ya que básicamente está haciendo varias consultas separadas en lugar de una más grande.

Por ejemplo, supongamos que tiene que unir las tablas A, B, C y D juntas. Puede tener la tentación de hacer una vista desde las tablas A & B y una vista desde C & D, luego unir las dos vistas juntas. Es mucho mejor simplemente unir A, B, C y D en una consulta.

+0

No creo que sea correcto, al menos no es así como va la teoría DBMS (varias implementaciones pueden decidir no respetar la teoría). El analizador de consultas esencialmente reemplazará cualquier vista que vea con el sql correspondiente, y el optimizador irá desde allí. Los 2 casos deben ser equivalentes. – SquareCog

+0

Esto tampoco es válido cuando puede agregar índices a sus vistas. – therealhoff

+0

@Barry Brown: ¿qué producto exhibe este comportamiento tonto? –

4

Las respuestas hasta el momento son correctos - vistas son buenas para proporcionar seguridad, desnormalización (aunque hay mucho dolor por ese camino si se hace mal), modelo de abstracción de datos, etc.

Además, las vistas son comúnmente utilizado para implementar la lógica de negocios (un usuario caducado es un usuario que no ha iniciado sesión en los últimos 40 días, ese tipo de cosas).

+1

¿Cómo los haces mal? – reconbot

+0

si se desnormaliza salteando en 7 tablas de referencia, y luego busca algo que solo necesita una de esas tablas de referencia. Eso es un gran esfuerzo desperdiciado. Esto empeora si comienza a unirse a tales vistas. – SquareCog

+0

¿estás seguro de esto? MSDN dice "Cuando SQL Server procesa consultas que se refieren a vistas por nombre, las definiciones de las vistas normalmente se expanden hasta que se refieren solo a tablas base. Este proceso se llama expansión de vista. Es una forma de macro expansión '. Me imagino que durante el proceso de expansión, el motor sería lo suficientemente inteligente como para incluir solo las tablas subyacentes (de la vista) que necesita la consulta. – Anthony

1

Quería resaltar el uso de vistas para generar informes. A menudo, existe un conflicto entre normalizar las tablas de la base de datos para acelerar el rendimiento, especialmente para editar e insertar datos (utiliza OLTP) y desnormalizar para reducir el número de combinaciones de tabla para consultas de informes y análisis (utiliza OLAP). Por necesidad, OLTP generalmente gana, porque la entrada de datos debe tener un rendimiento óptimo. Por lo tanto, la creación de vistas para un rendimiento óptimo de los informes puede ayudar a satisfacer ambas clases de usuarios (entrada de datos y visores de informes).

11

Las vistas ocultan la complejidad de la base de datos. Son geniales por muchas razones y son útiles en muchas situaciones, pero si tiene usuarios que pueden escribir sus propias consultas e informes, puede usarlos como medida de seguridad para asegurarse de que no se envíen mal diseñados. consultas con desagradables uniones cartesianas que anulan su servidor de base de datos.

3

Las vistas guardan muchas sentencias complejas de JOIN repetidas en sus scripts SQL. Puede encapsular algunos JOIN complejos en alguna vista y llamarlos en su instrucción SELECT siempre que sea necesario. Esto a veces sería útil, directo y más fácil que escribir las instrucciones de combinación en cada consulta.

1

Recuerdo un SELECT muy largo que involucraba a varios UNION. Cada UNION incluía un join a una tabla de precios que fue creada sobre la marcha por un SELECT que era bastante largo y difícil de entender. Creo que habría sido una buena idea tener una visión para crear la tabla de precios. Habría acortado la SELECCIÓN general en aproximadamente la mitad.

No sé si el DB evaluaría la vista una vez, o una vez cada vez que se invocara. ¿Nadie sabe? Si lo primero, usar una vista mejoraría el rendimiento.

+0

Oracle CBO podría elegir evaluar la vista una vez (materializarse, lo llaman) o combinar el SQL para la vista en el resto de la instrucción de selección y ejecutar eso. Decidiría en función de lo que tenía el menor costo estimado. –

+0

Si la instrucción de selección fue constante durante toda la consulta y simplemente se repitió varias veces, una expresión de tabla común (CTE) podría resolver el problema. Esto solo se aplica a SQL Server 2005/2008 ya que no estaba disponible en SQL Server 2000. Sí, una vista todavía se habría invocado repetidamente. –

+0

@ Usuario registrado: los CTE no son una especialidad de SQL Server. Se originaron en DB2 y también están presentes en PostgreSQL (ya que son útiles y están en el estándar ISO SQL). Si una vista está en línea o tratada como una blackbox es específica de la implementación, algunos RDBMS son más inteligentes que otros. –

2

Una vista es simplemente una declaración almacenada, llamada SELECT. Piense en vistas como las funciones de la biblioteca.

+0

¿Los procedimientos almacenados no encajarían mejor con el dinero para esto? Algunas veces necesita funciones con eliminaciones y las vistas de actualizaciones no encajan en esta necesidad. Las vistas deben considerarse abstracciones o formas de limitar al usuario objetivo. – HumbleWebDev

0

Cada vez que necesite [my_interface]! = [User_interface].

Ejemplo:

CUADRO A:

  • Identificación
  • información

VIEW durante CUADRO A:

  • Información del cliente

esta es una manera en la que puede ocultar la identificación del cliente y cambiarle el nombre a un nombre más detallado a la vez.

La vista usará el índice subyacente para la identificación de la clave principal, por lo que no verá una pérdida de rendimiento, solo una mejor abstracción de la consulta de selección.

Cuestiones relacionadas