7

Egzekwowałem reguły biznesowe zarówno w mojej warstwie aplikacji (modele), jak iw mojej warstwie bazy danych (procedury składowane, które powodują błędy).Czy reguły biznesowe powinny być egzekwowane zarówno w warstwie aplikacji, jak iw warstwie bazy danych, lub tylko w jednym z dwóch?

Byłem powielania moich walidacji w obu miejscach z kilku powodów:

  1. Jeżeli warunki zmiany pomiędzy gdy są one sprawdzane w kodzie aplikacji i kiedy są sprawdzane w bazie danych, sprawdzanie reguł biznesowych w bazie danych spowoduje zapisanie dnia. Baza danych pozwala także na blokowanie różnych rekordów w prostszy sposób niż w mój kod aplikacji, więc wydaje się, że jest to naturalne, aby zrobić to tutaj.
  2. Jeśli mamy zrobić niektórych danych wsadowych wstawienia/aktualizacji do bazy danych bezpośrednio, jeśli trasie I wszystkie te operacje za pośrednictwem moich procedur przechowywanych/funkcji, które robią reguły biznesowej walidacji, nie ma szans na mnie wprowadzanie złych danych, mimo że brakuje mi zabezpieczeń, które dostałbym, gdy robiłem pojedyncze wejście przez aplikację.
  3. Podczas egzekwowanie tych rzeczy tylko w bazie miałoby ten sam efekt na rzeczywistych danych, wydaje niewłaściwe prostu wyrzucić danych w bazie danych przed pierwszym tworzenia dobrego starań, aby potwierdzić, że jest on zgodny do ograniczenia i reguły biznesowe.

Jaka jest właściwa równowaga?

Odpowiedz

6

Należy wymusić na warstwie danych, aby zapewnić integralność danych. To jest twoja ostatnia linia obrony, a to zadanie DBs, aby pomóc w egzekwowaniu jego światopoglądu danych.

To powiedziawszy, rzucanie niepotrzebnych danych do bazy danych dla sprawdzania poprawności jest techniką gruboziarnistą. Zazwyczaj błędy są zaprojektowane tak, aby były czytelne dla człowieka, a nie odczytywalne maszynowo, a więc są nieefektywne, ponieważ program przetwarza błąd z bazy danych i wyciąga z niego głowy lub ogony.

Procedury składowane to inna sprawa. Nazajutrz Procedury składowane były sposobem na obsługę reguł biznesowych na poziomach danych, itp.

Jednak dzisiaj, dzięki nowoczesnym środowiskom serwerów aplikacji, stały się one na ogół lepszym miejscem do wprowadzenia tej logiki. Oferują one wiele sposobów dostępu i udostępniania danych (sieć, usługi sieciowe, zdalne protokoły, interfejsy API itp.). Ponadto, jeśli twoje reguły są ciężkie dla procesora (prawdopodobnie większość z nich nie jest), łatwiej jest skalować serwery aplikacji niż serwery DB.

Szeroka gama funkcji dostępnych w serwerach aplikacji zapewnia elastyczność w porównaniu z możliwościami serwerów baz danych, dzięki czemu wiele z tych danych, które zostały kiedyś przekazane do bazy danych, jest usuwanych z serwerów relegowanych do " głupi upór ".

To powiedziawszy, istnieją pewne zalety związane z wydajnością za pomocą Stored Procs i podobnych, ale teraz jest to strojenie, w którym pojawia się pytanie: "czy warto stracić możliwości serwera aplikacji, aby uzyskać zysk, który dostajemy poprzez umieszczenie go na serwerze DB ".

I przez serwer aplikacji, nie jestem po prostu mówić Java, .NET, ale nawet i PHP itp

+0

