Do czego służą widoki?

87

Próbuję tylko uzyskać ogólne pojęcie o tym, do czego służą widoki w RDBMS. To znaczy, wiem, czym jest widok i jak go stworzyć. Wiem też, do czego ich używałem w przeszłości.

Ale chcę się upewnić, że dokładnie rozumiem, do czego widok jest przydatny, a do czego nie powinien. Dokładniej:

  1. Do czego służy widok?
    • Czy są sytuacje, w których kuszące jest użycie widoku, którego nie należy używać?
    • Dlaczego miałbyś używać widoku zamiast czegoś takiego jak funkcja o wartościach tabelarycznych lub odwrotnie?
    • Czy są jakieś okoliczności, w których widok może być przydatny, a które nie są widoczne na pierwszy rzut oka?

(Dla przypomnienia, niektóre z tych pytań są celowo naiwne. Po części jest to weryfikacja koncepcji).

Jason Baker
źródło
1
podobne do pytania zamieszczonego tutaj: stackoverflow.com/questions/1278521/…
MedicineMan
Wydaje mi się, że stackoverflow.com/questions/1278521/ ... zapewniają lepsze odpowiedzi na to pytanie.
GinTonic

Odpowiedzi:

42

1) Do czego służy widok?

IOPO tylko w jednym miejscu

• Niezależnie od tego, czy rozważasz same dane, czy zapytania odwołujące się do połączonych tabel, wykorzystanie widoku pozwala uniknąć niepotrzebnej nadmiarowości.

• Widoki zapewniają również warstwę abstrakcji uniemożliwiającą bezpośredni dostęp do tabel (i wynikające z tego kajdanki odwołujące się do fizycznych zależności). W rzeczywistości uważam, że dobrą praktyką 1 jest oferowanie tylko abstrakcyjnego dostępu do danych bazowych (przy użyciu widoków i funkcji wycenianych w tabeli), w tym widoków takich jak 1 Muszę przyznać, że jest dużo „Rób tak, jak mówię; nie tak, jak ja zrobić "w tej radzie;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Czy są sytuacje, w których kuszące jest użycie widoku, którego nie należy używać?

Kiedyś problemem była wydajność w kontekście łączenia (np. SQL 2000). Nie jestem ekspertem, ale od jakiegoś czasu się tym nie martwię. (Nie mogę też myśleć o tym, gdzie obecnie używam połączeń widoków).

Inną sytuacją, w której widok może być przesadzony, jest sytuacja, w której odwołanie do widoku jest tylko z jednej wywołującej lokalizacji i zamiast tego można użyć tabeli pochodnej. Podobnie jak typ anonimowy jest lepszy od klasy w .NET, jeśli typ anonimowy jest używany / przywoływany tylko raz.

    • Zobacz opis tabeli pochodnej w http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Dlaczego miałbyś używać widoku zamiast czegoś takiego jak funkcja o wartościach tabelarycznych lub odwrotnie?

(Oprócz powodów związanych z wydajnością) Funkcja wyceniana w tabeli jest funkcjonalnym odpowiednikiem sparametryzowanego widoku. W rzeczywistości typowym przypadkiem użycia funkcji wycenianej w tabeli jest po prostu dodanie filtru klauzuli WHERE do już istniejącego widoku w pojedynczym obiekcie.

4) Czy są jakieś okoliczności, w których widok może być przydatny, a które nie są widoczne na pierwszy rzut oka?

Nie przychodzą mi do głowy żadne niewidoczne zastosowania czubka głowy. (Myślę, że gdybym mógł, to by je ujawniło;)
6eorge Jetson
źródło
9
Nie zgodziłbym się, że ma sens tworzenie widoku w tabeli, gdy jest to SELECT * FROM tblData. Czy możesz wyjaśnić, dlaczego byłoby to korzystne?
Zarejestrowany użytkownik
IOPO - tylko w jednym miejscu - czy to dobrze znana fraza projektowa? Nie mogę znaleźć wielu odniesień do tego? Czy ma inne formy, np. SUCHE?
Robert,
1
@Robert Tak, DRY, normalizacja, IOPO, to są różne smaki tej samej filozofii.
TylerH
45

