Do czego służą widoki?

Staram się tylko dowiedzieć, Do czego służą widoki w Rdbmsach. Oznacza to, że wiem, co to jest widok i jak go stworzyć. Wiem też, do czego ich używałem w przeszłości.

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

  1. do czego służy widok?
    • czy są sytuacje, w których kuszące jest używanie widoku, gdy nie powinno się używać jeden?
    • Dlaczego miałbyś używać widoku zamiast czegoś w rodzaju funkcji o wartości tabelarycznej lub odwrotnie?
    • czy są jakieś okoliczności, że Widok może być przydatny, które nie są widoczne na pierwszy rzut oka?

(i dla przypomnienia, niektóre z tych pytań są celowo naiwne. Jest to częściowo Kontrola koncepcji.)

Author: Jason Baker, 2008-10-18

14 answers

1) do czego służy widok?

IOPO Tylko w jednym miejscu

•niezależnie od tego, czy chodzi o dane, czy o zapytania odwołujące się do połączonych tabel, korzystanie z widoku pozwala uniknąć niepotrzebnej nadmiarowości.

•widoki stanowią również warstwę abstrakcyjną uniemożliwiającą bezpośredni dostęp do tabel (i wynikające z tego powiązania odwołują się do fizycznych zależności). Myślę, że to dobra praktyka.1 aby oferować tylko abstrakcyjny dostęp do twojego danych bazowych (przy użyciu widoków i funkcji o wartości tabelarycznej), w tym widoków takich jak

CREATE VIEW AS
      SELECT * FROM tblData


1przyznam, że w tej poradzie jest sporo "róbcie co mówię, a nie jak robię";)

2) Czy istnieją sytuacje, w których kuszące jest używanie widoku, gdy nie powinno się go używać?

Wydajność w widoku łączników była kiedyś problemem (np. SQL 2000). Nie jestem ekspertem, ale nie martwiłem się o to od jakiegoś czasu. (Nie mogę też myśleć, gdzie obecnie używam / align = "left" / )

inną sytuacją, w której Widok może być przesadny, jest sytuacja, gdy widok jest odwoływany tylko z jednej lokalizacji wywołania, a 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 / odwoływany tylko raz.

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

3) Dlaczego zamiast funkcji o wartości tabelkowej można użyć widoku lub vice versa?

(poza względami wydajności) funkcja o wartości tabelarycznej jest funkcjonalnie równoważna z parametryzowanym widokiem. W rzeczywistości powszechnym prostym przypadkiem użycia funkcji o wartości tabelarycznej jest dodanie filtra klauzuli WHERE do już istniejącego widoku w jednym obiekcie.

4) czy są jakieś okoliczności, że Widok może być przydatny, które nie są widoczne na pierwszy rzut oka?

Nie przychodzi mi do głowy żadne pozorne użycie czubka mojej głowy. (Przypuszczam, że gdybym mógł, to by ich uwidoczniło;)
 37
Author: 6eorge Jetson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 00:24:08

W pewnym sensie widok jest jak interfejs. Możesz zmieniać strukturę tabeli, ale Widok daje możliwość, aby kod nie musiał się zmieniać.

Widoki są miłym sposobem na dostarczenie czegoś prostego do zgłaszania pisarzy. Jeśli Twoi użytkownicy biznesowi chcą uzyskać dostęp do danych z czegoś takiego jak Crystal Reports, możesz dać im kilka widoków na ich koncie, które upraszczają dane-może nawet je denormalizują.

 43
Author: Lou Franco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-17 23:08:20

Widoki mogą być używane do zapewnienia bezpieczeństwa (np.: użytkownicy mogą mieć dostęp do widoków, które mają dostęp tylko do niektórych kolumn w tabeli), widoki mogą zapewnić dodatkowe bezpieczeństwo dla aktualizacji, wstawek itp. Widoki zapewniają również sposób na aliasy nazw kolumn (podobnie jak sp), ale widoki są bardziej izolacją od rzeczywistej tabeli.

 20
Author: schmoopy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-17 23:09:25

W pewnym sensie poglądy denormalizują. Denormalizacja jest czasami konieczna, aby dostarczyć dane w bardziej znaczący sposób. To właśnie robi wiele aplikacji poprzez modelowanie domen w swoich obiektach. Pomagają one prezentować dane w sposób bardziej dopasowany do perspektywy biznesowej.

 17
Author: Kilhoffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-17 23:47:58

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 wysyłają źle zaprojektowanych zapytań z paskudnymi kartezjańskimi połączeniami, które niszczą Twój serwer bazy danych.

 11
Author: gsarnold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 01:23:38

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

Jako przykład, zamiast w aplikacji wykonującej:

Sql = " select a, b from table1 union select a, b from table2";

Mógłbyś to streścić do widoku:

Utwórz widok union_table1_table2_v jako
wybierz a, b z table1
Unia
wybierz a, b z table2

I w kod aplikacji, wystarczy mieć:

Sql = "select A, b from union_table1_table2_v";

Również jeśli struktury danych kiedykolwiek się zmienią, nie będziesz musiał zmieniać kodu aplikacji,przekompilować i ponownie wdrożyć. po prostu zmieniłbyś widok w db.

 9
Author: CodingWithSpike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-17 23:55:16

OP zapytał, czy są sytuacje, w których używanie widoku może być kuszące, ale nie jest to właściwe.

To, do czego nie chcesz używać widoku, jest substytutem złożonych złączeń. Oznacza to, że nie pozwól, aby twój nawyk programowania proceduralnego polegający na rozkładaniu problemu na mniejsze kawałki doprowadził cię do użycia kilku widoków połączonych ze sobą zamiast jednego większego połączenia. Spowoduje to utratę wydajności silnika bazy danych, ponieważ zasadniczo wykonuje kilka oddzielnych zapytań, a nie jedno większy.

Na przykład, załóżmy, że musisz połączyć tabele A, B, C I d razem. Możesz być kuszony, aby zrobić widok z tabel A i B i widok z C I D, a następnie połączyć oba widoki razem. O wiele lepiej jest po prostu dołączyć A, B, C i D w jednym zapytaniu.

 6
Author: Barry Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 00:01:56

Widoki mogą scentralizować lub skonsolidować dane. 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. To, co zrobimy w takich okolicznościach, to utworzenie widoku w bazie danych tej aplikacji, który pobiera dane z bazy danych, w której dane są naprawdę przechowywane, aby zapytania, które piszemy, nie wyglądały jakby przeglądali różne bazy danych.

 5
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 23:29:29

Odpowiedzi na razie są poprawne - widoki są dobre dla zapewnienia bezpieczeństwa, denormalizacji (chociaż jest wiele bólu w dół tej drogi, jeśli zrobione źle), abstrakcji modelu danych, itp.

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

 4
Author: SquareCog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 00:07:07

Widoki zapisują wiele powtarzających się złożonych poleceń JOIN w skryptach SQL. Możesz po prostu zamknąć złożone połączenie w jakimś widoku i wywołać je w instrukcji SELECT w razie potrzeby. Czasami byłoby to przydatne, proste i łatwiejsze niż wypisywanie poleceń join w każdym zapytaniu.

 3
Author: mohammedn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 20:09:51

Widok jest po prostu zapisaną, nazwaną instrukcją SELECT. Pomyśl o widokach takich jak funkcje biblioteki.

 2
Author: Gaius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-01 14:31:04

Chciałem podkreślić wykorzystanie widoków do raportowania. Często dochodzi do konfliktu między normalizacją tabel bazy danych w celu przyspieszenia wydajności, szczególnie w przypadku edycji i wstawiania danych (zastosowania OLTP), a denormalizacją w celu zmniejszenia liczby połączeń tabel dla zapytań do raportowania i analizy (zastosowania OLAP). Z konieczności OLTP zazwyczaj wygrywa, ponieważ wprowadzanie danych musi mieć optymalną wydajność. Tworzenie widoków, a następnie, dla optymalnej wydajności raportowania, może pomóc zadowolić obie klasy użytkowników (wprowadzanie danych i przeglądanie raportów).

 1
Author: DOK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 00:08:07

Pamiętam bardzo długą selekcję, która obejmowała kilka związków. Każdy związek zawierał dołączenie do tabeli cenowej, która była tworzona w locie przez SELECT, który był sam w sobie dość długi i trudny do zrozumienia. Myślę, że dobrym pomysłem byłoby mieć pogląd, że do stworzenia tabeli cenowej. Skróciłoby to ogólną selekcję o około połowę.

Nie wiem, czy DB oceni widok raz, czy po każdym wywołaniu in. Ktoś wie? Jeśli ten pierwszy, używając widoku poprawiona wydajność.

 1
Author: SeaDrive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 17:33:43

Anytime you need [my_interface]!= [user_interface].

Przykład:

TABELA A:

  • id
  • info

Widok dla tabeli a:

  • Informacje O Kliencie

Jest to sposób na ukrycie id przed klientem i zmianę nazwy informacji na bardziej wyrazistą nazwę obu naraz.

Widok użyje indeksu bazowego dla identyfikatora klucza głównego, więc nie zobaczysz utraty wydajności, tylko lepszą abstrakcję zapytania select.

 0
Author: HumbleWebDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-15 20:04:53