2012-07-27 21 views
6

Mam już wiele istniejących danych w mojej bazie danych i chcę opracować mechanizm punktowy, który oblicza wynik dla każdego użytkownika na podstawie tego, jakie działania wykonują.Projektowanie systemu punktowego na wiosnę

Wdrażam tę funkcję w sposób umożliwiający podłączenie, dzięki czemu jest ona niezależna od głównej logiki i polega na wysyłaniu zdarzeń wiosennych, gdy jednostka zostanie zmodyfikowana.

Problem polega na tym, co zrobić z istniejącymi danymi. Nie chcę zbierać punktów od teraz, ale raczej zawieram wszystkie dane do tej pory.

Jaki jest najbardziej praktyczny sposób na zrobienie tego? Czy powinienem zaprojektować moje wtyczki w taki sposób, aby zapewnić metodę index(), która zmusi mój system do pobrania każdego pojedynczego obiektu z bazy danych, wysłania EntityDirtyEvent, wystrzelenia wtyczek punktów dla każdego, a następnie aktualizacji to, aby punkty były zapisywane obok każdej jednostki. To może spowodować wiele kosztów, prawda?

Najprostszą rzeczą byłoby utworzenie złożonej procedury przechowywanej, a następnie wywołanie funkcji index() w procedurze przechowywanej. To też wydaje mi się jednak złe. Ponieważ muszę napisać logikę do obliczania punktów w java i tak, po co jeszcze raz w SQL? Ponadto, ogólnie nie jestem fanem dzielenia logiki biznesowej na różne warstwy.

Czy ktoś to wcześniej zrobił? Proszę pomóż.

Odpowiedz

4

Najpierw rozróżnij strategię wdrażania i reguły biznesowe.

Ponieważ masz już dane, rozważ uzyskanie wyników bezpośrednio z danych. Tworzy to model domeny danych. Zaprojektuj model danych, aby przechowywać wszystkie swoje dane. Następnie utwórz zestaw zapytań, widoków i procedur przechowywanych w celu uzyskania dostępu i aktualizacji danych.

Po uzyskaniu tych widoków, użyj biblioteki dostępu do danych, takiej jak Spring JDBC Template, aby pobrać te dane i przedstawić je w obiektach Java (listy, mapy, osoby, tabele punktowe itp.).

To, co dotychczas wykonałeś, niewiele się zmieniło, niezależnie od tego, co dzieje się w wyższych warstwach systemu. Nazywa się to Model.

Następnie opracuj bazę reguł lub implementację logiki, która określa, jakie dane wejściowe, działania użytkowników, warunki danych lub wszystkie inne warunki, jakie dane są potrzebne. W sensie matematycznym jest to jak matryca. W sensie programistycznym byłby to zbiór instrukcji logicznych. Jeśli to i to i to jest prawdą, pobierz te dane, uzyskaj dane itp. Obejmuje to logikę w twoim systemie. Dlatego nazywa się to "Kontrolerem".

Nie przenosić tej logiki do zapytań/procedury/widoków przechowywanych.

Następnie w końcu opracuj front-end lub "konsolę" do tego. W najprostszym przypadku opracuj system wejściowy konsoli, który pobiera ... i wyświetla zestaw wyników. To jest twój "widok" systemu.

Możesz ostatecznie rozwinąć widok w aplikacji internetowej. Powyższy widok wiersza poleceń nadal może być wykonalny w postaci serwera Restful API.

2

Myślę, że jest jeden problem, który należy wziąć pod uwagę: ponieważ rozumiem, że w bazie danych są ogromne dane, więc pomysł stworzenia tylko jednego mechanizmu obliczania systemu punktowego nie może być najlepszym podejściem.

W rzeczywistości, jeśli nie chcesz rozpocząć zbierania punktów, ale zawierają wszystkie dane, musisz przetworzyć i obliczyć informacje, które masz teraz. Tak, przy pierwszym uruchomieniu może to spowodować obciążenie, ale jak powiedziałeś, potrzebujesz tych danych obliczonych.

