Quand et pourquoi quelqu'un décide-t-il qu'il est nécessaire de créer une vue dans sa base de données? Pourquoi ne pas simplement exécuter une procédure stockée normale ou sélectionner?
Une vue offre plusieurs avantages.
1. Les vues peuvent masquer la complexité
Si vous avez une requête qui nécessite la jonction de plusieurs tables ou une logique ou des calculs complexes, vous pouvez coder toute cette logique dans une vue, puis sélectionnez-la dans la vue comme vous le feriez pour une table.
2. Les vues peuvent être utilisées comme mécanisme de sécurité
Une vue peut sélectionner certaines colonnes et/ou lignes d'une table et définir des autorisations sur la vue plutôt que sur les tables sous-jacentes. Cela permet de ne parcourir que les données qu'un utilisateur doit voir.
3. Les vues peuvent simplifier la prise en charge du code hérité
Si vous avez besoin de refactoriser une table qui casserait beaucoup de code, vous pouvez la remplacer par une vue du même nom. La vue fournit exactement le même schéma que la table d'origine, alors que le schéma actuel a changé. Cela empêche le code hérité faisant référence à la table de se rompre, vous permettant de modifier le code hérité à votre guise.
Ce ne sont là que quelques-uns des nombreux exemples de l’utilité des vues.
Entre autres choses, il peut être utilisé pour la sécurité. Si vous avez une table "client", vous pouvez permettre à tous vos vendeurs d'accéder aux champs Nom, Adresse, Code postal, etc., mais pas à credit_card_number. Vous pouvez créer une vue n'incluant que les colonnes auxquelles ils ont besoin d'accéder, puis leur accorder l'accès sur la vue.
Une vue est une encapsulation d'une requête. Les requêtes qui sont transformées en vues ont tendance à être compliquées et, par conséquent, les enregistrer en tant que vues pour les réutiliser peut être avantageux.
Je crée généralement des vues pour dénormaliser et/ou regrouper des données fréquemment utilisées à des fins de reporting.
MODIFIER
En guise d’élaboration, si j’avais une base de données dans laquelle certaines des entités étaient une personne, une société, un rôle, un type de propriétaire, une commande, le détail de la commande, l’adresse et le téléphone, la table de les tables de téléphone ont stocké les numéros de téléphone des personnes et des entreprises, et l'équipe de développement a été chargée de générer des rapports (ou de rendre les données de rapport accessibles aux non-développeurs), tels que les ventes par employé, les ventes par client ou les ventes par région , clients par état, etc. Je créerais un ensemble de vues qui dé-normaliseraient les relations entre les entités de base de données afin de disposer d’une vue plus intégrée (sans jeu de mots) des entités du monde réel. Certains des avantages pourraient inclure:
Plusieurs raisons: Si vous avez des jointures complexes, il est parfois préférable d’avoir une vue pour que tout accès ait toujours les jointures correctes et que les développeurs n’aient pas à se souvenir de toutes les tables dont ils pourraient avoir besoin. En règle générale, il peut s’agir d’une application financière dans laquelle il est extrêmement important que tous les rapports financiers reposent sur le même ensemble de données.
Si vous souhaitez limiter le nombre d'enregistrements aux utilisateurs, vous pouvez utiliser une vue, leur donner accès uniquement à la vue, pas aux tables sous-jacentes, puis interroger la vue.
Les rapports Crystal semblent préférer utiliser des vues aux processus stockés, de sorte que les personnes qui rédigent beaucoup de rapports ont tendance à utiliser beaucoup de vues.
Les vues sont également très utiles lors du refactoring de bases de données. Vous pouvez souvent masquer le changement afin que l'ancien code ne le voit pas en créant une vue. Lisez les bases de données de refactoring pour voir comment cela fonctionne car c'est un moyen très puissant de refactoriser.
L'avantage majeur d'une vue sur une procédure stockée est que vous pouvez utiliser une vue de la même façon que vous utilisez une table. À savoir, une vue peut être référencée directement dans la clause FROM
d'une requête. Par exemple, SELECT * FROM dbo.name_of_view
.
À peu près toutes les autres façons, les procédures stockées sont plus puissantes. Vous pouvez passer des paramètres, y compris des paramètres out
qui vous permettent de renvoyer plusieurs valeurs simultanément, vous pouvez effectuer des opérations SELECT
, INSERT
, UPDATE
et DELETE
, etc.
Si vous souhaitez que la vue puisse interroger à partir de la clause FROM
, mais que vous souhaitiez également pouvoir transmettre des paramètres, vous pouvez également le faire. Cela s'appelle une fonction table.
Voici un article très utile sur le sujet:
EDIT: À propos, cela soulève la question de savoir quel avantage une vue a-t-elle sur une fonction table-value? Je n'ai pas vraiment de bonne réponse à cela, mais je noterai que la syntaxe T-SQL pour créer une vue est plus simple que pour une fonction table-value, et que les utilisateurs de votre base de données connaissent peut-être mieux les vues.
Il peut fonctionner comme un bon "intermédiaire" entre votre ORM et vos tables.
Exemple:
Nous avions une table Personne sur laquelle nous devions changer la structure afin que la colonne SomeColumn soit déplacée vers une autre table et ait un lien un à plusieurs.
Cependant, la majorité du système, en ce qui concerne la personne, utilisait toujours la SomeColumn comme une seule chose, pas beaucoup de choses. Nous avons utilisé une vue pour rassembler toutes les SomeColumns et les mettre dans la vue, ce qui a bien fonctionné.
Cela a fonctionné parce que la couche de données avait changé, mais que l'exigence métier n'avait pas fondamentalement changé, les objets métier n'avaient donc pas besoin de changer. Si les objets métier devaient changer, je ne pense pas que cela aurait été une solution viable, mais les vues fonctionnent certainement comme un bon point milieu.
Voici deux raisons courantes:
Vous pouvez l'utiliser pour la sécurité. N'accordez aucune autorisation sur la table principale et créez des vues limitant l'accès aux colonnes ou aux lignes, ainsi que des autorisations permettant aux utilisateurs de voir la vue.
Vous pouvez l'utiliser pour plus de commodité. Joignez ensemble des tables que vous utilisez ensemble tout le temps dans la vue. Cela peut rendre les requêtes cohérentes et plus faciles.
Il y a plus d'une raison pour faire cela. Parfois, facilite les requêtes de jointure communes car on peut simplement interroger un nom de table au lieu de faire toutes les jointures.
Une autre raison est de limiter les données à différents utilisateurs. Donc par exemple:
Table1: Colums - USER_ID; USERNAME; SSN
Les utilisateurs administrateurs peuvent avoir des privilèges sur la table, mais les utilisateurs auxquels vous ne voulez pas avoir accès pour dire le SSN, vous créez une vue comme
CREATE VIEW USERNAMES AS SELECT user_id, nom d'utilisateur FROM Table1;
Puis donnez-leur des privilèges pour accéder à la vue et non à la table.
En général, les vues simplifient la vie, obtiennent des détails étendus d'une entité stockée sur plusieurs tables (élimine de nombreuses jointures dans le code pour améliorer la lisibilité) et, parfois, partagent des données sur plusieurs bases de données ou même facilitent la lecture des insertions.
Voici comment utiliser une vue avec des autorisations pour limiter les colonnes qu'un utilisateur peut mettre à jour dans la table.
/* 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
Les vues peuvent être une aubaine lorsque vous rédigez des rapports sur des bases de données héritées. En particulier, vous pouvez utiliser des noms de table sensuels au lieu de noms cryptés de 5 lettres (où 2 d'entre eux sont un préfixe commun!), Ou de noms de colonnes remplis d'abréviations qui, à mon avis, avaient un sens.
Une chose curieuse à propos des vues est qu'elles sont vues par Microsoft Access sous forme de tables: lorsque vous attachez un serveur Microsoft Access à une base de données SQL à l'aide d'ODBC, vous voyez les tables et les vues dans la liste des tables disponibles. Ainsi, si vous préparez des rapports complexes dans MS Access, vous pouvez laisser le serveur SQL se charger de la jointure et de l'interrogation, ce qui simplifiera grandement votre vie. Idem pour préparer une requête dans MS Excel.
Je vois une procédure stockée plus comme une méthode que je peux appeler contre mes données, alors qu'une vue fournit un mécanisme pour créer une version synthétique des données de base à partir de laquelle des requêtes ou des procédures stockées peuvent être créées. Je crée une vue lorsque la simplification ou l'agrégation est logique. J'écrirai une procédure stockée lorsque je souhaite fournir un service très spécifique.
Je crée xxx qui mappe toutes les relations entre une table principale (telle que la table Products) et des tables de référence (telles que ProductType ou ProductDescriptionByLanguage). Cela créera une vue qui me permettra de récupérer un produit et tous ses détails seront traduits de ses clés étrangères à sa description. Ensuite, je peux utiliser un ORM pour créer des objets afin de créer facilement des grilles, des listes déroulantes, etc.
Quand je veux voir un instantané d'une ou plusieurs tables et/ou view (en lecture seule)
Cela ne répond pas exactement à votre question, mais j’ai pensé que cela valait la peine de mentionner Vues matérialisées. Mon expérience est principalement avec Oracle mais supposément, SQL-Server est assez similaire.
Nous avons utilisé quelque chose de similaire dans notre architecture pour résoudre les problèmes de performances XML. Nos systèmes sont conçus avec beaucoup de données stockées au format XML sur une ligne et les applications peuvent avoir besoin d'interroger des valeurs particulières à l'intérieur de celle-ci. La gestion de nombreux types XMLTypes et l'exécution de XPaths sur un grand nombre de lignes ayant un impact important sur les performances, nous utilisons une forme de vues matérialisées pour extraire les nœuds XML souhaités dans une table relationnelle chaque fois que la table de base change. Cela fournit efficacement un instantané physique de la requête à un moment donné, par opposition aux vues standard qui exécuteraient leur requête à la demande.
Je n'ai qu'une dizaine de vues dans mes bases de données de production. J'en utilise plusieurs pour les colonnes que j'utilise tout le temps. Un ensemble que j'utilise provient de 7 tables, certaines avec des jointures externes et plutôt que de réécrire, je n'ai à appeler que cette vue dans une sélection et à créer une ou deux jointures. Pour moi, c'est juste un gain de temps.
J'aime utiliser des vues sur des procédures stockées lorsque je n'exécute qu'une requête. Les vues peuvent également simplifier la sécurité, simplifier les insertions/mises à jour dans plusieurs tables, et instantané/matérialiser des données (exécuter une requête longue et conserver les résultats en mémoire cache).
J'ai utilisé des vues matérialisées pour des requêtes longues qui n'ont pas besoin d'être maintenues précises en temps réel.
Les vues décomposent également la configuration et les tables très complexes en fragments faciles à interroger. Dans notre base de données, l'ensemble de notre système de gestion de tables est décomposé en vues d'une grande table.
Je pense en premier lieu. Cacher la complexité de Query. Son très approprié pour les vues .Comment quand nous normalisons les tables de base de données augmente.Maintenant, pour récupérer des données est très difficile lorsque le nombre de tables augmente.Alors, le meilleur moyen de gérer est de suivre les vues.Si je me trompe me corriger.
Pour des raisons de sécurité: Donne à chaque utilisateur le droit d'accéder à la base de données uniquement via un petit ensemble de vues contenant les données spécifiques que l'utilisateur ou le groupe d'utilisateurs est autorisé à voir, ce qui limite l'accès des utilisateurs à d'autres données.
Simplicité pour les requêtes et la structure : Une vue peut extraire des données de plusieurs tables et présenter une seule table, simplifiant les informations et convertissant des requêtes multi-tables en requêtes à une seule table pour une vue et donnant aux utilisateurs une structure de base de données, présentant la base de données comme un ensemble de tables virtuelles spécifiques à des utilisateurs ou à des groupes d’utilisateurs particuliers.
Pour créer une structure de base de données cohérente : Les vues présentent une image cohérente et inchangée de la structure de la base de données, même si les tables source sous-jacentes sont modifiées.
Nous créons une vue pour limiter ou restreindre l'accès à toutes les lignes/colonnes d'une table. Si le propriétaire souhaite que seules des lignes/colonnes spécifiques ou limitées soient partagées, il crée une vue avec ces colonnes.
Pensez-y comme à refactoriser votre schéma de base de données.