W pewnym sensie widok jest jak interfejs. Możesz zmienić podstawową strukturę tabeli, ile chcesz, ale widok pozwala na to, aby kod nie musiał się zmieniać.

Widoki to dobry sposób na dostarczenie autorom raportów czegoś prostego. Jeśli użytkownicy biznesowi chcą uzyskać dostęp do danych z czegoś takiego jak Crystal Reports, możesz udostępnić im widoki na swoim koncie, które upraszczają dane - może nawet je denormalizują.

Lou Franco
źródło
21

Widoki mogą być używane do zapewniania bezpieczeństwa (tj .: użytkownicy mogą mieć dostęp do widoków, które mają dostęp tylko do niektórych kolumn w tabeli), widoki mogą zapewniać dodatkowe zabezpieczenia aktualizacji, wstawień itp. Widoki umożliwiają również aliasowanie nazw kolumn (podobnie jak sp), ale widoki są bardziej izolacją od rzeczywistej tabeli.

schmoopy
źródło
18

W pewnym sensie poglądy ulegają denormalizacji. Czasami konieczna jest denormalizacja, aby dane były bardziej zrozumiałe. To właśnie robi wiele aplikacji w ramach modelowania domeny w swoich obiektach. Pomagają prezentować dane w sposób bardziej zbliżony do perspektywy biznesowej.

Kilhoffer
źródło
-1 „denormalizacja wyświetleń”? przepraszam, ale to nonsens, chyba że jest w jakiś sposób kwalifikowane.
po prostu ktoś
18
Całkowicie denormalizują. Jeśli masz powiązane tabele, które są znormalizowane do trzeciej formy nomalnej i tworzysz widok, aby „spłaszczyć” tę relację, jak to nie jest denormalizacja?
Kilhoffer
11

Oprócz tego, co stwierdzili inni, widoki mogą być również przydatne do usuwania bardziej skomplikowanych zapytań SQL z aplikacji.

Na przykład zamiast w aplikacji:

sql = "wybierz a, b z tabeli1 union wybierz a, b z tabeli2";

Możesz to streścić w widoku:

utwórz widok union_table1_table2_v jako
wybierz a, b z tabeli1
union
wybierz a, b z tabeli2

aw kodzie aplikacji wystarczy:

sql = "wybierz a, b z union_table1_table2_v";

Ponadto, jeśli kiedykolwiek zmienią się struktury danych, nie będziesz musiał zmieniać kodu aplikacji, ponownie kompilować i ponownie wdrażać. po prostu zmieniłbyś widok w bazie danych.

CodingWithSpike
źródło
Dlaczego miałbym pisać złożone sql w bazie danych zamiast w aplikacji?
Ivan Virabyan
3
Im bardziej skomplikowane zapytanie, tym większe prawdopodobieństwo, że zmieni się ono w przyszłości, częściowo dlatego, że trafi do większej liczby tabel. Kiedy zmieniają się struktury bazy danych, musiałbyś także zmienić swój kod i wydać. Jeśli ta złożoność jest abstrakcyjna w widoku, administrator może być w stanie wprowadzić zmiany strukturalne w tabelach podstawowych bez konieczności zmiany kodu.
CodingWithSpike,
11

Widoki ukrywają złożoność bazy danych. Są świetne z wielu powodów i są przydatne w wielu sytuacjach, ale jeśli masz użytkowników, którzy mogą pisać własne zapytania i raporty, możesz ich użyć jako zabezpieczenia, aby upewnić się, że nie przesyłają źle zaprojektowanych zapytania z paskudnymi złączeniami kartezjańskimi, które wyłączają serwer bazy danych.

gsarnold
źródło
6

OP zapytał, czy zdarzały się sytuacje, w których kuszące byłoby użycie widoku, ale nie jest to właściwe.

To, czego nie chcesz używać widoku, jest substytutem złożonych sprzężeń. Oznacza to, że nie pozwól, aby nawyk programowania proceduralnego polegający na rozkładaniu problemu na mniejsze części prowadził Cię do korzystania z kilku połączonych widoków zamiast jednego większego sprzężenia. Spowoduje to zniszczenie wydajności silnika bazy danych, ponieważ zasadniczo wykonuje on kilka oddzielnych zapytań, a nie jedno większe.

