¿Por qué crea una vista en una base de datos?

267

¿Cuándo y por qué alguien decide que necesita crear una Vista en su base de datos? ¿Por qué no simplemente ejecutar un procedimiento almacenado normal o seleccionar?

Curandero
fuente
Verifique mi respuesta a una pregunta similar, ¡espero que ayude!
Loukan ElKadi

Respuestas:

464

Una vista proporciona varios beneficios.

1. Las vistas pueden ocultar la complejidad

Si tiene una consulta que requiere unir varias tablas, o tiene cálculos o lógica compleja, puede codificar toda esa lógica en una vista, luego seleccionar de la vista como lo haría con una tabla.

2. Las vistas se pueden usar como un mecanismo de seguridad

Una vista puede seleccionar ciertas columnas y / o filas de una tabla (o tablas), y los permisos establecidos en la vista en lugar de las tablas subyacentes. Esto permite mostrar solo los datos que un usuario necesita ver.

3. Las vistas pueden simplificar el soporte de código heredado

Si necesita refactorizar una tabla que rompería mucho código, puede reemplazar la tabla con una vista del mismo nombre. La vista proporciona exactamente el mismo esquema que la tabla original, mientras que el esquema real ha cambiado. Esto evita que el código heredado que hace referencia a la tabla se rompa, lo que le permite cambiar el código heredado cuando lo desee.

Estos son solo algunos de los muchos ejemplos de cómo las vistas pueden ser útiles.

Dave Carlile
fuente
84
el punto 3 es una razón que nadie más parece haber señalado sin embargo
medicineman
2
Creo que el punto 3 es más un stop gap que otra cosa. Finalmente, cuando tenga la oportunidad de actualizar el código heredado, no solo tendrá que cambiar el código detrás de la vista, sino también todo el código que se ha creado en la parte superior de la vista. My 2cents
super9
3
3 Es realmente la propiedad más poderosa de las vistas. Es lo que ayuda a proporcionar independencia de datos lógicos. El hecho de que pueda proporcionar una interfaz a la base de datos independiente de la base de datos lógica subyacente es un concepto muy poderoso.
Falaina
1
@John, esta deuda técnica incurrida debe pagarse tarde o temprano, ¿no? En 10 años, podría no importarle a ese ingeniero que lo escribió hace 10 años, pero le importa a la compañía.
super9
Cambiar su base de datos principal y todo lo que dependa de ella es una mala elección porque podría 'necesitarla en 10 años'. La deuda técnica no debe evitarse a toda costa, solo si el costo esperado de arreglarlo más tarde es más que el costo definitivo de arreglarlo ahora.
Sr. Boy
88

Entre otras cosas, se puede usar para seguridad. Si tiene una tabla de "clientes", es posible que desee dar a todos sus vendedores acceso a los campos de nombre, dirección, código postal, etc., pero no credit_card_number. Puede crear una vista que solo incluya las columnas a las que necesitan acceso y luego otorgarles acceso en la vista.

Graeme Perrow
fuente
interesante. La seguridad es una buena respuesta. ¿Qué 'otras cosas' tienes en mente?
MedicineMan
13
Supuse que las otras respuestas a esta pregunta describirían las "otras cosas". :-)
Graeme Perrow
Select name, address, zipcode from customerno serviría el propósito en lugar de creating a view?
PPB
@PranavBilurkar Sí, si controla completamente las consultas que ejecutan los usuarios. Si los usuarios tienen la capacidad de ejecutar sus propias consultas (a través de algún programa SQL interactivo o escribiendo sus propios scripts), pueden ejecutar lo select * from customerque les da acceso a todo. Si les da acceso a la vista y no a la tabla, no podrán acceder a los campos que no están en la vista.
Graeme Perrow el
38

Una vista es una encapsulación de una consulta. Las consultas que se convierten en vistas tienden a ser complicadas y, como tal, guardarlas como una vista para su reutilización puede ser ventajoso.

