Wofür sind Ansichten gut?

87

Ich versuche nur, eine allgemeine Vorstellung davon zu bekommen, wofür Ansichten in RDBMS verwendet werden. Das heißt, ich weiß, was eine Ansicht ist und wie man eine macht. Ich weiß auch, wofür ich sie in der Vergangenheit verwendet habe.

Aber ich möchte sicherstellen, dass ich genau verstehe, wofür eine Ansicht nützlich ist und wofür eine Ansicht nicht nützlich sein sollte. Genauer:

  1. Wofür ist eine Ansicht nützlich?
    • Gibt es Situationen, in denen es verlockend ist, eine Ansicht zu verwenden, wenn Sie keine verwenden sollten?
    • Warum sollten Sie eine Ansicht anstelle einer Tabellenwertfunktion verwenden oder umgekehrt?
    • Gibt es Umstände, unter denen eine Ansicht nützlich sein könnte, die auf den ersten Blick nicht erkennbar sind?

(Und fürs Protokoll: Einige dieser Fragen sind absichtlich naiv. Dies ist teilweise eine Konzeptprüfung.)

Jason Baker
quelle
1
ähnlich der hier geposteten Frage: stackoverflow.com/questions/1278521/…
MedicineMan
Ich bin der Meinung, dass stackoverflow.com/questions/1278521/… bessere Antworten auf diese Frage bietet.
GinTonic

Antworten:

42

1) Wofür ist eine Ansicht nützlich?

IOPO nur an einem Ort

Unabhängig davon, ob Sie die Daten selbst oder die Abfragen berücksichtigen, die auf die verknüpften Tabellen verweisen, wird durch die Verwendung einer Ansicht unnötige Redundanz vermieden.

• Ansichten bieten auch eine abstrahierende Ebene, die den direkten Zugriff auf die Tabellen verhindert (und die daraus resultierenden Handschellen, die auf physische Abhängigkeiten verweisen). Tatsächlich halte ich es für eine gute Praxis 1 , nur abstrahierten Zugriff auf Ihre zugrunde liegenden Daten zu bieten (mithilfe von Ansichten und Funktionen mit Tabellenwerten), einschließlich Ansichten wie 1. Ich muss zugeben, dass es eine Menge von "Tun, was ich sage; nicht wie ich" gibt mach "in diesem Rat;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Gibt es Situationen, in denen es verlockend ist, eine Ansicht zu verwenden, wenn Sie keine verwenden sollten?

Die Leistung in Ansichtsverknüpfungen war früher ein Problem (z. B. SQL 2000). Ich bin kein Experte, aber ich habe mir eine Weile keine Sorgen mehr gemacht. (Ich kann mir auch nicht vorstellen, wo ich derzeit Ansichtsverknüpfungen verwende.)

Eine andere Situation, in der eine Ansicht möglicherweise übertrieben ist, besteht darin, dass auf die Ansicht nur von einem aufrufenden Speicherort aus verwiesen wird und stattdessen eine abgeleitete Tabelle verwendet werden kann. Genau wie ein anonymer Typ einer Klasse in .NET vorzuziehen ist, wenn der anonyme Typ nur einmal verwendet / referenziert wird.

    • Siehe die abgeleitete Tabellenbeschreibung unter http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Warum sollten Sie eine Ansicht anstelle einer Tabellenfunktion verwenden oder umgekehrt?

(Abgesehen von Leistungsgründen) Eine tabellenwertige Funktion entspricht funktional einer parametrisierten Ansicht. Tatsächlich besteht ein häufiger Anwendungsfall für einfache Tabellenwerte darin, einer bereits vorhandenen Ansicht in einem einzelnen Objekt einen WHERE-Klauselfilter hinzuzufügen.

4) Gibt es Umstände, unter denen eine Ansicht nützlich sein könnte, die auf den ersten Blick nicht erkennbar sind?

Ich kann mir keine nicht offensichtlichen Verwendungen der Oberseite meines Kopfes vorstellen. (Ich nehme an, wenn ich könnte, würde das sie offensichtlich machen;)
6eorge Jetson
quelle
9
Ich würde nicht zustimmen, dass es sinnvoll ist, eine Ansicht für eine Tabelle zu erstellen, wenn es sich um ein SELECT * FROM tblData handelt. Können Sie erklären, warum dies von Vorteil ist?
Registrierter Benutzer
IOPO - nur an einem Ort - Ist dies eine bekannte Designphrase? Ich kann nicht viele Hinweise darauf finden? Hat es andere Formen, zB TROCKEN?
Robert
1
@ Robert Ja, trocken, Normalisierung, IOPO, das sind alles verschiedene Geschmacksrichtungen derselben Philosophie.
TylerH
45

