Para que servem as visualizações?

87

Estou apenas tentando ter uma ideia geral de como as visualizações são usadas nos RDBMSs. Quer dizer, eu sei o que é uma vista e como fazer uma. Também sei para que os usei no passado.

Mas eu quero ter certeza de que tenho um entendimento completo de para que uma visão é útil e para que não deve ser útil. Mais especificamente:

  1. Para que serve uma visualização?
    • Existem situações em que é tentador usar uma visualização quando você não deveria usá-la?
    • Por que você usaria uma visão em vez de algo como uma função com valor de tabela ou vice-versa?
    • Existem circunstâncias em que uma exibição pode ser útil que não são aparentes à primeira vista?

(E para que fique registrado, algumas dessas perguntas são intencionalmente ingênuas. Isso é em parte uma verificação de conceito.)

Jason Baker
fonte
1
semelhante à pergunta postada aqui: stackoverflow.com/questions/1278521/…
MedicineMan
Acho que stackoverflow.com/questions/1278521/… fornece melhores respostas para essa pergunta.
GinTonic

Respostas:

42

1) Para que serve uma visualização?

IOPO em um só lugar

• Quer você considere os próprios dados ou as consultas que fazem referência às tabelas unidas, a utilização de uma visualização evita redundância desnecessária.

• As visualizações também fornecem uma camada de abstração que impede o acesso direto às tabelas (e a algema resultante que faz referência às dependências físicas). Na verdade, acho que é uma boa prática 1 oferecer apenas acesso abstrato aos dados subjacentes (usando visualizações e funções com valor de tabela), incluindo visualizações como 1

CREATE VIEW AS
      SELECT * FROM tblData


Eu devo admitir que há uma boa dose de "Faça o que eu digo; não como eu faça "nesse conselho;)

2) Existem situações em que é tentador usar uma visualização quando você não deveria usá-la?

O desempenho nas junções de exibição costumava ser uma preocupação (por exemplo, SQL 2000). Não sou especialista, mas não me preocupo com isso há algum tempo. (Também não consigo pensar em onde estou usando junções de visualização).

Outra situação em que uma visualização pode ser um exagero é quando ela é referenciada apenas a partir de um local de chamada e uma tabela derivada pode ser usada em seu lugar. Assim como um tipo anônimo é preferível a uma classe em .NET se o tipo anônimo for usado / referenciado apenas uma vez.

    • Consulte a descrição da tabela derivada em http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Por que você usaria uma visão em vez de algo como uma função com valor de tabela ou vice-versa?

(Além de motivos de desempenho) Uma função com valor de tabela é funcionalmente equivalente a uma visualização parametrizada. Na verdade, um caso de uso comum de função com valor de tabela simples é simplesmente adicionar um filtro de cláusula WHERE a uma visão já existente em um único objeto.

4) Existem circunstâncias em que uma exibição pode ser útil que não são aparentes à primeira vista?

Não consigo pensar em nenhum uso não aparente do topo da minha cabeça. (Suponho que se pudesse, isso os tornaria aparentes;)
6eorge Jetson
fonte
9
Eu não concordaria que faz sentido criar uma visão em uma tabela quando é um SELECT * FROM tblData. Você pode explicar por que isso seria benéfico?
Usuário registrado em
IOPO - In One Place Only - Esta é uma frase de design bem conhecida? Não consigo encontrar muitas referências a ele? Possui outras formas, por exemplo, SECO?
Robert
1
@Robert Sim, DRY, normalização, IOPO, todos esses são sabores diferentes da mesma filosofia.
TylerH
45

De certa forma, uma visualização é como uma interface. Você pode alterar a estrutura da tabela subjacente o quanto quiser, mas a visão fornece uma maneira para que o código não precise ser alterado.

As visualizações são uma boa maneira de fornecer algo simples para os redatores de relatórios. Se seus usuários de negócios desejam acessar os dados de algo como Crystal Reports, você pode dar a eles algumas visualizações em suas contas que simplificam os dados - talvez até desnormalizem para eles.

Lou franco
fonte
21

