Por que você cria uma exibição em um banco de dados?


267

Quando e por que alguém decide que precisa criar uma Visualização em seu banco de dados? Por que não apenas executar um procedimento armazenado normal ou selecionar?


Verifique minha resposta para uma pergunta semelhante, espero que ajude!
Loukan ElKadi

Respostas:


464

Uma visão fornece vários benefícios.

1. As visualizações podem ocultar a complexidade

Se você tiver uma consulta que exija a junção de várias tabelas ou tenha lógica ou cálculos complexos, poderá codificar toda essa lógica em uma visualização e selecionar a partir da visualização da mesma maneira que faria com uma tabela.

2. As visualizações podem ser usadas como um mecanismo de segurança

Uma visualização pode selecionar determinadas colunas e / ou linhas de uma tabela (ou tabelas) e as permissões definidas na visualização em vez das tabelas subjacentes. Isso permite exibir apenas os dados que um usuário precisa ver.

3. As visualizações podem simplificar o código legado de suporte

Se você precisar refatorar uma tabela que quebraria muito código, poderá substituí-la por uma exibição com o mesmo nome. A visualização fornece exatamente o mesmo esquema da tabela original, enquanto o esquema real foi alterado. Isso evita que o código legado que faz referência à tabela seja quebrado, permitindo que você altere o código legado à sua vontade.

Estes são apenas alguns dos muitos exemplos de como as visualizações podem ser úteis.


84
o item 3 é uma razão que ninguém mais parece ter apontou ainda
curandeiro

2
Penso que o ponto 3 é mais uma lacuna do que qualquer outra coisa. Eventualmente, quando você começar a atualizar o código herdado, não apenas precisará alterar o código por trás da visualização, mas também todo o código que foi criado sobre a visualização. Meu 2cents
04/09/09

3
3 É realmente a propriedade mais poderosa de visualizações. É isso que ajuda a fornecer independência de dados lógicos. O fato de que você pode fornecer uma interface para o banco de dados independente do banco de dados lógico subjacente é um conceito muito poderoso.
Falaina 6/10/09

1
@John esta dívida técnica incorrida deve ser paga mais cedo ou mais tarde não? Em 10 anos, pode não ser importante para o engenheiro que o escreveu há 10 anos, mas é importante para a empresa.
super9

Alterar o seu banco de dados principal e tudo o que depende dele é uma péssima escolha, pois você pode "precisar dele em 10 anos". A dívida técnica não deve ser evitada a todo custo, apenas se o custo esperado para corrigi-lo mais tarde for mais do que o custo definido de corrigi-lo agora.
Mr. Boy

88

Entre outras coisas, pode ser usado para segurança. Se você possui uma tabela "customer", convém dar a todos os seus vendedores acesso aos campos de nome, endereço, CEP etc., mas não credit_card_number. Você pode criar uma exibição que inclua apenas as colunas às quais precisam acessar e conceder acesso à exibição.


interessante. A segurança é uma boa resposta. Que outras coisas você tem em mente?
curandeiro

13
Eu assumi que as outras respostas a essa pergunta descreveriam as "outras coisas". :-)
Graeme Perrow

Select name, address, zipcode from customernão serviria ao propósito em vez de creating a view?
PPB

@PranavBilurkar Sim, se você controlar completamente as consultas que os usuários executam. Se os usuários puderem executar suas próprias consultas (por meio de algum programa SQL interativo ou escrever seus próprios scripts), eles poderão executar o select * from customerque lhes dará acesso a tudo. Se você lhes der acesso à visualização e não à tabela, eles não poderão acessar os campos que não estão na visualização.
Graeme Perrow

38

Uma visão é um encapsulamento de uma consulta. As consultas que são transformadas em visualizações tendem a ser complicadas e, portanto, salvá-las como uma visualização para reutilização pode ser vantajosa.


Então, você deseja criar uma exibição quando tiver uma consulta complicada? Quão complicada é uma consulta, qual é o limite? O que você ganha com a visualização?
MedicineMan