Andrew Hare
fuente
¿Desea crear una vista cuando tiene una consulta complicada? ¿Qué tan complicado de una consulta, cuál es el umbral? ¿Qué obtienes al hacer una vista?
MedicineMan
44
Cuán complicada es una elección personal realmente, no hay un umbral establecido. A menudo usaría una vista si no desea duplicar la lógica en múltiples aplicaciones o diferentes puntos en su aplicación, por ejemplo. Al convertirlo en una vista, oculta esa lógica y puede compartirla fácilmente.
Chris Cameron-Mills
1
¿No puede hacer lo mismo con un procedimiento almacenado que tiene una selección? ¿He pensado incorrectamente en los procedimientos almacenados como una forma de almacenar una lógica de consulta compleja? ¿Deben realizarse consultas complejas en vistas en lugar de procedimientos almacenados? ¿Cuál es la ventaja de un procedimiento almacenado aquí?
MedicineMan
2
@MedicineMan: un procedimiento almacenado devuelve un conjunto de resultados, mientras que una vista representa una tabla virtual que le permite usarla como tabla en otras consultas.
Andrew Hare
1
Creo que este punto sobre el conjunto de resultados frente a la tabla virtual parece ser un punto clave que no entendí.
MedicineMan
28

Por lo general, creo vistas para desnormalizar y / o agregar datos utilizados con frecuencia para fines de informes.

EDITAR

A modo de elaboración, si tuviera una base de datos en la que algunas de las entidades fueran persona, empresa, función, tipo de propietario, pedido, detalle del pedido, dirección y teléfono, donde la tabla de personas almacenaba tanto empleados como contactos y la dirección y Las tablas telefónicas almacenaron números de teléfono tanto para personas como para empresas, y el equipo de desarrollo se encargó de generar informes (o hacer que los datos de informes sean accesibles para los no desarrolladores), como ventas por empleado o ventas por cliente, o ventas por región, ventas por mes , clientes por estado, etc. Crearía un conjunto de vistas que desnormalizarían las relaciones entre las entidades de la base de datos para que estuviera disponible una vista más integrada (sin juego de palabras) de las entidades del mundo real. Algunos de los beneficios podrían incluir:

  1. Reducción de la redundancia en la escritura de consultas.
  2. Establecer un estándar para las entidades relacionadas
  3. Brindar oportunidades para evaluar y maximizar el rendimiento para cálculos complejos y combinaciones (por ejemplo, indexación en vistas de Schemabound en MSSQL)
  4. Hacer que los datos sean más accesibles e intuitivos para los miembros del equipo y los no desarrolladores.
cmsjr
fuente
1
¿Puedes dar más detalles sobre esto? Su respuesta está siendo votada bastante, pero no estoy obteniendo el valor que todos los demás parecen
MedicineMan
11

Varias razones: si tiene uniones complicadas, a veces es mejor tener una vista para que cualquier acceso siempre tenga las uniones correctas y los desarrolladores no tengan que recordar todas las tablas que puedan necesitar. Normalmente, esto podría ser para una aplicación financiera en la que sería extremadamente importante que todos los informes financieros se basen en el mismo conjunto de datos.

Si tiene usuarios que desea limitar los registros que pueden ver, puede usar una vista, darles acceso solo a la vista, no a las tablas subyacentes, y luego consultar la vista

Crystal Reports parece preferir usar vistas a los procesos almacenados, por lo que las personas que escriben muchos informes tienden a usar muchas vistas

Las vistas también son muy útiles al refactorizar bases de datos. A menudo puede ocultar el cambio para que el código anterior no lo vea creando una vista. Lea sobre la refactorización de bases de datos para ver cómo funciona esto, ya que es una forma muy poderosa de refactorizar.

HLGEM
fuente
7

La principal ventaja de una vista sobre un procedimiento almacenado es que puede usar una vista como si fuera una tabla. Es decir, se puede hacer referencia a una vista directamente en la FROMcláusula de una consulta. Ej SELECT * FROM dbo.name_of_view.

Casi de cualquier otra forma, los procedimientos almacenados son más potentes. Puede pasar en los parámetros, incluyendo outlos parámetros que permiten eficazmente a regresar varios valores a la vez, se puede hacer SELECT, INSERT, UPDATE, y DELETEoperaciones, etc., etc.

Si desea la capacidad de una Vista para realizar consultas desde dentro de la FROMcláusula, pero también desea poder pasar parámetros, también hay una manera de hacerlo. Se llama una función con valores de tabla.