In gewisser Weise ist eine Ansicht wie eine Schnittstelle. Sie können die zugrunde liegende Tabellenstruktur beliebig ändern, aber die Ansicht bietet eine Möglichkeit, dass sich der Code nicht ändern muss.

Ansichten sind eine gute Möglichkeit, Autoren etwas einfach zu melden. Wenn Ihre Geschäftsbenutzer über Crystal Reports auf die Daten zugreifen möchten, können Sie ihnen in ihrem Konto einige Ansichten geben, die die Daten vereinfachen - möglicherweise sogar für sie denormalisieren.

Lou Franco
quelle
21

Ansichten können verwendet werden, um Sicherheit zu bieten (dh Benutzer können auf Ansichten zugreifen, die nur auf bestimmte Spalten in einer Tabelle zugreifen), Ansichten können zusätzliche Sicherheit für Aktualisierungen, Einfügungen usw. bieten. Ansichten bieten auch eine Möglichkeit, Spaltennamen zu aliasen (wie dies auch der Fall ist) sp's), aber Ansichten sind eher eine Isolation von der eigentlichen Tabelle.

schmoopy
quelle
18

In gewissem Sinne denormalisieren Ansichten. Eine Denormalisierung ist manchmal erforderlich, um Daten aussagekräftiger bereitzustellen. Dies tun ohnehin viele Anwendungen durch Domänenmodellierung in ihren Objekten. Sie helfen dabei, die Daten so darzustellen, dass sie der Perspektive eines Unternehmens besser entsprechen.

Kilhoffer
quelle
-1 "Ansichten denormalisieren"? Entschuldigung, aber das ist Unsinn, es sei denn, es ist irgendwie qualifiziert.
Nur jemand
18
Sie denormalisieren absolut. Wenn Sie verwandte Tabellen haben, die auf die 3. Nominalform normalisiert sind, und eine Ansicht erstellen, um diese Beziehung zu "glätten", wie ist dies nicht die Denormalisierung?
Kilhoffer
11

Zusätzlich zu den Angaben der anderen können Ansichten auch nützlich sein, um komplexere SQL-Abfragen aus der Anwendung zu entfernen.

Als Beispiel, anstatt in einer Anwendung Folgendes zu tun:

sql = "wähle a, b aus Tabelle1 Vereinigung wähle a, b aus Tabelle2";

Sie könnten das zu einer Ansicht abstrahieren:

Erstellen Sie die Ansicht union_table1_table2_v als
Auswahl a, b aus Tabelle1.
Vereinigung Wählen
Sie a, b aus Tabelle2 aus

und im App-Code einfach:

sql = "wähle a, b aus union_table1_table2_v";

Auch wenn sich die Datenstrukturen jemals ändern, müssen Sie den App-Code nicht ändern, neu kompilieren und erneut bereitstellen. Sie würden einfach die Ansicht in der Datenbank ändern.

CodingWithSpike
quelle
Warum sollte ich komplexe SQL in die Datenbank anstatt in die App schreiben wollen?
Ivan Virabyan
3
Je komplizierter Ihre Abfrage ist, desto wahrscheinlicher wird sie sich in Zukunft ändern, was teilweise darauf zurückzuführen ist, dass nur mehr Tabellen getroffen werden. Wenn sich die DB-Strukturen ändern, müssten Sie auch Ihren Code ändern und eine Freigabe durchführen. Wenn diese Komplexität in einer Ansicht abstrahiert wird, kann der DBA möglicherweise strukturelle Änderungen an den zugrunde liegenden Tabellen vornehmen, ohne dass sich Ihr Code ändern muss.
CodingWithSpike
11

Ansichten verbergen die Datenbankkomplexität. Sie sind aus vielen Gründen großartig und in vielen Situationen nützlich. Wenn Sie jedoch Benutzer haben, die ihre eigenen Abfragen und Berichte schreiben dürfen, können Sie sie als Schutz verwenden, um sicherzustellen, dass sie nicht schlecht gestaltet sind Abfragen mit fiesen kartesischen Joins, die Ihren Datenbankserver herunterfahren.

gsarnold
quelle
6

Das OP fragte, ob es Situationen gäbe, in denen es möglicherweise verlockend wäre, eine Ansicht zu verwenden, aber dies ist nicht angemessen.

Was Sie nicht für eine Ansicht verwenden möchten, ist ein Ersatz für komplexe Verknüpfungen. Das heißt, lassen Sie sich nicht von Ihrer prozeduralen Programmiergewohnheit, ein Problem in kleinere Teile zu zerlegen, dazu führen, dass Sie mehrere Ansichten verwenden, die zusammengefügt sind, anstatt einer größeren Verknüpfung. Dies beeinträchtigt die Effizienz des Datenbankmoduls, da im Wesentlichen mehrere separate Abfragen statt einer größeren ausgeführt werden.