4
Quão complicada é realmente uma escolha pessoal, não há limite definido. Você usaria uma visualização frequentemente, se não quiser duplicar a lógica em vários aplicativos ou em pontos diferentes no seu aplicativo, por exemplo. Ao fazer isso, você esconde essa lógica e pode compartilhá-la facilmente.
31410 Chris Cameron-Mills

1
você não pode fazer o mesmo com um procedimento armazenado que tem um select? pensei incorretamente nos procedimentos armazenados como uma maneira de armazenar lógica de consulta complexa? consultas complexas devem ser feitas em modos de exibição em vez de procedimentos armazenados? Qual é a vantagem de um procedimento armazenado aqui?
curandeiro

2
@MedicineMan - Um procedimento armazenado retorna um conjunto de resultados, enquanto uma exibição representa uma tabela virtual que permite usar como tabela em outras consultas.
Andrew Hare

1
Acho que esse ponto sobre conjunto de resultados versus tabela virtual parece ser um ponto-chave que eu não entendi.
curandeiro

28

Normalmente, crio visualizações para desnormalizar e / ou agregar dados frequentemente usados ​​para fins de relatório.

EDITAR

Por meio de elaboração, se eu tivesse um banco de dados no qual algumas das entidades fossem pessoa, empresa, função, tipo de proprietário, pedido, detalhes do pedido, endereço e telefone, onde a tabela de pessoas armazenava funcionários e contatos e o endereço e endereço de e-mail. tabelas de telefone armazenavam números de telefone para pessoas e empresas, e a equipe de desenvolvimento recebia a tarefa de gerar relatórios (ou tornar os dados de relatórios acessíveis a não desenvolvedores), como vendas por funcionário, vendas por cliente ou vendas por região, vendas por mês , clientes por estado, etc. Eu criaria um conjunto de visualizações que normalizariam os relacionamentos entre as entidades do banco de dados, para que uma visão mais integrada (sem trocadilhos) das entidades do mundo real estivesse disponível. Alguns dos benefícios podem incluir:

  1. Reduzindo a redundância ao escrever consultas
  2. Estabelecendo um padrão para entidades relacionadas
  3. Proporcionar oportunidades para avaliar e maximizar o desempenho de cálculos e junções complexos (por exemplo, indexação em visualizações Schemabound no MSSQL)
  4. Tornar os dados mais acessíveis e intuitivos para membros da equipe e não desenvolvedores.

1
Você pode elaborar sobre isso? Sua resposta está sendo votado até um pouco, mas eu não estou recebendo o valor que todo mundo parece
curandeiro

11

Várias razões: se você tem junções complicadas, às vezes é melhor ter uma visualização para que qualquer acesso sempre tenha as junções corretas e os desenvolvedores não precisem se lembrar de todas as tabelas de que precisam. Normalmente, isso pode ser para um aplicativo financeiro em que seria extremamente importante que todos os relatórios financeiros fossem baseados no mesmo conjunto de dados.

Se você possui usuários que deseja limitar os registros que eles podem ver, use uma visualização, conceda-lhes acesso apenas à visualização e não às tabelas subjacentes e, em seguida, consulte a visualização

Os relatórios Crystal parecem preferir usar visualizações em procs armazenados, portanto, as pessoas que escrevem muito relatórios tendem a usar muitas visualizações

As visualizações também são muito úteis ao refatorar bancos de dados. Muitas vezes, você pode ocultar a alteração para que o código antigo não a veja criando uma exibição. Leia os bancos de dados de refatoração para ver como isso funciona, pois é uma maneira muito poderosa de refatorar.


7

A principal vantagem de uma visão sobre um procedimento armazenado é que você pode usar uma visão da mesma maneira que uma tabela. Ou seja, uma visão pode ser referida diretamente na FROMcláusula de uma consulta. Por exemplo SELECT * FROM dbo.name_of_view,.

Em praticamente todas as outras formas, os procedimentos armazenados são mais poderosos. Você pode passar parâmetros, incluindo outparâmetros que permitem que você efetivamente para retornar vários valores de uma vez, você pode fazer SELECT, INSERT, UPDATE, e DELETEoperações, etc. etc.

