Zawsze odbywa się debata na ten temat - „Czy logikę biznesową należy zastosować w procedurze składowanej, czy nie?”. Jeśli zdecydujemy się nie używać narzędzia ORM i nie umieszczać logiki biznesowej w procedurze przechowywanej, to gdzie powinniśmy umieścić logikę biznesową?
W moich poprzednich aplikacjach zawsze wolałem umieszczać całą logikę biznesową tylko w procedurach przechowywanych. Następnie z kodu .NET wywołuję te Procedury składowane za pomocą bloków aplikacji dostępu do danych. SQLHelper itp. Ale nie zawsze tak może być. Zrobiłem trochę googlingu, ale skończyło się na zamieszaniu .......
Wszelkie sugestie ...?
Odpowiedzi:
Przyjąłbym pragmatyczne podejście - historycznie główna „korzyść” z utrzymania logiki biznesowej w przechowywanych procesach jest spowodowana wydajnością (architektura warstwy 2,5), podczas gdy podział logiki biznesowej na warstwę BLL (warstwa 3 / N) jest ogólnie czystszy od perspektywa konserwacji i łatwiejsza do przetestowania (Mock / Stub out dostęp do danych).
Biorąc jednak pod uwagę, że ORMS .NET z włączoną obsługą LINQ, takie jak LINQ2SQL, EF i NHibernate, tworzą teraz sparametryzowane zapytania SQL, w których można buforować plany zapytań, są zabezpieczone przed wstrzykiwaniem SQL itp., Zgaduję, że przejście do architektury warstwy 3 / N jest bardziej atrakcyjne niż kiedykolwiek, a większości SPROC (szczególnie tych zorientowanych na zapytania) można całkowicie uniknąć. Wzorce repozytoriów w .NET często ujawniają parametry drzewa wyrażeń IQueryable / accept, pozwalając na bezpieczny, ale elastyczny dostęp do twoich tabel. (Osobiście w architekturach typu SOA nie ujawniłbym IQueryable poza BLL, tzn. Twoje warstwy usług i prezentacji powinny działać z dobrze zdefiniowanym zestawem metod. Powodem jest to, że w przeciwnym razie nigdy nie możesz w pełni przetestować swojego systemu, a wygrałeś
Jednak w systemie o przyzwoitych rozmiarach zawsze będzie kilka wyjątków, w których naprawdę intensywny pod względem danych fragment kodu może nadal wymagać zapisania jako przechowywany procesor ze względu na wydajność. W takich przypadkach zatrzymałbym SPROC i ujawniłbym SPROC poprzez ORM, ale nadal ujawniałbym funkcję jako metodę tranzytową na twojej BLL.
źródło
Będąc programistą Java, wolałem umieścić logikę biznesową w BLL (miła i łatwa kontrola źródła, znajomość itp. Itd.).
Jednak po pracy w dużym przedsiębiorstwie z wieloma aplikacjami rozproszonymi korzystającymi z różnych technologii (C #, Java, Pick (nie pytaj)) stała się widoczna jedna znacząca korzyść z korzystania z procedur przechowywanych:
Procedury przechowywane mogą być współużytkowane przez różne aplikacje .
źródło
Nasz zespół ma tutaj łagodną zasadę. Czasami lepiej jest rozwiązać logikę biznesową w T-SQL, czasem łatwiej jest to zrobić w c # (warstwa biznesowa).
Mamy więc pragmatyczne rozwiązanie: postaw tam, gdzie lepiej pasuje. Wiem, że teoria jest czasem bardzo surowa ... ale taka jest teoria :-)
źródło
Są zarówno zalety, jak i wady (moim zdaniem):
Procedury składowane mogą stać się koszmarem, jeśli nie używasz jakiejś kontroli źródła SQL (czego nie ma wiele miejsc) i pracujesz nad nimi wielu programistów. Ktoś może zmienić procedurę przechowywaną i zapomnieć o aktualizacji kodu wywołującego tę procedurę, a zanim się zorientujesz, właśnie zbudowałeś i wdrożyłeś witrynę, która będzie generować nieobsługiwane wyjątki (niedopasowanie liczby parametrów itp.).
Z drugiej strony, procedury składowane pozwalają na szybsze usuwanie błędów w niektórych sytuacjach. Jeśli występuje błąd w procedurze przechowywanej, wystarczy go naprawić i gotowe. Poprawka błędu w ORM wymaga przebudowy. W zależności od procesu kompilacji może to być długotrwałe / irytujące.
źródło
Zawsze umieszczamy naszą logikę biznesową w warstwie logiki biznesowej. Jeśli umieścisz go w procedurze przechowywanej, zostanie on utracony po zmianie RDBMS.
źródło
„Logika biznesowa” jest nieco niejasnym terminem. Mam na myśli, że nie ma jednej definicji. Zasadą jest minimalizowanie komunikacji między poziomami, gdy jest to możliwe. Nie trzeba więc wysyłać pustej nazwy klienta na serwer, aby ją sprawdzić przed wstawieniem wiersza.
Zdarzają się przypadki, gdy reguła oparta jest na odczycie bazy danych. Załóżmy, że chcesz przelać pieniądze z konta 1 na konto 2. Musisz przeczytać oba konta, upewnić się, że są w dobrym stanie i że kwota na koncie 1 jest wystarczająca. W takim przypadku serwer jest lepszym kandydatem na tę regułę, ponieważ klient (tutaj BL) nie musi wydawać 3 wywołań do warstwy bazy danych dla tego procesu.
Oczywiście, jeśli potrzebujesz, aby twoje rozwiązanie było niezależne od bazy danych, wykonaj przechowywane procesy tylko dla CRUD (jeśli w ogóle są używane).
źródło
Logika powinna zawsze znajdować się w BLL, ponieważ:
Uważam, że powinno istnieć prawo, które mówi, że gdy SP ma więcej niż X linii, nie działa zgodnie z przeznaczeniem.
źródło
Tworzymy warstwę usług, która zawiera całą naszą logikę biznesową zaimplementowaną w wybranym języku i używamy bazy danych tylko do zapytań. Takie podejście jest w pewnym stopniu przez nas obowiązkowe, ponieważ naszym celem jest tworzenie rozwiązań COTS do dostarczania aplikacji z różnymi implementacjami baz danych. W tych okolicznościach Hibernacja okazała się dla nas ratunkiem.
Myślę, że największą zaletą tego podejścia, oprócz przenośności bazy danych, jest to, że wszystkie odpowiedzi można znaleźć w jednym wyszukiwaniu.
Ponadto, pomimo niektórych odpowiedzi na forum, mam przyjaciela pracującego dla firmy ubezpieczeniowej Fortune 100, która dokonała 2 konwersji bazy danych w ciągu trzech lat, ponieważ baza danych dla firmy uległa zmianie.
źródło
Z mojego ograniczonego doświadczenia wolę zachować integralność danych dzięki procedurom przechowywanym i innym funkcjom bazy danych. Na przykład, gdybym realizował transfer środków między dwoma kontami, napisałbym procedurę składowaną. Uważam, że warto używać wielu języków aplikacji.
źródło