Jaka jest różnica między egzekwowaniem logiki biznesowej a egzekwowaniem integralności danych? Załóżmy, że mam regułę biznesową, która mówi, że co najwyżej 3 osoby mogą zostać przypisane do przełożonego. Kiedy idę wstawić osobę nr 4, czy to się nie udaje, ponieważ błąd integralności danych ma> 3 osoby na nadzorcę, czy jest to naruszenie reguł biznesowych? Nie blokując rekordu przełożonego przed weryfikacją, że podczas wprowadzania wkładki są co najwyżej 2 osoby pod nadzorem, w jaki sposób kod aplikacji może być w 100% pewny, że ta zasada nie zostanie złamana? –

+0

@Rednerln - tempo zmian. Reguły integralności bazy danych to rzeczy, które prawdopodobnie zostaną uznane za prawdziwe znacznie dłużej niż reguły biznesowe. Twój przykład ludzi do przełożonego, miałbym trudności z uzasadnieniem ograniczenia bazy danych, gdyby tak było, musiałbym opierać się na danych (udf na podstawie ustawień konfiguracyjnych). A jeśli reguła się zmieni, należy zadać pytanie, co zrobić z danymi, które naruszają tę zasadę. Zwykle potrzebujesz reguł bazy danych, które są tylko rozluźnione, niezatwierdzone lub zmienione jakościowo. –

+0

@Rednerln - w sytuacjach multimodalnych chcesz, aby ludzie mogli uderzyć Twoją warstwę dostępu do bazy danych (widoki, być może) za pomocą narzędzi BI lub cokolwiek innego i wiedzieć, że ich założenia są prawidłowe, że baza danych ma spójność i spójność w obwód. –

2

logiki biznesowej mogą usiąść w dowolnym miejscu, ale nie powinny być w obu. Logika NIE powinna być powielana, ponieważ łatwo jest popełnić błąd, starając się zachować synchronizację. Jeśli umieścisz go w modelu, będziesz potrzebować dostępu do wszystkich danych, aby przejrzeć modele, w tym aktualizacje partii.

Nie będzie kompromisów na umieszczenie go w bazie vs modeli aplikacyjnych (oto kilka z mojej głowie):

  • Bazy danych mogą być trudniejsze do utrzymania i aktualizacji niż aplikacje
  • łatwiej rozprowadzać obciążenie, czy to w warstwie aplikacji
  • Wiele, rozbieżne DBS może wymagać reguł biznesowych łupania (który może nie być możliwe)
3

Jeśli reguła musi być egzekwowane przez cały czas, bez względu na to, skąd pochodzą dane i jak zostały zaktualizowane, baza danych znajduje się tam, gdzie powinna być. Zapamiętaj, że na bazy danych wpływają zapytania bezpośrednie, które wprowadzają zmiany, które wpływają na wiele rekordów lub robią coś, czego normalnie by nie robiła aplikacja. Są to takie rzeczy jak ustalenie grupy rekordów, gdy klient jest wykupiony przez innego klienta i chcą zmienić wszystkie dane historyczne, zastosowanie nowych stawek podatkowych do zamówień, które jeszcze nie zostały przetworzone, ustalenie niektórych złych danych wejściowych. Czasami wpływają na nie także inne aplikacje, które nie korzystają z warstwy danych. Mogą również wpływać na import uruchamiany przez programy ETL, które również nie mogą korzystać z warstwy danych. Jeśli więc reguła musi we wszystkich przypadkach być przestrzegana, musi znajdować się w bazie danych.

Jeśli reguła dotyczy tylko szczególnych przypadków dotyczących działania tej konkretnej strony wejściowej, musi znajdować się w aplikacji. Więc jeśli menedżer sprzedaży ma tylko określone rzeczy, które może zrobić ze swojego interfejsu użytkownika, te rzeczy można określić w aplikacji.

Coś jest pomocne w obu miejscach. Na przykład niemądrze jest zezwolić użytkownikowi na umieszczenie nieaktualnego w polu wejściowym, które będzie dotyczyło pola daty. Typ danych w bazie danych powinien nadal być typem danych typu datetime, ale najlepiej sprawdzić niektóre z tych rzeczy przed wysłaniem.

Powiązane problemy