2009-05-15 5 views
32

Ceci est une question générique de conception de base de données - Quels sont les avantages d'utiliser un synonyme dans le développement de bases de données, sur une vue simple? Quelles sont les principales considérations à garder à l'esprit lors du choix entre les deux?Quels sont les avantages/inconvénients d'utiliser un synonyme par rapport à une vue?

Un exemple vue:

CREATE VIEW Users AS 
SELECT * FROM IdentitySystem.dbo.Users 

Et le synonyme équivalent:

CREATE SYNONYM Users 
FOR IdentitySystem.dbo.LCTs 

Répondre

34

Ce sont des choses différentes. Un synonyme est un alias pour l'objet directement, une vue est une construction sur une ou plusieurs tables.

Quelques raisons d'utiliser une vue:

  • mai besoin de filtrer, joindre ou branler autrement avec la structure et la sémantique du jeu de résultats

  • Il peut être nécessaire de fournir un soutien existant pour un sous-jacent structure qui a changé mais a des dépendances que vous ne voulez pas retravailler.

  • peuvent offrir une sécurité où une partie du contenu de la table doit être visible à une classe d'utilisateurs, mais pas tous. Cela peut impliquer la suppression des colonnes contenant des informations sensibles ou le filtrage d'un sous-ensemble des enregistrements. Peut souhaiter encapsuler une logique métier sous une forme accessible aux utilisateurs à des fins de génération de rapports.

  • Vous souhaiterez peut-être unifier les données de plusieurs sources.

... Plus beaucoup plus.

raisons d'utiliser un synonyme:

  • Vous pouvez créer un alias un objet dans une autre base de données, où vous ne pouvez pas (ou ne veulent pas) coder en dur la référence à la base de données spécifique.

  • Vous souhaiterez peut-être rediriger vers une source qui change au fil du temps, telle qu'une table d'archivage.

  • Vous souhaitez créer un alias de manière à ne pas affecter l'optimiseur de requête.

... Plus beaucoup plus.

+0

Désolé pour faire glisser un vieux fil, mais j'ai un dilemme similaire à l'opportunité d'utiliser une vue ou un synonyme. C'est une bonne réponse, merci, mais ça ne répond pas vraiment à la question – DarthPablo

+1

Prends 2: -C Désolé de faire glisser un ancien fil de discussion, mais j'ai un dilemme similaire à savoir s'il faut utiliser une vue ou un synonyme. Merci pour votre bonne explication aussi. La question que je me pose est de savoir s'il y a des raisons pour ne pas utiliser une vue "droite" en faisant "sélectionner * à partir de la table"? Est-ce le bit que vous mentionnez de faire avec l'optimiseur de requête? Un problème que j'ai trouvé avec les synonymes est qu'ils font que Hibernate se plaint lorsque la validation du schéma est activée en utilisant 'hibernate.hbm2ddl.auto = validate'. En ce qui concerne vos raisons d'utiliser un synonyme, les deux premiers pourraient certainement être abordés avec un point de vue, n'est-ce pas? – DarthPablo

+0

Parmi les 3 raisons d'utiliser un synonyme, les deux premières sont tout aussi applicables aux vues de proximité ('' 'create view X_table as select * from another_database.dbo.X_table''') Quant à la troisième raison - 99% de le temps il n'y a probablement pas de pénalité non plus. Alors, quels sont les mystérieux '' '... Plus beaucoup plus.» ''? et ont-ils de l'importance? Une bonne réponse est donnée par @Jimmy Zimms – Konstantin

6

Il y a beaucoup de considérations. En bref, utilisez l'outil qui fonctionne le mieux pour chaque situation.

Avec vue, je peux

  • Masquer les colonnes
  • ajouter prédicats (clause WHERE) pour limiter les lignes
  • renommer des colonnes
  • donnent un nom de colonne à une expression SQL

Avec un synonyme, je peux:

  • objets de référence dans d'autres schémas et bases de données sans qualifier le nom

Il y a probablement plus qui peut être fait avec des synonymes. Dans les conceptions de nos applications (base de données Oracle), nous utilisons un schéma propriétaire (utilisateur) pour tous les objets de base de données (tables, vues, triggers, etc.), et nous accordons des privilèges sur ces objets à d'autres applications. " utilisateurs. Dans chacun des schémas utilisateur "app", nous créons des synonymes pour référencer les objets "owner".

HTH

3

Une vue est essentiellement simple/complexe "sélectionnez" déclaration. Essentiellement, vous utilisez une vue en tant que masque et n'affichez que les valeurs de colonnes qui sont utiles. Vous utilisez une vue avec l'intention de ne pas afficher d'informations supplémentaires pour l'utilisateur final.

Considérant qu'un synonyme est un autre nom pour les objets de base de données.

  • il vous permet d'utiliser des tables dans d'autres schémas sans préfixer le schéma nom au nom de la table avec un point comme dans (user.tab_name peut être remplacé par some_synonym_name)
  • vous ne souhaitez pas partager la objet réel avec les autres,
1

S'il vous plaît me corriger si je me trompe, mais je pense que je vois une autre utilisation pour un synonyme (au moins en OpenEdge), que je ne vois pas documentées quelque part, qui peut faire c'est encore plus sûr qu'une vue. La syntaxe de l'instruction DML SELECT vous permet d'utiliser une table, une vue ou un synonyme, mais les instructions INSERT, UPDATE et DELETE autorisent uniquement une table ou une vue. Certaines vues, si elles répondent à certains critères, fournissent un accès modifiable, insérable et effaçable aux données. Le synonyme semble être un bon moyen de fournir un accès en lecture seule aux données, sans avoir à jouer avec l'octroi (ou le refus) des privilèges sur les vues.

+1

Pour SQL Server, vous pouvez accorder SELECT, INSERT, UPDATE, DELETE à un SYNONYM pour une table. (accorder EXEC pour SP ou UDF, etc). – tgolisch

3

J'utilise des synonymes pour partager des objets d'autres bases de données de sorte que lorsque j'utilise .Net Entity Framework, je peux utiliser un ObjectContext unique pour accéder à toutes les données requises de nombreuses bases de données.

+0

Pouvez-vous fournir un peu plus de détails sur la façon dont vous accomplissez cela? Cette réponse fournit un moyen, mais c'est moins que l'idéal. http://stackoverflow.com/questions/6036357 – JoeBrockhaus

3

La projection de colonne à partir d'une vue est établie au moment de la création. Par conséquent, si vous ajoutez une colonne à la vue sous-jacente, elle ne sera pas exposée tant que vous n'aurez pas modifié la vue. Pas si avec un synonyme. Pensez-y comme un simple nom de remplacer dans votre tsql, généralement pour cacher la complexité.

1

J'espère que cela pourrait aider quelqu'un, j'ai jeté un coup d'oeil à cet article et j'ai trouvé une raison d'utiliser une vue au lieu d'un synonyme. Lorsque vous utilisez le serveur Sql en tant que serveur Db et SAS en tant que client. Si vous utilisez un synonyme, il ne sera pas reconnu dans votre bibliothèque SAS. Je devais créer une vue.

Il est pas optimisé, mais au moins avec le serveur de Windows sas Sql est pas le meilleur ni :)

Questions connexes