Aquí hay un artículo bastante útil sobre el tema:

http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html

EDITAR: Por cierto, esto plantea la pregunta, ¿qué ventaja tiene una vista sobre una función con valores de tabla? No tengo una respuesta realmente buena para eso, pero notaré que la sintaxis de T-SQL para crear una vista es más simple que para una función con valores de tabla, y los usuarios de su base de datos pueden estar más familiarizados con las vistas.

devuxer
fuente
+1 por ser una de las pocas respuestas para abordar el problema de los procedimientos almacenados contra las instrucciones SELECT. Tienes razón al plantear el problema de las funciones de tabla. Básicamente, es probable que las vistas funcionen mejor que las funciones porque comparten el mismo motor. Hay que pagar una sobrecarga (al menos en Oracle) al cambiar de SQL a SQL trabsaccional (es decir, PL / SQL). Pero todo lo demás (seguridad, encapsulación, etc.) se aplica igualmente a los procedimientos o funciones como a las vistas.
APC
Dependiendo de la estructura de la vista, algunas vistas pueden indexarse. Esa es una gran mejora sobre las funciones con valores de tabla.
HLGEM
6

Puede funcionar como un buen "intermediario" entre su ORM y sus tablas.

Ejemplo:

Teníamos una tabla de Persona que necesitábamos para cambiar la estructura, de modo que la columna SomeColumn se movería a otra tabla y tendría una relación de uno a muchos.

Sin embargo, la mayoría del sistema, con respecto a la Persona, todavía usaba SomeColumn como una sola cosa, no muchas cosas. Usamos una vista para unir todas las Columnas y ponerlas en la vista, que funcionó muy bien.

Esto funcionó porque la capa de datos había cambiado, pero el requisito comercial no había cambiado fundamentalmente, por lo que los objetos comerciales no tenían que cambiar. Si los objetos comerciales tuvieran que cambiar, no creo que esta hubiera sido una solución viable, pero las opiniones definitivamente funcionan como un buen punto medio.

Joseph
fuente
1
interesante. En su caso, es casi como una interfaz para las tablas.
MedicineMan
5

Centrarse en vistas de datos específicos permite a los usuarios centrarse en datos específicos que les interesan y en las tareas específicas de las que son responsables. Los datos innecesarios pueden quedar fuera de la vista. Esto también aumenta la seguridad de los datos porque los usuarios solo pueden ver los datos definidos en la vista y no los datos de la tabla subyacente. Para obtener más información sobre el uso de vistas con fines de seguridad, consulte Uso de vistas como mecanismos de seguridad.

Para simplificar la manipulación de datos Las vistas pueden simplificar la forma en que los usuarios manipulan los datos. Puede definir combinaciones, proyecciones, consultas UNION y consultas SELECT de uso frecuente como vistas para que los usuarios no tengan que especificar todas las condiciones y calificaciones cada vez que se realiza una operación adicional en esos datos. Por ejemplo, una consulta compleja que se utiliza para informar y realiza subconsultas, uniones externas y agregación para recuperar datos de un grupo de tablas se puede crear como una vista. La vista simplifica el acceso a los datos porque la consulta subyacente no tiene que escribirse o enviarse cada vez que se genera el informe; la vista se consulta en su lugar. Para más información sobre la manipulación de datos.

También puede crear funciones en línea definidas por el usuario que operan lógicamente como vistas parametrizadas, o vistas que tienen parámetros en condiciones de búsqueda de la cláusula WHERE. Para obtener más información, consulte Funciones definidas por el usuario en línea.

Para personalizar las vistas de datos, permita que diferentes usuarios vean los datos de diferentes maneras, incluso cuando usan los mismos datos simultáneamente. Esto es particularmente ventajoso cuando los usuarios con muchos intereses y niveles de habilidad diferentes comparten la misma base de datos. Por ejemplo, se puede crear una vista que recupere solo los datos de los clientes con los que trata un administrador de cuentas. La vista puede determinar qué datos recuperar en función del ID de inicio de sesión del administrador de cuentas que utiliza la vista.

