Niektórzy z moich kolegów powiedzieli mi, że logika biznesowa w procedurach przechowywanych w bazie danych narusza trójdzielną architekturę separacji, ponieważ baza danych należy do warstwy danych, podczas gdy procedury przechowywane są logiką biznesową.
Myślę, że świat byłby bardzo ponurym miejscem bez przechowywanych procedur.
Czy naprawdę naruszają trzypoziomową separację?
business-logic
n-tier
layers
stored-procedures
separation-of-concerns
Tulains Córdova
źródło
źródło
Odpowiedzi:
Twoi koledzy łączą architekturę z implementacją.
Idea wielopoziomowej aplikacji polega na tym, że jest ona podzielona na części, które obejmują niektóre rodzaje przetwarzania (pamięć, logika biznesowa, prezentacja) i komunikują się ze sobą za pomocą dobrze zdefiniowanych interfejsów. Tak jak z powodzeniem można robić rzeczy, które przypominają programowanie obiektowe w językach innych niż obiektowe, tak samo można robić to samo z wieloma warstwami w jednym środowisku, na przykład z serwerem bazy danych. To, co łączy jedną z tych osób z powodzeniem, to potrzeba opieki, dyscypliny i zrozumienia związanych z tym kompromisów.
Spójrzmy na trójwarstwową aplikację, w której dwie warstwy zostały zaimplementowane w bazie danych:
INSERT
,UPDATE
,DELETE
iSELECT
).Jest to całkowicie akceptowalny model, ale ma pewne kompromisy. Logika biznesowa jest zaimplementowana w sposób, który zapewnia szybki i łatwy dostęp do warstwy danych i może pozwolić na robienie rzeczy, które musiałyby być wykonane „na twardo” przez warstwę logiki poza bazą danych. To, czego się poddajesz, to możliwość łatwego przeniesienia jednej z warstw do innej technologii i bezproblemowe wdrożenie (tj. Musisz zachować szczególną ostrożność, aby warstwy nie korzystały z udogodnień dostępnych w bazie danych, ale poza zdefiniowanymi interfejsami) .
To, czy tego rodzaju rzeczy i wynikające z nich kompromisy są dopuszczalne w danej sytuacji, jest czymś, co ty i twoi koledzy musicie ustalić na podstawie własnego osądu.
źródło
SELECT
bezpośrednio z tabel (warstwa danych) model został uszkodzony.Procedury przechowywane są na tyle potężne, że pozwalają zakodować naruszenie trzypoziomowej separacji poprzez wprowadzenie logiki biznesowej do warstwy RDBMS. Jest to jednak twoja decyzja, a nie nieodłączna wada procedur przechowywanych. Możesz ograniczyć swoje SP do obsługi potrzeb twojej warstwy danych, zachowując logikę aplikacji w warstwie aplikacji twojej architektury.
Istnieje rzadki, ale ważny wyjątek od reguły separacji, gdy potrzebne są procedury składowane (w szczególności grupa wyzwalaczy) do zawarcia logiki biznesowej. Dzieje się tak, gdy aplikacja musi generować wiele agregacji danych w locie, które dotykają milionów wierszy. W takich przypadkach można skonfigurować wyzwalacze, aby zachować wstępnie zagregowane dane na potrzeby korzystania z warstwy biznesowej. Należy to zrobić tylko w sytuacjach, gdy bez wstępnej agregacji aplikacja byłaby niedopuszczalnie wolna.
źródło
Porady Atwooda z 2004 roku są prawdziwe do dziś, tylko teraz mamy również korzyści z ORM.
http://blog.codinghorror.com/who-needs-stored-procedures-anyways/
źródło
Krótkie streszczenie: To naprawdę zależy od korzystania z procedur przechowywanych i wymagań biznesowych.
Istnieje wiele projektów wykorzystujących architekturę trójwarstwową, w zależności od charakteru wymagań biznesowych może zaistnieć potrzeba przeniesienia niektórych operacji na warstwę danych.
Mówiąc o terminologii, ogólnie mówiąc, poziomy te opisane są jako:
Zwykle dla danej architektury warstwa środkowa lub warstwa usług biznesowych składa się z reguł biznesowych i danych. Czasami jednak duże znaczenie ma przesunięcie ciężkich operacji bazowych i / lub reguł danych, które należy wykonać w warstwie danych - poprzez zestaw procedur przechowywanych.
Zalety trójwarstwowych konstrukcji to:
Dlatego tak naprawdę jest to podejście oparte na analizie przypadków, które samo w sobie ma kompromisy. Jednak wytyczne projektowe Microsoft trójwarstwowego modelu architektury zalecają utrzymanie logiki biznesowej na środkowym poziomie.
źródło
Poziom faktycznie oznacza inną maszynę, warstwa oznacza inną logiczną separację. Dzięki procedurom przechowywanym warstwa danych i (przynajmniej część) warstwa logiki biznesowej znajdują się w tej samej warstwie. Umieszczenie logiki biznesowej w procedurach przechowywanych narusza architekturę 3-zmęczoną, ale jest wątpliwe, czy narusza architekturę 3-warstwową; jedną pewną rzeczą jest to, że z pewnością nie jest to dobry przykład rozdzielenia obaw.
Moim zdaniem istnieją dwa główne problemy z budowaniem logiki biznesowej w bazie danych:
Kod i biblioteki: mniej programistów będzie w stanie programować w SQL, PL / SQL, TSQL itp. Niż w C #, Java itp. Języki programowania mają również tę zaletę, że mają świetne IDE, świetne biblioteki i frameworki.
Skalowalność w poziomie: jedynym sposobem na skalowanie systemu jest zmiana fizycznego serwera, na którym baza danych jest mocniejsza, co jest dość drogie (serwer z 64 GB pamięci RAM); relacyjne bazy danych skalują się w poziomie bardzo źle, a nawet przy większych wydatkach. Natomiast dzięki logice biznesowej na serwerze zbudowanym z OO można całkiem dobrze skalować w poziomie, umieszczając serwer na wielu węzłach (w Javie wiele serwerów aplikacji to obsługuje).
źródło
Mieliśmy tę debatę w naszym biurze jakiś czas temu, opowiadałem się za rozwojem baz danych, mam na to pogląd
Najsilniejszy argument, który twórcy aplikacji podają, że logika biznesowa powinna być niezależna od bazy danych, aby można ją było łatwo zmienić. Myślę, że jeśli firma korzysta z Oracle, dlaczego zamiast tego przestawi się na inną technologię, bardziej spodziewane są szanse na utratę logiki aplikacji. Problem polega głównie na tym, że brakuje nowych talentów zasobów bazy danych, głównie faceci zaczną proste strony internetowe, na których używają mysql lub sqlserver. Ci faceci stają się następnie starszymi leadami i mają emocjonalne przywiązanie do warstwy aplikacji :) nawet nie chcą rozumieć ani debatować.
źródło