Se você deseja que a View possa consultar a partir da FROMcláusula, mas também deseja passar parâmetros, há uma maneira de fazer isso também. Isso é chamado de função com valor de tabela.

Aqui está um artigo bastante útil sobre o tópico:

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

EDIT: A propósito, isso meio que levanta a questão: que vantagem uma visão tem sobre uma função com valor de tabela? Não tenho uma resposta muito boa para isso, mas observarei que a sintaxe T-SQL para criar uma exibição é mais simples que para uma função com valor de tabela, e os usuários do seu banco de dados podem estar mais familiarizados com as exibições.


+1 por ser uma das poucas respostas para resolver o problema dos procedimentos armazenados nas instruções SELECT. Você está certo em levantar a questão das funções da tabela. Basicamente, é provável que a exibição tenha um desempenho melhor que as funções, porque eles compartilham o mesmo mecanismo. Há uma sobrecarga (pelo menos no Oracle) a ser paga ao alternar do SQL para o SQL trabsacional (ou seja, PL / SQL). Mas todas as outras coisas - segurança, encapsulamento etc. - se aplicam igualmente a procedimentos ou funções e a visualizações.
14/08/09 da APC

Dependendo da estrutura da visualização, algumas visualizações podem ser indexadas. Essa é uma grande melhoria em relação às funções com valor de tabela.
HLGEM

6

Pode funcionar como um bom "intermediário" entre seu ORM e suas tabelas.

Exemplo:

Tínhamos uma tabela Person que precisávamos alterar a estrutura nela, para que a coluna SomeColumn fosse movida para outra tabela e tivesse um relacionamento de um para muitos.

No entanto, a maioria do sistema, no que diz respeito à Pessoa, ainda usava o SomeColumn como uma única coisa, não muitas coisas. Usamos uma view para reunir todas as SomeColumns e colocá-las na view, que funcionou bem.

Isso funcionou porque a camada de dados havia mudado, mas o requisito de negócios não havia mudado fundamentalmente; portanto, os objetos de negócios não precisavam mudar. Se os objetos de negócios precisassem mudar, não acho que essa seria uma solução viável, mas as visualizações definitivamente funcionam como um bom ponto intermediário.


1
interessante. No seu caso, é quase como uma interface para as tabelas.
curandeiro

5

Para se concentrar em visualizações de dados específicas, os usuários podem se concentrar em dados específicos que lhes interessam e nas tarefas específicas pelas quais são responsáveis. Dados desnecessários podem ser deixados de fora da visualização. Isso também aumenta a segurança dos dados porque os usuários podem ver apenas os dados definidos na exibição e não os dados na tabela subjacente. Para obter mais informações sobre o uso de modos de exibição para fins de segurança, consulte Usando modos de exibição como mecanismos de segurança.

Para simplificar a manipulação de dados As visualizações podem simplificar como os usuários manipulam dados. Você pode definir junções, projeções, consultas UNION e consultas SELECT usadas como visualizações, para que os usuários não precisem especificar todas as condições e qualificações cada vez que uma operação adicional for executada nesses dados. Por exemplo, uma consulta complexa usada para fins de relatório e executa subconsultas, junções externas e agregação para recuperar dados de um grupo de tabelas pode ser criada como uma exibição. A visualização simplifica o acesso aos dados porque a consulta subjacente não precisa ser gravada ou enviada toda vez que o relatório é gerado; a visualização é consultada. Para mais informações sobre como manipular dados.

Você também pode criar funções definidas pelo usuário em linha que operam logicamente como visualizações parametrizadas ou visualizações que possuem parâmetros nas condições de pesquisa da cláusula WHERE. Para obter mais informações, consulte Funções definidas pelo usuário em linha.