Para exportar e importar datos Las vistas se pueden usar para exportar datos a otras aplicaciones. Por ejemplo, es posible que desee utilizar las tablas de tiendas y ventas en la base de datos de pubs para analizar los datos de ventas con Microsoft® Excel. Para hacer esto, puede crear una vista basada en las tablas de tiendas y ventas. Luego puede usar la utilidad bcp para exportar los datos definidos por la vista. Los datos también se pueden importar a ciertas vistas desde archivos de datos utilizando la utilidad bcp o la instrucción BULK INSERT, siempre que las filas se puedan insertar en la vista utilizando la instrucción INSERT. Para obtener más información sobre las restricciones para copiar datos en vistas, vea INSERTAR. Para obtener más información sobre el uso de la utilidad bcp y la instrucción BULK INSERT para copiar datos hacia y desde una vista, consulte Copiar ao desde una vista.

Para combinar datos particionados El operador de conjunto Transact-SQL UNION se puede usar dentro de una vista para combinar los resultados de dos o más consultas de tablas separadas en un único conjunto de resultados. Esto aparece para el usuario como una sola tabla llamada vista particionada. Por ejemplo, si una tabla contiene datos de ventas para Washington y otra tabla contiene datos de ventas para California, se podría crear una vista desde la UNIÓN de esas tablas. La vista representa los datos de ventas para ambas regiones. Para usar vistas particionadas, crea varias tablas idénticas, especificando una restricción para determinar el rango de datos que se pueden agregar a cada tabla. La vista se crea utilizando estas tablas base. Cuando se consulta la vista, SQL Server determina automáticamente qué tablas se ven afectadas por la consulta y solo hace referencia a esas tablas. Por ejemplo, si una consulta especifica que solo se requieren datos de ventas para el estado de Washington, SQL Server lee solo la tabla que contiene los datos de ventas de Washington; No se accede a otras tablas.

Las vistas particionadas pueden basarse en datos de múltiples fuentes heterogéneas, como servidores remotos, no solo en tablas en la misma base de datos. Por ejemplo, para combinar datos de diferentes servidores remotos, cada uno de los cuales almacena datos para una región diferente de su organización, puede crear consultas distribuidas que recuperen datos de cada fuente de datos y luego crear una vista basada en esas consultas distribuidas. Cualquier consulta solo lee datos de las tablas en los servidores remotos que contienen los datos solicitados por la consulta; no se accede a los otros servidores a los que hacen referencia las consultas distribuidas en la vista.

Cuando particiona datos en varias tablas o servidores múltiples, las consultas que acceden solo a una fracción de los datos pueden ejecutarse más rápido porque hay menos datos para escanear. Si las tablas están ubicadas en diferentes servidores, o en una computadora con múltiples procesadores, cada tabla involucrada en la consulta también se puede escanear en paralelo, mejorando así el rendimiento de la consulta. Además, las tareas de mantenimiento, como la reconstrucción de índices o la copia de seguridad de una tabla, pueden ejecutarse más rápidamente. Al usar una vista particionada, los datos siguen apareciendo como una sola tabla y pueden consultarse como tales sin tener que hacer referencia a la tabla subyacente correcta manualmente.

Las vistas particionadas se pueden actualizar si se cumple alguna de estas condiciones: se define un desencadenador INSTEAD OF en la vista con lógica para admitir las instrucciones INSERT, UPDATE y DELETE.

Tanto la vista como las instrucciones INSERT, UPDATE y DELETE siguen las reglas definidas para vistas particionadas actualizables. Para obtener más información, vea Crear una vista particionada.

https://technet.microsoft.com/en-us/library/aa214282(v=sql.80).aspx#sql:join

Shaharban TA
fuente
5

Aquí hay dos razones comunes:

Puedes usarlo por seguridad. No otorgue permisos en la tabla principal y cree vistas que limiten el acceso a columnas o filas y otorgue permisos a los usuarios para ver la vista.

Puede usarlo para su conveniencia. Une algunas tablas que usas juntas todo el tiempo en la vista. Esto puede hacer que las consultas sean consistentes y fáciles.

KM.
fuente
3

Hay más de una razón para hacer esto. En ocasiones, las consultas de combinación comunes son fáciles, ya que se puede consultar el nombre de una tabla en lugar de realizar todas las combinaciones.

Otra razón es limitar los datos a diferentes usuarios. Entonces, por ejemplo:

