Używanie widoków w procedurach MS SQL

0

Czy dobrą praktyką jest używanie w procedurach zdefiniowanych wcześniej widoków?

Powody dla których się nad tym zastanawiam to:

  • nie powielanie raz już napisanego kodu
  • czytelniejsze jest dla mnie wywołanie procedury z parametrami niż SELECT'a z warunkami

Przykład:
Mam ogólny widok wyświetlający dane z wielu tabel z pewnego obszaru rzeczywistości aplikacji. Np. wszystkie zamówienia z tego miesiąca wraz z danymi firmy.
Procedura ma za zadanie wyświetlenie konkretnych informacji na podstawie przekazanych parametrów. Np. wyświetlenie zamówienia konkretnej firmy z danego dnia tego miesiąca. Czy w takim razie użycie widoku w tej procedurze będzie zasadne?

Jak to wygląda w praktyce? Czy jest to dobre podejście? Czy należy unikać tego typu rozwiązań?

2

Zaraz się dowiesz że robienie logiki w bazie (procedur) jest złe. Tak naprawdę to zależy, jak dużo tej logiki tam wsadzisz.

4
travis.chigurh napisał(a):

Czy dobrą praktyką jest używanie w procedurach zdefiniowanych wcześniej widoków?

Generalnie tak, ale trzeba uważać.
Poza tym, jak przetwarzane są zapytania do widoków zależy od bazy danych.
W MSSQL jest całkiem dobrze.

Powody dla których się nad tym zastanawiam to:

  • nie powielanie raz już napisanego kodu
  • czytelniejsze jest dla mnie wywołanie procedury z parametrami niż SELECT'a z warunkami

Procedura zwracająca dane to generalnie głupota w MSSQL.
Jest całkowicie zamknięta, nie da się wprost łączyć zwróconych danych z innymi (mam na myśli jakiekolwiek złączenia).
Zdecydowanie lepszym pomysłem jest po prostu User Definied Functions, a takie które zwracają tzw. derived tables działają tak jakby sparametryzowane widoki - czyli szybko.

Przykład:
Mam ogólny widok wyświetlający dane z wielu tabel z pewnego obszaru rzeczywistości aplikacji. Np. wszystkie zamówienia z tego miesiąca wraz z danymi firmy.

Stop, stop.
Na cholerę w widoku warunek na ten miesiąc?
I co potem - następny widok na poprzedni/następny miesiąc/rok/kwartał?
Dlaczego widok bez warunku na datę i ten warunek nakładasz wybierając dane z widoku - po prostu.
Tak, działa to w MSSQL bardzo dobrze.

Generalna rada - pisz ogólne widoki.
A zresztą - pisz ogólny kod :)

Procedura ma za zadanie wyświetlenie konkretnych informacji na podstawie przekazanych parametrów. Np. wyświetlenie zamówienia konkretnej firmy z danego dnia tego miesiąca. Czy w takim razie użycie widoku w tej procedurze będzie zasadne?

Zdecydowanie użycie widoku jest zasadne a procedury bezzasadne.
Zamiast wykonać:

exec pDawajZamowieniaDlaFirmyZdanegoDnia(@IdFirmy int, @Data date)

robisz:

select * from WidokZamowien where IdFirmy = @IdFirmy and Data = @Data

Jak to wygląda w praktyce? Czy jest to dobre podejście? Czy należy unikać tego typu rozwiązań?

Na początek unikałbym takich anemicznych procedur.
Nigdy nie rozumiałem co autor takiej procedury miał na myśli - po co to?

0

@wloochacz dzięki za feedback :)

A jak to wygląda z poziomu enkapsulacji i bezpieczeństwa? Mam na myśli użycie jednego z tych rozwiązań (widok vs procedura) w metodach wyższego rzędu w aplikacji (np. do pobierania danych). Czy w tym wypadku taka procedura nawet "anemiczna" nie jest lepszym rozwiązaniem?

0

Może Ty mi wytłumaczysz: przychodzi tu mnóstwo początkujących SQlowców, potykają się z mniej czy bardziej podstawami, ale bardzo dokładnie wiedzą, ze PROCEDURA jest lekarstwem na wszystko.

To jakiś modny kanał na YT, czy coooo ???

1
travis.chigurh napisał(a):

@wloochacz dzięki za feedback :)

A jak to wygląda z poziomu enkapsulacji i bezpieczeństwa? Mam na myśli użycie jednego z tych rozwiązań (widok vs procedura) w metodach wyższego rzędu w aplikacji (np. do pobierania danych). Czy w tym wypadku taka procedura nawet "anemiczna" nie jest lepszym rozwiązaniem?

Nie jest. Niby czemu miałaby być?
Procedury służą raczej do modyfikowania danych. Do ich wybierania są selecty (lub widoki, które mają za zadanie jedynie ułatwić zarządzanie kodem), lub ewentualnie funkcje, jeśli potrzebujesz w trakcie odpytywania bazy przeanalizować, przetworzyć dane, a nie jesteś w stanie tego sensownie zrobić selectem.

1

Nie, nauczyli się tak działać w jakimś PHP, albo innym turbo Pascalu, i myślą, że w SQLu jest dokładnie tak samo.

Uzupełnię Cię @Fac
SQL nie jest językiem sekwencyjnym (w głównym swoim rdzeniu) a deklaratywnym, więc procedura odczytowa nie jest dobrą enkapsulacją, idzie "w poprzek" głównej idei, rozsadza ją można powiedzieć.

Ale za to widok (coś deklaratywnego) jest przeniesieniem oczekiwań nt enkapsulacji nie gwałcąc głównej filozofii

0
AnyKtokolwiek napisał(a):

Może Ty mi wytłumaczysz: przychodzi tu mnóstwo początkujących SQlowców, potykają się z mniej czy bardziej podstawami, **ale bardzo dokładnie wiedzą, ze PROCEDURA jest lekarstwem na wszystko.
**

Właśnie nie wiem. Stąd ten post i pytanie.

Chętnie zobaczę Twoje repozytorium i czegoś się nauczę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1