Para personalizar as visualizações de dados, permite que usuários diferentes vejam dados de maneiras diferentes, mesmo quando estão usando os mesmos dados simultaneamente. Isso é particularmente vantajoso quando usuários com muitos interesses e níveis de habilidade diferentes compartilham o mesmo banco de dados. Por exemplo, pode ser criada uma exibição que recupera apenas os dados dos clientes com os quais um gerente de contas lida. A visualização pode determinar quais dados recuperar com base no ID de login do gerente de conta que usa a visualização.

Para exportar e importar dados As visualizações podem ser usadas para exportar dados para outros aplicativos. Por exemplo, convém usar as lojas e as tabelas de vendas no banco de dados de pubs para analisar dados de vendas usando o Microsoft® Excel. Para fazer isso, você pode criar uma exibição com base nas lojas e nas tabelas de vendas. Você pode usar o utilitário bcp para exportar os dados definidos pela exibição. Os dados também podem ser importados para determinadas visualizações de arquivos de dados usando o utilitário bcp ou a instrução BULK INSERT, desde que as linhas possam ser inseridas na visualização usando a instrução INSERT. Para obter mais informações sobre as restrições para copiar dados em visualizações, consulte INSERIR. Para obter mais informações sobre como usar o utilitário bcp e a instrução BULK INSERT para copiar dados de e para uma exibição, consulte Copiando para ou de uma exibição.

Para combinar dados particionados O operador do conjunto Transact-SQL UNION pode ser usado em uma exibição para combinar os resultados de duas ou mais consultas de tabelas separadas em um único conjunto de resultados. Isso aparece para o usuário como uma única tabela chamada visualização particionada. Por exemplo, se uma tabela contiver dados de vendas para Washington e outra tabela contiver dados de vendas para a Califórnia, uma exibição poderá ser criada a partir do UNION dessas tabelas. A exibição representa os dados de vendas para as duas regiões. Para usar visualizações particionadas, você cria várias tabelas idênticas, especificando uma restrição para determinar o intervalo de dados que podem ser adicionados a cada tabela. A visualização é criada usando essas tabelas base. Quando a exibição é consultada, o SQL Server determina automaticamente quais tabelas são afetadas pela consulta e faz referência apenas a essas tabelas. Por exemplo, se uma consulta especificar que apenas dados de vendas para o estado de Washington são necessários, o SQL Server lerá apenas a tabela que contém os dados de vendas de Washington; nenhuma outra tabela é acessada.

As visualizações particionadas podem se basear em dados de várias fontes heterogêneas, como servidores remotos, não apenas em tabelas no mesmo banco de dados. Por exemplo, para combinar dados de diferentes servidores remotos, cada um dos quais armazena dados para uma região diferente da sua organização, você pode criar consultas distribuídas que recuperam dados de cada fonte de dados e, em seguida, criar uma exibição com base nessas consultas distribuídas. Qualquer consulta lê apenas dados das tabelas nos servidores remotos que contêm os dados solicitados pela consulta; os outros servidores referenciados pelas consultas distribuídas na visualização não são acessados.

Quando você particiona dados em várias tabelas ou vários servidores, as consultas que acessam apenas uma fração dos dados podem ser executadas mais rapidamente porque há menos dados a serem verificados. Se as tabelas estiverem localizadas em servidores diferentes ou em um computador com vários processadores, cada tabela envolvida na consulta também poderá ser verificada em paralelo, melhorando assim o desempenho da consulta. Além disso, tarefas de manutenção, como reconstruir índices ou fazer backup de uma tabela, podem ser executadas mais rapidamente. Usando uma exibição particionada, os dados ainda aparecem como uma única tabela e podem ser consultados como tal sem ter que fazer referência manual à tabela subjacente correta.

As visualizações particionadas são atualizáveis ​​se uma dessas condições for atendida: Um gatilho INSTEAD OF é definido na visualização com lógica para suportar instruções INSERT, UPDATE e DELETE.

A visualização e as instruções INSERT, UPDATE e DELETE seguem as regras definidas para visualizações particionadas atualizáveis. Para mais informações, consulte Criando uma vista particionada.

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


5

Aqui estão dois motivos comuns:

Você pode usá-lo para segurança. Não conceda permissões na tabela principal e crie visualizações que limitam o acesso a colunas ou linhas e conceda permissões aos usuários para ver a visualização.

Você pode usá-lo por conveniência. Junte algumas tabelas que você usa o tempo todo na exibição. Isso pode tornar as consultas consistentes e fáceis.


3

Há mais de um motivo para fazer isso. Às vezes, facilita consultas de junção comuns, pois é possível consultar um nome de tabela em vez de fazer todas as junções.

Outro motivo é limitar os dados a diferentes usuários. Então, por exemplo:

Tabela1: Colunas - USER_ID; USERNAME; SSN

Os usuários administradores podem ter privs na tabela real, mas os usuários que você não deseja ter acesso para dizer o SSN, criam uma visualização como

CREATE VIEW USERNAMES AS SELECT user_id, nome de usuário FROM Tabela1;

Em seguida, dê a eles privs para acessar a vista e não a mesa.


2

As visualizações podem ser uma dádiva de Deus ao gerar relatórios em bancos de dados herdados. Em particular, você pode usar nomes de tabelas sensuais em vez de nomes de 5 letras enigmáticas (onde 2 deles são um prefixo comum!) Ou nomes de colunas cheios de abreviações que, com certeza, faziam sentido na época.


2

Geralmente, eu exibo visualizações para facilitar a vida, obter detalhes estendidos de alguma entidade armazenada em várias tabelas (eliminar muitas junções no código para melhorar a legibilidade) e às vezes compartilhar dados em vários bancos de dados ou até facilitar a leitura das inserções.


2

Aqui está como usar um modo de exibição junto com permissões para limitar as colunas que um usuário pode atualizar na tabela.

