Wann und warum entscheidet jemand, dass er eine Ansicht in seiner Datenbank erstellen muss? Warum nicht einfach eine normale gespeicherte Prozedur ausführen oder auswählen?
Wann und warum entscheidet jemand, dass er eine Ansicht in seiner Datenbank erstellen muss? Warum nicht einfach eine normale gespeicherte Prozedur ausführen oder auswählen?
Antworten:
Eine Ansicht bietet mehrere Vorteile.
1. Ansichten können die Komplexität verbergen
Wenn Sie eine Abfrage haben, für die mehrere Tabellen verknüpft werden müssen, oder komplexe Logik oder Berechnungen haben, können Sie diese gesamte Logik in eine Ansicht codieren und dann wie eine Tabelle aus der Ansicht auswählen.
2. Ansichten können als Sicherheitsmechanismus verwendet werden
Eine Ansicht kann bestimmte Spalten und / oder Zeilen aus einer Tabelle (oder Tabellen) auswählen und Berechtigungen für die Ansicht anstelle der zugrunde liegenden Tabellen festlegen. Auf diese Weise können nur die Daten angezeigt werden, die ein Benutzer sehen muss.
3. Ansichten können die Unterstützung von Legacy-Code vereinfachen
Wenn Sie eine Tabelle umgestalten müssen, die viel Code beschädigen würde, können Sie die Tabelle durch eine gleichnamige Ansicht ersetzen. Die Ansicht bietet genau das gleiche Schema wie die ursprüngliche Tabelle, während sich das tatsächliche Schema geändert hat. Auf diese Weise wird verhindert, dass der Legacy-Code, der auf die Tabelle verweist, beschädigt wird, sodass Sie den Legacy-Code nach Belieben ändern können.
Dies sind nur einige der vielen Beispiele dafür, wie Ansichten nützlich sein können.
Unter anderem kann es zur Sicherheit verwendet werden. Wenn Sie eine "Kunden" -Tabelle haben, möchten Sie möglicherweise allen Vertriebsmitarbeitern Zugriff auf die Felder Name, Adresse, Postleitzahl usw. gewähren, nicht jedoch auf credit_card_number. Sie können eine Ansicht erstellen, die nur die Spalten enthält, auf die sie Zugriff benötigen, und ihnen dann Zugriff auf die Ansicht gewähren.
Select name, address, zipcode from customer
würde nicht den Zweck erfüllen statt creating a view
?
select * from customer
wodurch sie auf alles zugreifen können. Wenn Sie ihnen Zugriff auf die Ansicht und nicht auf die Tabelle gewähren, können sie nicht auf Felder zugreifen, die nicht in der Ansicht enthalten sind.
Eine Ansicht ist eine Kapselung einer Abfrage. Abfragen, die in Ansichten umgewandelt werden, sind in der Regel kompliziert und können daher als Ansicht zur Wiederverwendung gespeichert werden.
Normalerweise erstelle ich Ansichten, um Daten zu de-normalisieren und / oder zu aggregieren, die häufig für Berichtszwecke verwendet werden.
BEARBEITEN
Zur Ausarbeitung, wenn ich eine Datenbank hätte, in der einige der Entitäten Person, Firma, Rolle, Eigentümertyp, Reihenfolge, Bestelldetails, Adresse und Telefon waren, in der die Personentabelle sowohl Mitarbeiter als auch Kontakte sowie die Adresse und gespeichert hat In Telefontabellen wurden Telefonnummern für Personen und Unternehmen gespeichert, und das Entwicklungsteam wurde beauftragt, Berichte zu erstellen (oder Berichtsdaten für Nichtentwickler zugänglich zu machen), z. B. Verkäufe nach Mitarbeitern oder Verkäufe nach Kunden oder Verkäufe nach Regionen, Verkäufe nach Monat , Kunden nach Bundesstaat usw. Ich würde eine Reihe von Ansichten erstellen, die die Beziehungen zwischen den Datenbankentitäten de-normalisieren, sodass eine stärker integrierte Ansicht (kein Wortspiel beabsichtigt) der realen Entitäten verfügbar ist. Einige der Vorteile könnten sein:
Mehrere Gründe: Wenn Sie komplizierte Verknüpfungen haben, ist es manchmal am besten, eine Ansicht zu haben, damit bei jedem Zugriff die Verknüpfungen immer korrekt sind und die Entwickler sich nicht alle Tabellen merken müssen, die sie möglicherweise benötigen. In der Regel ist dies für eine Finanzanwendung der Fall, bei der es äußerst wichtig ist, dass alle Finanzberichte auf demselben Datensatz basieren.
Wenn Sie Benutzer haben, die die Datensätze einschränken möchten, die sie jemals sehen können, können Sie eine Ansicht verwenden, ihnen nur Zugriff auf die Ansicht und nicht auf die zugrunde liegenden Tabellen gewähren und dann die Ansicht abfragen
Crystal Reports scheint es vorzuziehen, Ansichten für gespeicherte Prozesse zu verwenden, daher verwenden Personen, die viel Bericht schreiben, häufig viele Ansichten
Ansichten sind auch beim Refactoring von Datenbanken sehr nützlich. Sie können die Änderung häufig ausblenden, damit der alte Code sie nicht sieht, indem Sie eine Ansicht erstellen. Lesen Sie weiter, wie Sie Datenbanken umgestalten, um zu sehen, wie dies funktioniert, da dies eine sehr leistungsstarke Methode zum Umgestalten ist.
Der einzige Hauptvorteil einer Ansicht gegenüber einer gespeicherten Prozedur besteht darin, dass Sie eine Ansicht genauso verwenden können wie eine Tabelle. Auf eine Ansicht kann nämlich direkt in der FROM
Klausel einer Abfrage verwiesen werden. ZB , SELECT * FROM dbo.name_of_view
.
In fast jeder anderen Hinsicht sind gespeicherte Prozeduren leistungsfähiger. Sie können in den Parametern, einschließlich geben out
Parameter , die Sie effektiv ermöglichen gleichzeitig mehrere Werte zurückgeben, können Sie tun SELECT
, INSERT
, UPDATE
, und DELETE
Operationen, etc. etc.
Wenn Sie möchten, dass eine Ansicht innerhalb der FROM
Klausel abfragen kann , aber auch Parameter übergeben möchten, gibt es auch eine Möglichkeit, dies zu tun. Es wird eine Tabellenwertfunktion genannt.
Hier ist ein ziemlich nützlicher Artikel zum Thema:
EDIT: Diese Art wirft übrigens die Frage auf, welchen Vorteil eine Ansicht gegenüber einer Funktion mit Tabellenwert hat. Ich habe keine wirklich gute Antwort darauf, aber ich werde feststellen, dass die T-SQL-Syntax zum Erstellen einer Ansicht einfacher ist als für eine Funktion mit Tabellenwert, und Benutzer Ihrer Datenbank möglicherweise besser mit Ansichten vertraut sind.
Es kann als guter "Mittelsmann" zwischen Ihrem ORM und Ihren Tischen fungieren.
Beispiel:
Wir hatten eine Personentabelle, in der wir die Struktur ändern mussten, damit die Spalte SomeColumn in eine andere Tabelle verschoben wurde und eine Eins-zu-Viele-Beziehung zu hatte.
Die Mehrheit des Systems in Bezug auf die Person verwendete die SomeColumn jedoch immer noch als eine einzige Sache, nicht als viele Dinge. Wir haben eine Ansicht verwendet, um alle SomeColumns zusammenzuführen und in die Ansicht einzufügen, was gut funktioniert hat.
Dies funktionierte, weil sich die Datenschicht geändert hatte, die Geschäftsanforderungen sich jedoch nicht grundlegend geändert hatten, sodass sich die Geschäftsobjekte nicht ändern mussten. Wenn sich die Geschäftsobjekte ändern müssten, wäre dies meiner Meinung nach keine praktikable Lösung gewesen, aber Ansichten sind definitiv ein guter Mittelpunkt.
Konzentrieren auf bestimmte Daten Mit Ansichten können sich Benutzer auf bestimmte Daten konzentrieren, die sie interessieren, und auf die spezifischen Aufgaben, für die sie verantwortlich sind. Unnötige Daten können nicht angezeigt werden. Dies erhöht auch die Sicherheit der Daten, da Benutzer nur die Daten sehen können, die in der Ansicht definiert sind, und nicht die Daten in der zugrunde liegenden Tabelle. Weitere Informationen zum Verwenden von Ansichten für Sicherheitszwecke finden Sie unter Verwenden von Ansichten als Sicherheitsmechanismen.
Vereinfachen der Datenmanipulation Ansichten können die Manipulation von Daten durch Benutzer vereinfachen. Sie können häufig verwendete Verknüpfungen, Projektionen, UNION-Abfragen und SELECT-Abfragen als Ansichten definieren, damit Benutzer nicht jedes Mal alle Bedingungen und Qualifikationen angeben müssen, wenn ein zusätzlicher Vorgang für diese Daten ausgeführt wird. Beispielsweise kann eine komplexe Abfrage als Ansicht erstellt werden, die für Berichtszwecke verwendet wird und Unterabfragen, äußere Verknüpfungen und Aggregationen zum Abrufen von Daten aus einer Gruppe von Tabellen ausführt. Die Ansicht vereinfacht den Zugriff auf die Daten, da die zugrunde liegende Abfrage nicht jedes Mal geschrieben oder gesendet werden muss, wenn der Bericht erstellt wird. Die Ansicht wird stattdessen abgefragt. Weitere Informationen zum Bearbeiten von Daten.
Sie können auch benutzerdefinierte Inline-Funktionen erstellen, die logisch als parametrisierte Ansichten fungieren, oder Ansichten, die Parameter in den Suchbedingungen der WHERE-Klausel enthalten. Weitere Informationen finden Sie unter Benutzerdefinierte Inline-Funktionen.
Anpassen von Datenansichten ermöglichen es verschiedenen Benutzern, Daten auf unterschiedliche Weise anzuzeigen, selbst wenn sie dieselben Daten gleichzeitig verwenden. Dies ist besonders vorteilhaft, wenn Benutzer mit vielen unterschiedlichen Interessen und Fähigkeiten dieselbe Datenbank verwenden. Beispielsweise kann eine Ansicht erstellt werden, die nur die Daten für die Kunden abruft, mit denen ein Account Manager zu tun hat. Die Ansicht kann anhand der Anmelde-ID des Kontomanagers, der die Ansicht verwendet, bestimmen, welche Daten abgerufen werden sollen.
Exportieren und Importieren von Daten Ansichten können zum Exportieren von Daten in andere Anwendungen verwendet werden. Beispielsweise möchten Sie möglicherweise die Geschäfte und Verkaufstabellen in der Pubs-Datenbank verwenden, um Verkaufsdaten mit Microsoft® Excel zu analysieren. Zu diesem Zweck können Sie eine Ansicht basierend auf den Filialen und Verkaufstabellen erstellen. Sie können dann das Dienstprogramm bcp verwenden, um die in der Ansicht definierten Daten zu exportieren. Daten können auch mit dem Dienstprogramm bcp oder der Anweisung BULK INSERT aus Datendateien in bestimmte Ansichten importiert werden, sofern Zeilen mit der Anweisung INSERT in die Ansicht eingefügt werden können. Weitere Informationen zu den Einschränkungen beim Kopieren von Daten in Ansichten finden Sie unter EINFÜGEN. Weitere Informationen zur Verwendung des Dienstprogramms bcp und der Anweisung BULK INSERT zum Kopieren von Daten in und aus einer Ansicht finden Sie unter Kopieren in oder aus einer Ansicht.
Partitionierte Daten kombinieren Der Transact-SQL UNION-Mengenoperator kann in einer Ansicht verwendet werden, um die Ergebnisse von zwei oder mehr Abfragen aus separaten Tabellen in einer einzigen Ergebnismenge zu kombinieren. Dies erscheint dem Benutzer als eine einzelne Tabelle, die als partitionierte Ansicht bezeichnet wird. Wenn beispielsweise eine Tabelle Verkaufsdaten für Washington und eine andere Tabelle Verkaufsdaten für Kalifornien enthält, kann aus der UNION dieser Tabellen eine Ansicht erstellt werden. Die Ansicht repräsentiert die Verkaufsdaten für beide Regionen. Um partitionierte Ansichten zu verwenden, erstellen Sie mehrere identische Tabellen und geben eine Einschränkung an, um den Datenbereich zu bestimmen, der jeder Tabelle hinzugefügt werden kann. Die Ansicht wird dann unter Verwendung dieser Basistabellen erstellt. Wenn die Ansicht abgefragt wird, ermittelt SQL Server automatisch, welche Tabellen von der Abfrage betroffen sind, und verweist nur auf diese Tabellen. Zum Beispiel, Wenn in einer Abfrage angegeben wird, dass nur Verkaufsdaten für den Bundesstaat Washington erforderlich sind, liest SQL Server nur die Tabelle mit den Verkaufsdaten für Washington. Auf andere Tabellen wird nicht zugegriffen.
Partitionierte Ansichten können auf Daten aus mehreren heterogenen Quellen basieren, z. B. Remoteservern, und nicht nur auf Tabellen in derselben Datenbank. Um beispielsweise Daten von verschiedenen Remoteservern zu kombinieren, auf denen jeweils Daten für eine andere Region Ihres Unternehmens gespeichert sind, können Sie verteilte Abfragen erstellen, die Daten aus jeder Datenquelle abrufen, und anschließend eine Ansicht erstellen, die auf diesen verteilten Abfragen basiert. Bei allen Abfragen werden nur Daten aus den Tabellen auf den Remoteservern gelesen, die die von der Abfrage angeforderten Daten enthalten. Auf die anderen Server, auf die die verteilten Abfragen in der Ansicht verweisen, wird nicht zugegriffen.
Wenn Sie Daten auf mehrere Tabellen oder mehrere Server verteilen, können Abfragen, die nur auf einen Bruchteil der Daten zugreifen, schneller ausgeführt werden, da weniger Daten gescannt werden müssen. Befinden sich die Tabellen auf verschiedenen Servern oder auf einem Computer mit mehreren Prozessoren, kann jede an der Abfrage beteiligte Tabelle auch parallel gescannt werden, wodurch die Abfrageleistung verbessert wird. Darüber hinaus können Wartungsaufgaben wie das Neuerstellen von Indizes oder das Sichern einer Tabelle schneller ausgeführt werden. Bei Verwendung einer partitionierten Ansicht werden die Daten weiterhin als einzelne Tabelle angezeigt und können als solche abgefragt werden, ohne dass manuell auf die richtige zugrunde liegende Tabelle verwiesen werden muss.
Partitionierte Ansichten können aktualisiert werden, wenn eine der folgenden Bedingungen erfüllt ist: In der Ansicht ist ein INSTEAD OF-Trigger mit Logik definiert, die die Anweisungen INSERT, UPDATE und DELETE unterstützt.
Sowohl die Ansicht als auch die Anweisungen INSERT, UPDATE und DELETE folgen den Regeln, die für aktualisierbare partitionierte Ansichten definiert sind. Weitere Informationen finden Sie unter Erstellen einer partitionierten Ansicht.
https://technet.microsoft.com/en-us/library/aa214282(v=sql.80).aspx#sql:join
Hier sind zwei häufige Gründe:
Sie können es aus Sicherheitsgründen verwenden. Gewähren Sie keine Berechtigungen für die Haupttabelle und erstellen Sie Ansichten, die den Zugriff auf Spalten oder Zeilen einschränken, und erteilen Sie Benutzern Berechtigungen zum Anzeigen der Ansicht.
Sie können es der Einfachheit halber verwenden. Verbinden Sie einige Tabellen, die Sie in der Ansicht ständig zusammen verwenden. Dies kann Abfragen konsistent und einfacher machen.
Es gibt mehr als einen Grund dafür. Manchmal sind allgemeine Join-Abfragen einfach, da nur ein Tabellenname abgefragt werden kann, anstatt alle Joins durchzuführen.
Ein weiterer Grund besteht darin, die Daten auf verschiedene Benutzer zu beschränken. Also zum Beispiel:
Tabelle 1: Spalten - USER_ID; USERNAME; SSN
Administratorbenutzer können Berechtigungen für die eigentliche Tabelle haben, aber Benutzer, auf die Sie keinen Zugriff haben möchten, um beispielsweise die SSN anzugeben, erstellen Sie eine Ansicht als
CREATE VIEW USERNAMES AS SELECT user_id, Benutzername FROM Table1;
Geben Sie ihnen dann die Berechtigung, auf die Ansicht und nicht auf die Tabelle zuzugreifen.
Ansichten können ein Glücksfall sein, wenn Sie über ältere Datenbanken berichten. Insbesondere können Sie sinnliche Tabellennamen anstelle von kryptischen 5-Buchstaben-Namen (wobei 2 davon ein allgemeines Präfix sind!) Oder Spaltennamen voller Abkürzungen verwenden, die zu dieser Zeit sicher sinnvoll waren.
Im Allgemeinen gehe ich mit Ansichten, um das Leben zu vereinfachen, erweiterte Details von einer Entität zu erhalten, die über mehrere Tabellen gespeichert ist (eliminieren Sie viele Verknüpfungen im Code, um die Lesbarkeit zu verbessern) und manchmal, um Daten über mehrere Datenbanken zu teilen oder sogar um Einfügungen leichter lesbar zu machen.
Hier erfahren Sie, wie Sie eine Ansicht zusammen mit Berechtigungen verwenden, um die Spalten einzuschränken, die ein Benutzer in der Tabelle aktualisieren kann.
/* 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
Wenn ich einen Schnappschuss einer Tabelle (n) und / oder einer Ansicht (schreibgeschützt) anzeigen möchte
Ich verwende gerne Ansichten über gespeicherte Prozeduren, wenn ich nur eine Abfrage ausführe. Ansichten können auch die Sicherheit vereinfachen, Einfügungen / Aktualisierungen in mehrere Tabellen vereinfachen und Daten aufnehmen / materialisieren (eine Abfrage mit langer Laufzeit ausführen und die Ergebnisse zwischengespeichert halten).
Ich habe materialisierte Ansichten für Sehnsuchtsabfragen verwendet, die nicht in Echtzeit korrekt gehalten werden müssen.
Dies beantwortet Ihre Frage nicht genau, aber ich dachte, es wäre wert, Materialized Views zu erwähnen . Meine Erfahrung ist hauptsächlich mit Oracle, aber angeblich ist SQL-Server ziemlich ähnlich.
Wir haben in unserer Architektur etwas Ähnliches verwendet, um XML-Leistungsprobleme zu beheben. Unsere Systeme sind mit vielen Daten ausgestattet, die als XML in einer Zeile gespeichert sind, und Anwendungen müssen möglicherweise bestimmte Werte darin abfragen. Die Verarbeitung vieler XMLTypes und das Ausführen von XPaths über eine große Anzahl von Zeilen hinweg hat einen großen Einfluss auf die Leistung. Daher verwenden wir eine Form von materialisierten Ansichten, um die gewünschten XML-Knoten bei jeder Änderung der Basistabelle in eine relationale Tabelle zu extrahieren. Dies liefert effektiv einen physischen Schnappschuss der Abfrage zu einem bestimmten Zeitpunkt im Gegensatz zu Standardansichten, die ihre Abfrage bei Bedarf ausführen würden.
Ich sehe eine gespeicherte Prozedur eher als eine Methode, die ich für meine Daten aufrufen kann, während eine Ansicht für mich einen Mechanismus zum Erstellen einer synthetischen Version der Basisdaten bietet, anhand derer Abfragen oder gespeicherte Prozeduren erstellt werden können. Ich werde eine Ansicht erstellen, wenn eine Vereinfachung oder Aggregation sinnvoll ist. Ich werde eine gespeicherte Prozedur schreiben, wenn ich einen ganz bestimmten Service bereitstellen möchte.
Eine merkwürdige Sache bei Ansichten ist, dass sie von Microsoft Access als Tabellen angezeigt werden: Wenn Sie ein Microsoft Access-Frontend mithilfe von ODBC an eine SQL-Datenbank anhängen, werden die Tabellen und Ansichten in der Liste der verfügbaren Tabellen angezeigt. Wenn Sie also komplizierte Berichte in MS Access erstellen, können Sie den SQL Server das Beitreten und Abfragen durchführen lassen und Ihr Leben erheblich vereinfachen. Das Gleiche gilt für die Vorbereitung einer Abfrage in MS Excel.
Ich habe nur ungefähr 10 Ansichten in meinen Produktionsdatenbanken. Ich benutze mehrere für Spalten, die ich ständig benutze. Ein Satz, den ich verwende, stammt aus 7 Tabellen, einige mit äußeren Verknüpfungen, und anstatt ihn ständig neu zu schreiben, muss ich diese Ansicht nur in einer Auswahl aufrufen und eine oder zwei Verknüpfungen erstellen. Für mich ist es nur eine Zeitersparnis.
Ich erstelle xxx, das alle Beziehungen zwischen einer Haupttabelle (wie der Produkttabelle) und Referenztabellen (wie ProductType oder ProductDescriptionByLanguage) abbildet. Dadurch wird eine Ansicht erstellt, mit der ich ein Produkt abrufen und alle Details von seinen Fremdschlüsseln in seine Beschreibung übersetzen kann. Dann kann ich mit einem ORM Objekte erstellen, um auf einfache Weise Gitter, Kombinationsfelder usw. zu erstellen.
Stellen Sie sich das als Refactoring Ihres Datenbankschemas vor.
Ich denke zuerst. Um die Komplexität der Abfrage zu verbergen. Es ist sehr gut für Ansichten geeignet. Wie beim Normalisieren von Datenbanktabellen zunimmt. Das Abrufen von Daten ist jetzt sehr schwierig, wenn die Anzahl der Tabellen zunimmt. Die beste Vorgehensweise ist das Folgen von Ansichten. Wenn ich falsch liege, korrigieren Sie mich.
Wir erstellen eine Ansicht, um den Zugriff auf alle Zeilen / Spalten in einer Tabelle einzuschränken oder einzuschränken. Wenn der Eigentümer möchte, dass nur bestimmte oder begrenzte Zeilen / Spalten gemeinsam genutzt werden müssen, erstellt er eine Ansicht mit diesen Spalten.
Aus Sicherheitsgründen: Erteilt jedem Benutzer die Berechtigung, nur über eine kleine Anzahl von Ansichten auf die Datenbank zuzugreifen, die die spezifischen Daten enthalten, zu deren Anzeige der Benutzer oder die Benutzergruppe berechtigt ist, wodurch der Benutzerzugriff auf andere Daten eingeschränkt wird.
Einfachheit für Abfragen und Struktur : Eine Ansicht kann Daten aus mehreren Tabellen zeichnen und eine einzelne Tabelle darstellen, wodurch die Informationen vereinfacht werden und Abfragen mit mehreren Tabellen in Abfragen mit einer Tabelle für eine Ansicht umgewandelt werden. Außerdem erhalten Benutzer eine spezifische Ansicht der Datenbankstruktur und können diese präsentieren Die Datenbank als eine Reihe von virtuellen Tabellen, die für bestimmte Benutzer oder Benutzergruppen spezifisch sind.
So erstellen Sie eine konsistente Datenbankstruktur : Ansichten zeigen ein konsistentes, unverändertes Bild der Datenbankstruktur, auch wenn zugrunde liegende Quelltabellen geändert werden.