Na przykład, powiedzmy, że musisz połączyć tabele A, B, C i D. Możesz pokusić się o zrobienie widoku z tabel A i B oraz widoku z C & D, a następnie połącz oba widoki razem. O wiele lepiej jest po prostu dołączyć A, B, C i D w jednym zapytaniu.

Barry Brown
źródło
Nie sądzę, że to prawda, przynajmniej tak nie jest w teorii DBMS (różne implementacje mogą zdecydować, że nie będą honorowane). Analizator składni kwerend zasadniczo zamieni wszystkie widoczne widoki na odpowiedni plik sql, a optymalizator przejdzie stamtąd. Te 2 przypadki powinny być równoważne.
SquareCog
Nie jest to również prawdą, gdy możesz dodawać indeksy do swoich widoków.
therealhoff
Najbardziej znam PostgreSQL, a wcześniejsze wersje nie były zbyt dobre w łączeniu zapytań. Ale nowsze są znacznie lepsze. Moja odpowiedź nie ma już tak dużego zastosowania, przynajmniej dla tego konkretnego DBMS.
Barry Brown
5

Widoki mogą centralizować lub konsolidować dane. Tam, gdzie jestem, mamy wiele różnych baz danych na kilku różnych połączonych serwerach. Każda baza danych zawiera dane dla innej aplikacji. Kilka z tych baz danych zawiera informacje, które są powiązane z wieloma różnymi aplikacjami. W takich okolicznościach utworzymy widok w bazie danych tej aplikacji, który po prostu pobiera dane z bazy danych, w której dane są naprawdę przechowywane, tak aby zapytania, które piszemy, nie wyglądały tak, jakby przechodziły przez różne bazy danych.

Joel Coehoorn
źródło
4

Dotychczasowe odpowiedzi są poprawne - widoki są dobre dla zapewnienia bezpieczeństwa, denormalizacji (chociaż jest dużo bólu na tej drodze, jeśli zostaną zrobione źle), abstrakcji modelu danych itp.

Ponadto widoki są powszechnie używane do implementacji logiki biznesowej (wygasły użytkownik to użytkownik, który nie logował się w ciągu ostatnich 40 dni, tego typu rzeczy).