/* 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

1

Quando quero ver um instantâneo de uma (s) tabela (s) e / ou exibir (de maneira somente leitura)


1
o que você quer dizer com 'instantâneo de uma tabela'? Quando ou por que você quer fazer isso?
curandeiro

Existem muitos cenários; digamos que você deseja executar uma consulta / precedência de loja complexa em uma tabela sem afetar e sublinhar a tabela. Você cria uma visão (a representação de somente leitura)
vehomzzz

portanto, se você deseja executar um procedimento complexo de armazenamento de consultas, não pode acessar a exibição apenas como leitura? Eu realmente não tenho a experiência do banco de dados para 'entender' o que você está falando aqui. Você poderia elaborar ou fornecer um exemplo detalhado?
curandeiro

1

Eu gosto de usar modos de exibição sobre procedimentos armazenados quando estou executando apenas uma consulta. As visualizações também podem simplificar a segurança, podem ser usadas para facilitar inserções / atualizações em várias tabelas e podem ser usadas para capturar instantâneos / materializar dados (executar uma consulta demorada e manter os resultados em cache).

Usei visualizações materializadas para consultas de execução que não precisam ser mantidas precisas em tempo real.


quando você está executando uma consulta em oposição a? Por quê? Este ponto não muito sentido
curandeiro

quando você usa uma visualização, sabe que só realiza uma operação DML; quando liga para um SP, não faz o que mais talvez esteja acontecendo antes de obter seus dados. Ou seja, chamar uma função de cache, pode retornar o conjunto de dados em cache, mas isso não significa que você deve chamar o SP como quiser. Ele simplifica a API para os dados IMO
Matth

1

As visualizações também dividem configurações e tabelas muito complexas em partes gerenciáveis ​​que são facilmente consultadas. Em nosso banco de dados, todo o nosso sistema de gerenciamento de tabelas é dividido em visualizações de uma tabela grande.


1

Isso não responde exatamente à sua pergunta, mas achei que valeria a pena mencionar as Visualizações materializadas . Minha experiência é principalmente com Oracle, mas supostamente o SQL-Server é bastante semelhante.

Usamos algo semelhante em nossa arquitetura para resolver problemas de desempenho XML. Nossos sistemas são projetados com muitos dados armazenados como XML em uma linha e os aplicativos podem precisar consultar valores específicos dentro dele. O manuseio de muitos XMLTypes e a execução de XPaths em um grande número de linhas tem um grande impacto no desempenho. Por isso, usamos uma forma de visualizações materializadas para extrair os nós XML desejados em uma tabela relacional sempre que a tabela base for alterada. Isso efetivamente fornece um instantâneo físico da consulta em um determinado momento, em oposição às visualizações padrão que executariam sua consulta sob demanda.


1

Eu vejo um procedimento armazenado mais como um método que eu posso chamar contra meus dados, enquanto para mim uma exibição fornece um mecanismo para criar uma versão sintética dos dados de base nos quais consultas ou procedimentos armazenados podem ser criados. Vou criar uma visão quando simplificação ou agregação fizer sentido. Escreverei um procedimento armazenado quando desejar fornecer um serviço muito específico.


você pode dar exemplos de pequenos serviços
curandeiro

1

Um aspecto curioso das exibições é que elas são vistas pelo Microsoft Access como tabelas: quando você anexa um front-end do Microsoft Access a um banco de dados SQL usando ODBC, vê as tabelas e exibições na lista de tabelas disponíveis. Portanto, se você estiver preparando relatórios complicados no MS Access, poderá permitir que o servidor SQL faça a junção e a consulta e simplifique bastante sua vida. O mesmo vale para preparar uma consulta no MS Excel.


1

Eu tenho apenas 10 visualizações nos meus bancos de dados de produção. Eu uso vários para colunas que uso o tempo todo. Um conjunto que eu uso vem de 7 tabelas, algumas com junções externas e, em vez de reescrever, constantemente eu só preciso chamar essa visualização em um select e fazer uma ou duas junções. Para mim, é apenas uma economia de tempo.


me perdoe se isso estiver fora do escopo da pergunta, mas várias pessoas mencionaram isso - você não incorre em algum tipo de penalidade de desempenho por fazer isso?
curandeiro

De modo nenhum. SQL Server otimizador de mostrar o mesmo plano exato para selecionar * da vista como faz para o SQL junta equivalente à vista
Brian Spencer

1

Estou criando xxx que mapeia todos os relacionamentos entre uma tabela principal (como tabela de produtos) e tabelas de referência (como ProductType ou ProductDescriptionByLanguage). Isso criará uma visão que me permitirá recuperar um produto e todos os seus detalhes traduzidos de suas chaves estrangeiras para sua descrição. Então eu posso usar um ORM para criar objetos para criar grades, caixas de combinação etc.



0

Acho que primeiro. Para ocultar a complexidade do Query. É muito apropriado para visualizações. Como quando normalizamos o aumento das tabelas de banco de dados. Agora, a busca de dados é muito difícil quando o número de tabelas aumenta. Portanto, a melhor maneira de lidar com isso é seguir as visualizações.


Se você pesquisá-lo no Google, você teria informações muito claras para esta pergunta.
Chella

0

Criamos a visualização para limitar ou restringir o acesso a todas as linhas / colunas em uma tabela. Se o proprietário desejar que apenas linhas / colunas específicas ou limitadas precisem ser compartilhadas, ele criará uma visualização com essas colunas.


Essa é apenas uma das razões pelas quais você deve / pode usar uma exibição.
Alexander

0

Por segurança: concede a cada usuário permissão para acessar o banco de dados apenas por meio de um pequeno conjunto de visualizações que contêm os dados específicos que o usuário ou grupo de usuários está autorizado a ver, restringindo o acesso do usuário a outros dados.

Simplicidade para consultas e estrutura : uma visualização pode extrair dados de várias tabelas e apresentar uma única tabela, simplificando as informações e transformando consultas de várias tabelas em consultas de tabela única para uma visualização, além de fornecer aos usuários uma visão específica da estrutura do banco de dados, apresentando o banco de dados como um conjunto de tabelas virtuais específicas para usuários ou grupos de usuários específicos.

Para criar uma estrutura consistente do banco de dados : As exibições apresentam uma imagem consistente e inalterada da estrutura do banco de dados, mesmo se as tabelas de origem subjacentes forem alteradas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.