Jestem pewien, że nie tylko ja denerwuję się, gdy widzą stronę kodu zaśmieconą zapytaniami SQL. ActiveRecord i inne wzorce ORM pomagają złagodzić dużą liczbę SQL używanych w projekcie, ale w wielu przypadkach złożonych zapytań użycie SQL wydaje się być nieuniknione.
Szukam opinii na temat tego, jak zapytania SQL powinny być zorganizowane z resztą kodu (lub zewnętrznie do niego), aby nie rozproszyć go po całym miejscu? Jednym oczywistym pomysłem jest użycie widoków, ale często widoki mogą być źródłem problemów z wydajnością w przypadku wielu dużych tabel indeksowanych itp.
EDYCJA 1 - Zakładam, że już go rozdzieliłeś na warstwę modelu
sql
code-formatting
jellyfishtree
źródło
źródło
Odpowiedzi:
Dla mnie SQL jest podstawową częścią (w wielu przypadkach większości) kodu logiki biznesowej. Jeśli spróbujesz oddzielić go od kodu, który działa na zwracanych danych, będziesz bardziej podatny na niezrównoważenie zrozumiałości i możliwości utrzymania kodu.
Gdy na to patrzę, odczytywanie danych, przetwarzanie danych, zapisywanie danych, wyszukiwanie danych ... to wszystko są podobne operacje i najlepiej trzymać je w tym samym miejscu.
Jeśli zaczniesz wyczuwać powielanie wysiłków za pomocą zapytań, być może potrzebujesz widoku bazy danych lub obiektu, który może obejmować ten aspekt dostępu do bazy danych.
Inną wskazówką jest posiadanie dobrej metody zapytania do bazy danych. W oprogramowaniu, które piszę (PostgreSQL, MySQL, SQL Server), zapewniłem, że większość moich zapytań może odbywać się jako pojedyncza instrukcja kodu.
Są to (z grubsza) główne wywołania funkcji, które, jak zapewniam, są częścią mojego „obiektu połączenia”. To zależy od języka, co faktycznie wdrażasz, ale moim celem jest, aby było naprawdę, naprawdę proste i bezbolesne.
Podsumowując, traktuj SQL jako natywną część programowania, a nie abstrakty dla samej abstrakcji.
źródło
Ogólnie rzecz biorąc, najlepszym rozwiązaniem jest posiadanie oddzielnej warstwy modelu. Istnieje wiele wzorców projektowych dla przedsiębiorstw, które dają sposoby na zaprojektowanie tego.
źródło
Dobrym pomysłem może być podzielenie warstwy modelu na 3 podwarstwy - „podmioty”, „repozytoria” i „usługi”. Zapewni to rozdzielenie problemów i zebranie SQL w jednym miejscu, poza logiką biznesową.
W tym scenariuszu cały kod pobierania danych, w tym złożony SQL - będzie znajdować się w repozytoriach. Dlatego celem repozytorium jest ukrycie złożonych instrukcji SQL za oczywistymi metodami, takimi jak
getUsersWithActiveSubscription()
.Encje streszczają prawdziwe nazwy pól tabeli DB z modułami pobierającymi i ustawiającymi, mogą zapewniać konwersję danych między typami pól DB i typami dostępnymi w języku aplikacji / programowania. Jeśli twój ORM to obsługuje - podmioty mogą obsługiwać powiązania.
Warstwa serwisowa to miejsce logiki biznesowej. Usługa pobiera podmioty korzystające z repozytoriów, działa na nie i przechowuje je z powrotem.
źródło