Tabla1: Columnas: USER_ID; USERNAME; SSN

Los usuarios administradores pueden tener privilegios en la tabla real, pero los usuarios a los que no desea tener acceso para decir el SSN, crean una vista como

CREAR VER NOMBRES DE USUARIO COMO SELECCIONAR user_id, username de Table1;

Luego, deles privilegios para acceder a la vista y no a la mesa.

RC.
fuente
2

Las vistas pueden ser una bendición cuando se realizan informes en bases de datos heredadas. En particular, puede usar nombres de tablas sensuales en lugar de nombres crípticos de 5 letras (¡donde 2 de esos son un prefijo común!), O nombres de columna llenos de abreviaturas que estoy seguro de que tenían sentido en ese momento.

Jeff Hardy
fuente
2

En general, utilizo vistas para hacer la vida más fácil, obtengo detalles extendidos de alguna entidad que se almacena en varias tablas (elimina muchas uniones en el código para mejorar la legibilidad) y, a veces, para compartir datos en múltiples bases de datos o incluso para hacer que las inserciones sean más fáciles de leer.

Kris
fuente
2

Aquí se explica cómo usar una Vista junto con permisos para limitar las columnas que un usuario puede actualizar en la tabla.

/* This creates the view, limiting user to only 2 columns from MyTestTable */
CREATE VIEW dbo.myTESTview 
WITH SCHEMABINDING AS
SELECT ID, Quantity FROM dbo.MyTestTable;

/* This uses the view to execute an update on the table MyTestTable */
UPDATE dbo.myTESTview
SET Quantity = 7
WHERE ID = 1
SQL Dave Florida
fuente
1

Cuando quiero ver una instantánea de una (s) tabla (s), y / o ver (en forma de solo lectura)

vehomzzz
fuente
1
¿Qué quieres decir con una "instantánea de una mesa"? ¿Cuándo o por qué quieres hacer eso?
MedicineMan
Hay muchos escenarios; digamos que desea ejecutar una consulta compleja / procedimiento de almacenamiento en una tabla sin afectar y subrayar la tabla. Usted crea una vista (una representación de solo lectura)
vehomzzz
entonces, si desea ejecutar un procedimiento complejo de almacenamiento de consultas, ¿no podría acceder a la vista de solo lectura? Realmente no tengo la experiencia de la base de datos para 'obtener' de lo que estás hablando aquí. ¿Podría elaborar o proporcionar un ejemplo detallado?
MedicineMan
1

Me gusta usar vistas sobre procedimientos almacenados cuando solo estoy ejecutando una consulta. Las vistas también pueden simplificar la seguridad, se pueden usar para facilitar las inserciones / actualizaciones en varias tablas y se pueden usar para capturar / materializar datos (ejecutar una consulta de larga duración y mantener los resultados en caché).

He utilizado vistas materializadas para ejecutar consultas de anhelo que no es necesario que se mantengan precisas en tiempo real.

MattH
fuente
cuando está ejecutando una consulta en lugar de? ¿Por qué? Este punto no tiene sentido
MedicineMan
cuando usa una vista, sabe que solo está realizando una operación DML, cuando llama a un SP no sabe qué más puede suceder antes de obtener sus datos. Es decir, si llama a una función de caché, puede devolver el conjunto de datos en caché, pero eso no significa que deba llamar al SP todo lo que desee. Simplifica la API a los datos IMO
MattH
1

Las vistas también dividen la configuración y las tablas muy complejas en fragmentos manejables que se pueden consultar fácilmente. En nuestra base de datos, todo nuestro sistema de gestión de tablas se divide en vistas desde una tabla grande.

Jim
fuente
1

Esto no responde a su pregunta exactamente, pero pensé que valdría la pena mencionar las Vistas materializadas . Mi experiencia es principalmente con Oracle, pero supuestamente SQL-Server es bastante similar.