Angenommen, Sie müssen die Tabellen A, B, C und D miteinander verbinden. Sie könnten versucht sein, eine Ansicht aus den Tabellen A und B und eine Ansicht aus C & D zu erstellen und dann die beiden Ansichten miteinander zu verbinden. Es ist viel besser, A, B, C und D in einer Abfrage zu verbinden.

Barry Brown
quelle
Ich denke nicht, dass das richtig ist, zumindest geht die DBMS-Theorie nicht so (verschiedene Implementierungen können entscheiden, die Theorie nicht einzuhalten). Der Abfrageparser ersetzt im Wesentlichen alle angezeigten Ansichten durch die entsprechende SQL, und der Optimierer wechselt von dort aus. Die 2 Fälle sollten gleichwertig sein.
SquareCog
Dies gilt auch nicht, wenn Sie Ihren Ansichten Indizes hinzufügen können.
Therealhoff
Ich bin mit PostgreSQL am besten vertraut und frühere Versionen waren nicht sehr gut darin, Abfragen zu kombinieren. Aber die neueren sind viel besser. Meine Antwort trifft nicht mehr so ​​sehr zu, zumindest für dieses spezielle DBMS.
Barry Brown
5

Ansichten können Daten zentralisieren oder konsolidieren. Wo ich bin, haben wir eine Reihe verschiedener Datenbanken auf verschiedenen Verbindungsservern. Jede Datenbank enthält Daten für eine andere Anwendung. Einige dieser Datenbanken enthalten Informationen, die für eine Reihe verschiedener Anwendungen relevant sind. Unter diesen Umständen erstellen wir eine Ansicht in der Datenbank dieser Anwendung, in der nur Daten aus der Datenbank abgerufen werden, in der die Daten tatsächlich gespeichert sind, damit die von uns geschriebenen Abfragen nicht so aussehen, als würden sie verschiedene Datenbanken durchlaufen.

Joel Coehoorn
quelle
4

Die bisherigen Antworten sind korrekt - Ansichten sind gut für die Bereitstellung von Sicherheit, Denormalisierung (obwohl es auf diesem Weg viel Schmerz gibt, wenn sie falsch gemacht werden), Datenmodellabstraktion usw.

Darüber hinaus werden häufig Ansichten verwendet, um Geschäftslogik zu implementieren (ein abgelaufener Benutzer ist ein Benutzer, der sich in den letzten 40 Tagen nicht angemeldet hat).

SquareCog
quelle
Wenn Sie durch Brining in 7 Referenztabellen denormalisieren und dann nach etwas fragen, das nur eine dieser Referenztabellen benötigt. Das ist viel verschwendete Mühe. Dies wird schlimmer, wenn Sie sich solchen Ansichten anschließen.
SquareCog
Bist du dir da sicher? In MSDN heißt es: 'Wenn SQL Server Abfragen verarbeitet, die sich auf Ansichten nach Namen beziehen, werden die Definitionen der Ansichten normalerweise erweitert, bis sie sich nur noch auf Basistabellen beziehen. Dieser Vorgang wird als Ansichtserweiterung bezeichnet. Es ist eine Form der Makroerweiterung. ' Ich würde mir vorstellen, dass die Engine während des Erweiterungsprozesses intelligent genug ist, um nur die zugrunde liegenden Tabellen (der Ansicht) einzuschließen, die von der Abfrage benötigt werden.
Anthony
Anthony, stellen Sie sich eine Abfrage wie "Wählen Sie foo_col aus (wählen Sie foo. *, Bar. * Aus foo join bar on (foo.id = bar.id)" aus. In dieser Abfrage ist die innere Auswahl unsere Ansicht. Dies ist nicht der Fall Es ist klar, dass die Balkenverknüpfung sicher gelöscht werden kann (tatsächlich, wenn die Beziehung nicht streng 1-1 ist, kann dies nicht). Dies wird bei komplexeren Abfragen noch schwieriger, und ich würde nicht empfehlen, sich für alle Aufgaben auf das generische RDBMS zu verlassen Beschneiden einer menschlichen Dose. Vielleicht kann SQL Server; ich wäre schockiert, wenn MySQL dies tun würde. Oracle? Postgres? Wie immer, lesen Sie den Abfrageplan, wenn Sie Zweifel haben.
SquareCog
3