Z drugiej strony możesz dołączyć inny mechanizm, który obserwuje zmiany w jednostce i uruchamia inny proces, który może obliczyć nowe różnice między punktami, które dotyczą tej konkretnej modyfikacji.

Można więc użyć jednej usługi odpowiedzialnej za obliczanie systemu wskazującego, jednego dla pojedynczego obiektu i innego, może być dłuższe do zakończenia, zdolnego do obliczania punktów globalnych. Nawet, jeśli nie musisz być obliczany w czasie rzeczywistym, możesz utworzyć zaplanowane zadanie odpowiedzialne za jego uruchomienie.

W końcu wiem, że nie jest dobrym podejściem do podziału logiki biznesowej na dwie warstwy (Db + Java), ale czasami jest to wymagane, na przykład, jeśli potrzebujesz szybko odpowiedzieć na prośbę, która w końcu działa z wiele rejestrów. Znalazłem kilka przypadków, że nie ma innej opcji niż dodanie logiki biznesowej do bazy danych (jako procedur przechowywanych itp.) W celu zarządzania dużą ilością danych i zwrócenia ostatecznego wyniku klientowi przeglądarki (np. Proces obliczeniowy w określonym czasie)).

2

Próbujesz wykonać "bootstrapping". Wybrane podejście powinno zależeć od tego, jak skomplikowane są obliczenia punktowe. Jeśli procedury przechowywane lub zwykłe instrukcje aktualizacji są najprostszym rozwiązaniem, zrób to.

Jeśli obliczenia są skomplikowane, napisz zadanie wsadowe, które wczytuje istniejące dane, prawdopodobnie najpierw zamawia je najstarsze i uruchamia zdarzenia odpowiadające tym danym, tak jakby właśnie się wydarzyły. Kod, który zajmuje się zdarzeniem, powinien być dokładnie tym samym kodem, który zajmie się przyszłym wydarzeniem, więc nie będziesz musiał pisać żadnego dodatkowego kodu poza samymi zadaniami wsadowymi.

Ponieważ zamierzasz uruchomić to tylko raz, skorzystaj z najprostszego rozwiązania, nawet jeśli jest szybkie i brudne.

2

Wygląda na to, że zmierzasz we właściwym kierunku. Wiesz, że chcesz, aby twoje "punkty" oddzieliły się od głównej aplikacji. Ponieważ domyślnie używasz hibernacji (przez znacznik!), Możesz wejść w system zdarzeń hibernacji (zobacz here sekcja 14.2). W zależności od wielkości/złożoności twojego systemu, możesz dodać tutaj swoje obliczenia punktów (jeśli nie jest to duży/złożony system), lub możesz opublikować własne wydarzenie, które będzie odbierane przez dowolne oprogramowanie.

Punktem w podejściu projektowym jest to, że nie wie ani nie dba o obliczenia punktowe. Jeśli, jak domyślam się, próbuję stworzyć dość ogólny mechanizm wtyczek, publikujesz własne zdarzenia do tego systemu z tego punktu przyłączenia. Jeśli nie masz wtyczek na danej instalacji/instalacji, nikt nie dostaje/nie przetwarza zdarzeń. Jeśli masz wiele wtyczek na innej instalacji/instalacji, każdy z nich może zdecydować, jakie przetwarzanie musi wykonać na podstawie odebranego zdarzenia. W przypadku "pluginów punktów" będzie on obliczał jego wartość punktową i zapisuje ją. Żaden zapisany proces nie jest wymagany ...

1

Istnieją dwa różne sposoby. Jedno już wiesz, że - odpytuj bazę danych o zmienione dane. W takim przypadku trafiasz do bazy danych, gdy może nie być zmian i może to spowolnić proces.

Drugie podejście - Po każdej zmianie bazy danych baza danych uruchomi zdarzenie. Że możesz używać CDC (Change Data Capture). Minimalizuje to narzut.

Możesz wyszukać więcej opcji w Spring Integration