SquareCog
źródło
jeśli zdenormalizujesz, wprowadzając 7 tabel referencyjnych, a następnie zapytaj o coś, co wymaga tylko jednej z tych tabel referencyjnych. To dużo zmarnowanego wysiłku. Sytuacja pogarsza się, jeśli zaczniesz dołączać do takich widoków.
SquareCog,
jesteś tego pewien? MSDN mówi: „Gdy SQL Server przetwarza zapytania, które odwołują się do widoków według nazwy, definicje widoków są zwykle rozszerzane, aż odnoszą się tylko do tabel podstawowych. Ten proces nazywa się rozszerzaniem widoku. To forma ekspansji makro ”. Wyobrażam sobie, że podczas procesu rozszerzania silnik byłby na tyle inteligentny, aby uwzględnić tylko podstawowe tabele (widoku), które są potrzebne w zapytaniu.
Anthony,
Anthony, wyobraź sobie zapytanie takie jak „select foo_col from (select foo. *, Bar. * From foo join bar on (foo.id = bar.id)”. W tym zapytaniu wewnętrzny wybór jest naszym widokiem. Nie jest to jasne, że złączenie paska można bezpiecznie porzucić (w rzeczywistości, jeśli relacja nie jest ściśle 1-1, nie może). To staje się jeszcze trudniejsze w przypadku bardziej złożonych zapytań i nie polecałbym polegać na ogólnym RDBMS, aby wykonać wszystkie przycinanie puszki człowieka. Może SQL Server może; byłbym zszokowany, gdyby MySQL to zrobił. Oracle? Postgres? Jak zawsze, w razie wątpliwości przeczytaj plan zapytań.
SquareCog
3

Widoki zapisują wiele powtarzających się złożonych instrukcji JOIN w skryptach SQL. Możesz po prostu hermetyzować skomplikowane JOIN w jakimś widoku i wywoływać je w instrukcji SELECT w razie potrzeby. Czasami byłoby to przydatne, proste i łatwiejsze niż zapisywanie instrukcji złączenia w każdym zapytaniu.

mohammedn
źródło
2

Widok to po prostu przechowywana, nazwana instrukcja SELECT. Pomyśl o widokach jak o funkcjach bibliotecznych.

Gajusz
źródło
Czy procedury składowane nie pasowałyby bardziej do tego? Czasami potrzebujesz funkcji z widokami usuwania i aktualizacji, które nie pasują do tej potrzeby. Widoki należy traktować jako abstrakcje lub sposoby ograniczania docelowego użytkownika.
HumbleWebDev
1

Chciałem podkreślić użycie widoków do raportowania. Często występuje konflikt między normalizowaniem tabel bazy danych w celu przyspieszenia wydajności, szczególnie w przypadku edycji i wstawiania danych (użycie OLTP), a denormalizacją w celu zmniejszenia liczby sprzężeń tabel dla zapytań do raportowania i analizy (zastosowania OLAP). Z konieczności OLTP zwykle wygrywa, ponieważ wprowadzanie danych musi mieć optymalną wydajność. Tworzenie widoków, w celu uzyskania optymalnej wydajności raportowania, może zatem pomóc zadowolić obie klasy użytkowników (wprowadzanie danych i przeglądarki raportów).

DOK
źródło
1

Pamiętam bardzo długi WYBÓR, który obejmował kilka UNII. Każdy UNION zawierał dołączenie do tabeli cen, która została utworzona w locie przez SELECT, który sam był dość długi i trudny do zrozumienia. Myślę, że dobrym pomysłem byłoby mieć pogląd na to, aby stworzyć tabelę cen. Skróciłoby to ogólny wybór o około połowę.

Nie wiem, czy baza danych oceni widok raz, czy za każdym razem, gdy został wywołany. Ktoś wie? W pierwszym przypadku użycie widoku poprawiłoby wydajność.

SeaDrive
źródło
Oracle CBO może zdecydować się na jednorazową ocenę widoku (materializacja, jak to nazywają) lub połączenie kodu SQL widoku z resztą instrukcji select i uruchomienie tego. Podjąłby decyzję w oparciu o niższy szacunkowy koszt.
WW.
Jeśli instrukcja select była stała przez cały czas trwania zapytania i po prostu powtórzona kilka razy, to wspólne wyrażenie tabeli (CTE) mogłoby rozwiązać problem. Dotyczy to tylko programu SQL Server 2005/2008, ponieważ nie był on dostępny w programie SQL Server 2000. Tak, widok nadal byłby wywoływany wielokrotnie.
Zarejestrowany użytkownik
@ Zarejestrowany użytkownik: CTE nie są specjalnością SQL Server. Pochodzą z DB2 i są również obecne w PostgreSQL (ponieważ są przydatne i są zgodne ze standardem ISO SQL). To, czy widok jest wbudowany, czy traktowany jako czarna skrzynka, zależy od implementacji, niektóre RDBMS są mądrzejsze od innych.
po prostu ktoś
@ just somebody: Mój komentarz był ograniczony do SQL Server 2005/2008, ponieważ nie mam doświadczenia z CTE w innych RBDMS. Ponadto komentarz został zakwalifikowany do wskazania, że ​​nie dotyczy to SQL Server 2000, ponieważ CTE nie były dostępne w SQL Server przed 2005 rokiem.
Zarejestrowany użytkownik
Inną alternatywą dla widoku byłoby wcześniejsze umieszczenie tabeli cen w tabeli tymczasowej.
SeaDrive
0

Zawsze, gdy potrzebujesz [my_interface]! = [User_interface].

Przykład:

TABELA A:

  • ID
  • info

WIDOK dla TABELI A:

  • Informacje dla klientów

w ten sposób możesz ukryć identyfikator przed klientem i jednocześnie zmienić nazwę informacji na bardziej szczegółową.

Widok użyje indeksu bazowego dla identyfikatora klucza podstawowego, więc nie zobaczysz utraty wydajności, a jedynie lepszą abstrakcję zapytania wybierającego.

HumbleWebDev
źródło