Ansichten speichern viele wiederholte komplexe JOIN-Anweisungen in Ihren SQL-Skripten. Sie können einfach ein komplexes JOIN in einer Ansicht kapseln und es bei Bedarf in Ihrer SELECT-Anweisung aufrufen. Dies ist manchmal praktisch, unkompliziert und einfacher als das Schreiben der Join-Anweisungen in jeder Abfrage.

mohammedn
quelle
2

Eine Ansicht ist einfach eine gespeicherte Anweisung mit dem Namen SELECT. Stellen Sie sich Ansichten wie Bibliotheksfunktionen vor.

Gaius
quelle
Würden gespeicherte Prozeduren dafür nicht besser passen? Manchmal benötigen Sie Funktionen mit Lösch- und Aktualisierungsansichten, die für diesen Bedarf nicht geeignet sind. Ansichten sollten als Abstraktionen oder Möglichkeiten zur Einschränkung des Zielbenutzers betrachtet werden.
HumbleWebDev
1

Ich wollte die Verwendung von Ansichten für die Berichterstellung hervorheben. Häufig besteht ein Konflikt zwischen der Normalisierung der Datenbanktabellen zur Beschleunigung der Leistung, insbesondere beim Bearbeiten und Einfügen von Daten (OLTP-Verwendungen), und der Denormalisierung, um die Anzahl der Tabellenverknüpfungen für Abfragen für die Berichterstellung und Analyse (OLAP-Verwendungen) zu verringern. OLTP gewinnt notwendigerweise normalerweise, weil die Dateneingabe eine optimale Leistung haben muss. Das Erstellen von Ansichten für eine optimale Berichtsleistung kann daher dazu beitragen, beide Benutzerklassen (Dateneingabe und Berichtsbetrachter) zufrieden zu stellen.

DOK
quelle
1

Ich erinnere mich an eine sehr lange SELECT, an der mehrere UNIONs beteiligt waren. Jede UNION enthielt eine Verknüpfung zu einer Preistabelle, die von einem SELECT erstellt wurde, der selbst ziemlich lang und schwer zu verstehen war. Ich denke, es wäre eine gute Idee gewesen, eine Ansicht zu haben, um die Preistabelle zu erstellen. Dies hätte die Gesamtauswahl um etwa die Hälfte verkürzt.

Ich weiß nicht, ob die Datenbank die Ansicht einmal auswerten würde oder jedes Mal, wenn in aufgerufen wurde. Weiß jemand? In diesem Fall würde die Verwendung einer Ansicht die Leistung verbessern.

SeaDrive
quelle
Oracle CBO kann die Ansicht einmal auswerten (materialisieren, nennen sie es) oder die SQL für die Ansicht in den Rest der select-Anweisung einbinden und diese ausführen. Es würde auf der Grundlage der niedrigeren geschätzten Kosten entscheiden.
WW.
Wenn die select-Anweisung während der gesamten Abfrage konstant war und einfach mehrmals wiederholt wurde, kann das Problem durch einen allgemeinen Tabellenausdruck (CTE) behoben werden. Dies gilt nur für SQL Server 2005/2008, da es in SQL Server 2000 nicht verfügbar war. Ja, eine Ansicht wäre immer noch wiederholt aufgerufen worden.
Registrierter Benutzer
@ Registrierter Benutzer: CTEs sind keine SQL Server-Spezialität. Sie stammen aus DB2 und sind auch in PostgreSQL vorhanden (da sie nützlich sind und im ISO SQL-Standard enthalten sind). Unabhängig davon, ob eine Ansicht inline ist oder als Blackbox behandelt wird, sind einige RDBMS intelligenter als andere.
Nur jemand
@just jemand: Mein Kommentar war auf SQL Server 2005/2008 beschränkt, da ich keine Erfahrung mit CTEs in anderen RBDMS habe. Außerdem wurde der Kommentar qualifiziert, um anzuzeigen, dass dies nicht für SQL Server 2000 gilt, da CTEs vor 2005 in SQL Server nicht verfügbar waren.
Registrierter Benutzer
Eine andere Alternative zu einer Ansicht wäre gewesen, die Preistabelle vorher in eine temporäre Tabelle zu legen.
SeaDrive
0

Immer wenn Sie [my_interface]! = [User_interface] benötigen.

Beispiel:

TABELLE A:

  • Ich würde
  • die Info

ANSICHT für TABELLE A:

  • Kundeninformation

Auf diese Weise können Sie die ID vor dem Kunden verbergen und die Informationen gleichzeitig in einen ausführlicheren Namen umbenennen.

Die Ansicht verwendet den zugrunde liegenden Index für die Primärschlüssel-ID, sodass Sie keinen Leistungsverlust sehen, sondern nur eine bessere Abstraktion der ausgewählten Abfrage.

HumbleWebDev
quelle