As visualizações podem ser usadas para fornecer segurança (ou seja: os usuários podem ter acesso a visualizações que acessam apenas certas colunas em uma tabela), as visualizações podem fornecer segurança adicional para atualizações, inserções, etc. As visualizações também fornecem uma maneira de nomes de colunas de alias (como fazem sp's), mas as visualizações são mais um isolamento da tabela real.

schmoopy
fonte
18

Em certo sentido, as visualizações desnormalizam-se. A desnormalização às vezes é necessária para fornecer dados de uma maneira mais significativa. Isso é o que muitos aplicativos fazem por meio da modelagem de domínio em seus objetos. Eles ajudam a apresentar os dados de uma forma que corresponda mais de perto à perspectiva de uma empresa.

Kilhoffer
fonte
-1 "views denormalize"? desculpe, mas isso é um absurdo, a menos que seja qualificado de alguma forma.
apenas alguém
18
Eles absolutamente desnormalizam. Se você tiver tabelas relacionadas que são normalizadas para a terceira forma nomral e criar uma visualização para 'nivelar' essa relação, como isso não é desnormalização?
Kilhoffer
11

Além do que os outros declararam, as visualizações também podem ser úteis para remover consultas SQL mais complicadas do aplicativo.

Por exemplo, em vez de em um aplicativo fazendo:

sql = "selecione a, b da tabela1 união selecione a, b da tabela2";

Você poderia abstrair isso para uma visualização:

criar visão union_table1_table2_v como
selecionar a, b da tabela1
union
selecionar a, b da tabela2

e no código do aplicativo, basta ter:

sql = "selecione a, b de union_table1_table2_v";

Além disso, se as estruturas de dados mudarem, você não terá que alterar o código do aplicativo, recompilar e reimplantar. você apenas mudaria a visualização no banco de dados.

CodingWithSpike
fonte
Por que eu quero escrever sql complexo no banco de dados em vez de no aplicativo?
Ivan Virabyan
3
Quanto mais complicada for a sua consulta, maior a probabilidade de ela mudar no futuro, em parte devido ao fato de apenas atingir mais tabelas. Quando as estruturas do banco de dados mudam, você também precisa mudar seu código e fazer uma liberação. Se essa complexidade for abstraída em uma visualização, o DBA pode ser capaz de fazer alterações estruturais nas tabelas subjacentes sem que seu código precise ser alterado.
CodingWithSpike
11

As visualizações ocultam a complexidade do banco de dados. Eles são ótimos por vários motivos e são úteis em muitas situações, mas se você tiver usuários que têm permissão para escrever suas próprias consultas e relatórios, você pode usá-los como uma proteção para se certificar de que não enviem mal planejados consultas com junções cartesianas desagradáveis ​​que derrubam seu servidor de banco de dados.

Gsarnold
fonte
6

O OP perguntou se havia situações em que poderia ser tentador usar uma visualização, mas não é apropriado.

O que você não deseja usar para uma visualização é um substituto para junções complexas. Ou seja, não deixe seu hábito de programação procedural de quebrar um problema em partes menores levá-lo a usar várias visualizações unidas em vez de uma união maior. Fazer isso acabará com a eficiência do mecanismo de banco de dados, pois ele basicamente faz várias consultas separadas, em vez de uma maior.

Por exemplo, digamos que você precise juntar as tabelas A, B, C e D. Você pode ficar tentado a fazer uma visualização das tabelas A e B e uma visualização das tabelas C e D e, em seguida, unir as duas visualizações. É muito melhor apenas juntar A, B, C e D em uma consulta.

Barry Brown
fonte
Não acho isso certo, pelo menos não é assim que funciona a teoria do DBMS (várias implementações podem decidir não honrar a teoria). O analisador de consulta irá essencialmente substituir quaisquer visualizações que ele vê com o sql correspondente, e o otimizador partirá daí. Os 2 casos devem ser equivalentes.
SquareCog
Isso também não é verdade quando você pode adicionar índices às suas visualizações.
therealhoff de
Estou mais familiarizado com o PostgreSQL e as versões anteriores não eram muito boas em combinar consultas. Mas os mais novos são muito melhores. Minha resposta não se aplica mais tanto, pelo menos para este DBMS em particular.
Barry Brown
5

As visualizações podem centralizar ou consolidar dados. Onde estou, temos vários bancos de dados diferentes em alguns servidores vinculados diferentes. Cada banco de dados contém dados para um aplicativo diferente. Alguns desses bancos de dados contêm informações que são relevantes para vários aplicativos diferentes. O que faremos nessas circunstâncias é criar uma visualização no banco de dados desse aplicativo que apenas extraia dados do banco de dados onde os dados estão realmente armazenados, de forma que as consultas que escrevemos não pareçam estar passando por bancos de dados diferentes.

Joel Coehoorn
fonte
4

As respostas até agora estão corretas - as visualizações são boas para fornecer segurança, desnormalização (embora haja muita dor nesse caminho se for feito de maneira errada), abstração do modelo de dados, etc.

Além disso, as visualizações são comumente usadas para implementar a lógica de negócios (um usuário prescrito é aquele que não efetuou login nos últimos 40 dias, esse tipo de coisa).

SquareCog
fonte
se você desnormalizar adicionando 7 tabelas de referência e, em seguida, consultar algo que só precisa de uma dessas tabelas de referência. Isso é muito esforço desperdiçado. Isso fica pior se você começar a aderir a essas visualizações.
SquareCog
Você tem certeza disso? MSDN diz: 'Quando o SQL Server processa consultas que se referem às visualizações por nome, as definições das visualizações normalmente são expandidas até que se refiram apenas às tabelas base. Esse processo é chamado de expansão de visualização. É uma forma de expansão macro. ' Eu imagino que, durante o processo de expansão, o mecanismo seria inteligente o suficiente para incluir apenas as tabelas subjacentes (da visualização) que são necessárias para a consulta.
Anthony
Anthony, imagine uma consulta como "selecione foo_col de (selecione foo. *, Bar. * Da barra de junção de foo em (foo.id = bar.id)". Nesta consulta, a seleção interna é nossa visualização. Não é claro que a junção da barra pode ser descartada com segurança (na verdade, se a relação não for estritamente 1-1, não pode). Isso fica ainda mais complicado com consultas mais complexas, e eu não recomendaria confiar no RDBMS genérico para fazer todas as podar uma lata humana. Talvez o SQL Server consiga; eu ficaria chocado se o MySQL o fizesse. Oracle? Postgres? Como sempre, leia o plano de consulta em caso de dúvida.
SquareCog
3

As visualizações salvam muitas instruções JOIN complexas repetidas em seus scripts SQL. Você pode apenas encapsular algum JOIN complexo em alguma visão e chamá-lo em sua instrução SELECT sempre que necessário. Isso às vezes seria útil, direto e mais fácil do que escrever as instruções de junção em cada consulta.

Mohammedn
fonte
2

Uma visão é simplesmente uma instrução SELECT armazenada e denominada. Pense em visualizações como funções de biblioteca.

Gaius
fonte
Os stored procedures não seriam mais adequados para isso? Às vezes, você precisa de funções com visualizações de exclusões e atualizações que não seriam suficientes para essa necessidade. As visualizações devem ser vistas como abstrações ou formas de limitar o usuário-alvo.
HumbleWebDev
1

Eu queria destacar o uso de visualizações para relatórios. Freqüentemente, há um conflito entre normalizar as tabelas do banco de dados para acelerar o desempenho, especialmente para editar e inserir dados (usos OLTP), e desnormalizar para reduzir o número de junções de tabelas para consultas para relatórios e análises (usos OLAP). Por necessidade, o OLTP geralmente vence, porque a entrada de dados deve ter um desempenho ideal. A criação de visualizações, portanto, para um desempenho de relatório ideal, pode ajudar a satisfazer ambas as classes de usuários (entrada de dados e visualizadores de relatório).

DOK
fonte
1

Lembro-me de um SELECT muito longo que envolveu vários UNIONs. Cada UNION incluía uma junção a uma tabela de preços que foi criada instantaneamente por um SELECT que era bastante longo e difícil de entender. Acho que teria sido uma boa ideia ter uma vista assim para criar a tabela de preços. Isso teria encurtado o SELECT geral pela metade.

Não sei se o banco de dados avaliaria a visão uma vez, ou uma vez a cada vez que fosse invocado. Ninguem sabe? No primeiro caso, o uso de uma visualização melhoraria o desempenho.

SeaDrive
fonte
O Oracle CBO poderia escolher avaliar a visão uma vez (materializar, eles chamam) ou mesclar o SQL para a visão no restante da instrução select e executá-la. Ele decidiria com base no que tivesse o menor custo estimado.
WW.
Se a instrução select for constante em toda a consulta e simplesmente repetida várias vezes, uma expressão de tabela comum (CTE) pode resolver o problema. Isso se aplica apenas ao SQL Server 2005/2008, pois não estava disponível no SQL Server 2000. Sim, uma exibição ainda teria sido chamada repetidamente.
Usuário registrado em
@Registered User: CTEs não são uma especialidade do SQL Server. Têm origem no DB2 e também estão presentes no PostgreSQL (por serem úteis e no padrão ISO SQL). Se uma visualização é sequencial ou tratada como uma caixa preta é específica da implementação, alguns RDBMS são mais inteligentes do que outros.
apenas alguém
@apenas alguém: Meu comentário foi restrito ao SQL Server 2005/2008, pois não tenho experiência com CTEs em outros RBDMS. Além disso, o comentário foi qualificado para indicar que isso não se aplica ao SQL Server 2000, uma vez que os CTEs não estavam disponíveis no SQL Server antes de 2005.
Usuário registrado em
Outra alternativa para uma visão teria sido colocar a tabela de preços em uma tabela temporária de antemão.
SeaDrive
0

Sempre que você precisar de [my_interface]! = [User_interface].

Exemplo:

TABELA A:

  • Eu iria
  • informação

VER para a TABELA A:

  • Informação ao Cliente

esta é uma maneira de ocultar o id do cliente e renomear as informações para um nome mais prolixo ao mesmo tempo.

A visão usará o índice subjacente para a id da chave primária, então você não verá uma perda de desempenho, apenas uma melhor abstração da consulta selecionada.

HumbleWebDev
fonte