Utilizamos algo similar en nuestra arquitectura para abordar los problemas de rendimiento de XML. Nuestros sistemas están diseñados con una gran cantidad de datos almacenados como XML en una fila y las aplicaciones pueden necesitar consultar valores particulares dentro de él. El manejo de muchos tipos de XML y la ejecución de XPaths en un gran número de filas tiene un gran impacto en el rendimiento, por lo que utilizamos una forma de vistas materializadas para extraer los nodos XML deseados en una tabla relacional cada vez que cambia la tabla base. Esto efectivamente proporciona una instantánea física de la consulta en un punto en el tiempo en lugar de vistas estándar que ejecutarían su consulta a pedido.

Chris Cameron-Mills
fuente
1

Veo un procedimiento almacenado más como un método que puedo invocar contra mis datos, mientras que para mí una vista proporciona un mecanismo para crear una versión sintética de los datos base contra la cual se pueden crear consultas o procedimientos almacenados. Crearé una vista cuando la simplificación o la agregación tengan sentido. Escribiré un procedimiento almacenado cuando quiera proporcionar un servicio muy específico.

jacor
fuente
Puede dar ejemplos de pequeños servicios
medicineman
1

Una cosa curiosa sobre las vistas es que Microsoft Access las ve como tablas: cuando adjunta un front-end de Microsoft Access a una base de datos SQL usando ODBC, ve las tablas y las vistas en la lista de tablas disponibles. Entonces, si está preparando informes complicados en MS Access, puede dejar que el servidor SQL se una y realice consultas, y simplifique enormemente su vida. Lo mismo para preparar una consulta en MS Excel.


fuente
1

Solo tengo aproximadamente 10 vistas en mis bases de datos de producción. Yo uso varios para las columnas que uso todo el tiempo. Un conjunto que uso proviene de 7 tablas, algunas con uniones externas y en lugar de reescribir que constantemente solo tengo que llamar a esa vista en una selección y hacer una o 2 uniones. Para mí es solo un ahorro de tiempo.

Brian Spencer
fuente
perdóname si esto está fuera del alcance de la pregunta, pero varias personas han mencionado esto: ¿no incurres en algún tipo de penalización de rendimiento por hacer esto?
MedicineMan
De ningún modo. El optimizador de SQL Server muestra exactamente el mismo plan para seleccionar * de la vista que para las uniones SQL equivalentes a la vista
Brian Spencer
1

Estoy creando xxx que asigna todas las relaciones entre una tabla principal (como la tabla de Productos) y las tablas de referencia (como ProductType o ProductDescriptionByLanguage). Esto creará una vista que me permitirá recuperar un producto y todos sus detalles traducidos de sus claves externas a su descripción. Entonces puedo usar un ORM para crear objetos para construir fácilmente cuadrículas, cuadros combinados, etc.

GRGodoi
fuente
0

Piense en ello como refactorizando su esquema de base de datos.

Quillbreaker
fuente
0

Creo que primero. Para ocultar la complejidad de la consulta. Es muy apropiado para las vistas. Cómo cuando normalizamos las tablas de la base de datos aumenta. Ahora es muy difícil obtener datos cuando aumenta el número de tablas. Así que la mejor manera de manejarlo es seguir las vistas. Si me equivoco, corrígeme.

AshutoshG
fuente
Si lo buscas en Google, tendrías una información muy clara para esta pregunta.
Chella
0

Creamos una vista para limitar o restringir el acceso a todas las filas / columnas de una tabla. Si el propietario desea que solo se compartan filas / columnas específicas o limitadas, creará una vista con esas columnas.

Gyan Prakash
fuente
Esta es solo una de las razones por las que debería / podría usar una vista.
Alexander
0

Por seguridad: otorga a cada usuario permiso para acceder a la base de datos solo a través de un pequeño conjunto de vistas que contienen los datos específicos que el usuario o grupo de usuarios está autorizado a ver, lo que restringe el acceso del usuario a otros datos.

Simplicidad para las consultas y la estructura : una vista puede extraer datos de varias tablas y presentar una sola tabla, simplificando la información y convirtiendo las consultas de varias tablas en consultas de una sola tabla para una vista y brinda a los usuarios una vista específica de la estructura de la base de datos, presentando la base de datos como un conjunto de tablas virtuales específicas para usuarios particulares o grupos de usuarios.

Para crear una estructura de base de datos coherente : las vistas presentan una imagen coherente y sin cambios de la estructura de la base de datos, incluso si se cambian las tablas de origen subyacentes.

Shivam Mishra
fuente