Współdzielenie DAL między projektami

Współdzielenie DAL między projektami
RA
  • Rejestracja:11 miesięcy
  • Ostatnio:11 miesięcy
  • Postów:1
0

Witam,

w pracy mamy dyskusję nad sensem wydzielania kodu ORM do współdzielonej paczki. Chodzi o encje + ich konfiguracje w Entity Frameworku.

Mamy dwie aplikacje pracujące na tej samej bazie danych, potencjalnie mogą się pojawić kolejne. Padł pomysł, żeby zamiast tworzyć mapowania ORM w każdym projekcie osobno, utworzyć paczkę, którą będziemy zaciągali w innych projektach.

Argumenty za:

  • nie trzeba pisać dwa razy tego samego kodu
  • tworząc nowy projekt od razu zaciągamy sobie wszystkie encje i na nich operujemy
  • w przypadku zmian na bazie, poprawiamy w jednym miejscu, a w reszcie projektów sobie zaciągamy paczkę
  • w przypadku migracji do wyższej wersji ORM, podbijamy wersję ORM w współdzielonej paczce, a w innych projektach tylko zaciągamy zmiany

Argument przeciw:

  • problemy wynikające z jednoczesnej zmiany w dwóch aplikacjach, zmieniam coś w aplikacji A, kolega zmienia coś w aplikacji B. Musimy odpowiednio wersjonować paczkę, tak żeby nie blokować się wzajemnie, że nie można puścić aplikacji A, bo B jeszcze nie jest gotowa.
  • częściowa utrata kontroli w projekcie nad warstwą dostępu do danych - chcę dodać jakąś encje, czy specyficzny konstruktor w danej encji i nie mogę tego zrobić w projekcie, tylko muszę stworzyć nową wersję paczki, a następnie zaktualizować ją w projekcie.
  • podbicie zależności ORM w ramach współdzielonej paczki wymusza podbicie tej zależności w projektach zaciągających paczkę. Czyli wymuszona migracja do wyższej wersji.

W ogóle myślę, że kilka aplikacji robiących zmiany na tych samych tabelach w bazie to proszenie się o kłopot, bo sprowadza się to do stworzenia rozproszonego monolitu.

Jakie jest Wasze zdanie?

edytowany 1x, ostatnio: rakim
SW
  • Rejestracja:około 5 lat
  • Ostatnio:4 miesiące
  • Postów:250
0

Dobrze myślisz. Dzielenie DAL między projektami zwykle nie kończy się dobrze. To będzie dodatkowa złożoność do utrzymania i jeszcze bardziej zawiłe zależności między projektami, tak samo testy i migracje. Już sam fakt, że dwie różne aplikacje modyfikują tę samą bazę jest podejrzany z perspektywy architektury i niesie kłopoty. Brnięcie w ten pomysł tylko ten stan pogorszy i dołoży wam roboty.
Aby z tego wyjść, możecie na przykład:

  • wydzielić osobne bazy (nie zawsze się da),
  • scalić aplikację w monolit (pracochłonne),
  • postawić API które udostępni wspólne operacje (jeszcze bardziej pracochłonne, chyba że istnieje wyraźny stosunek wskazujący na to, która z aplikacji byłaby klientem).
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0

Nie jestem dotnetowcem, ale mam złe wspomnienia z projektów gdzie wiele aplikacji pisało do wspólnej bazy danych. Zwykle kończy się to źle. (wyjątkiem jest tu oczywiście gdy mamy jedną aplikację biznesową, ale z powodów wydajnościowych rozbitą na dwie, jedną dedykowaną pod odczyt a druga pod modyfikacje)

Zwykle pewnym rozwiązaniem jest przykrycie takiej bazy kolejną aplikacją która nie ma logiki a tylko proxuje zapisy i odczyty?
Po co to? No bo kiedyś jak będziesz miał problem iż aplikacja A zapisuje dane a aplikacja B powinna sobie wtedy odświeżyć cache to zwyczajnie proxy bazy wysyła notifikacje do wszystkich co mają odświeżyć dane.
Pamiętaj też iż produkcyjna baza danych to zwykle największe barachło jeśli chodzi o refaktor. Pół biedy jak piszesz system działąjący od 8 do16 to wtedy zostajesz po pracy i migrujesz dane. Gorzej jak twój system działą 24/7 i wtedy często nawet pola z bazy nie można usunąć. Albo defaulta dla nowej kolumny dodać bo trwa to za długo


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
4
rakim napisał(a):

W ogóle myślę, że kilka aplikacji robiących zmiany na tych samych tabelach w bazie to proszenie się o kłopot, bo sprowadza się to do stworzenia rozproszonego monolitu.

To nie jest żaden kłopot, to po prostu zwykła katastrofa.
Ale za to potem jest o czym opowiadać przy piwie.


jeden i pół terabajta powinno wystarczyć każdemu
PP
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 miesięcy
  • Postów:146
0
SkrzydlatyWąż napisał(a):
  • wydzielić osobne bazy (nie zawsze się da),
  • scalić aplikację w monolit (pracochłonne),
  • postawić API które udostępni wspólne operacje (jeszcze bardziej pracochłonne, chyba że istnieje wyraźny stosunek wskazujący na to, która z aplikacji byłaby klientem).
  • "wydzielic ..." : sklonowac baze da sie zawsze, problem potem z sync'kiem. Nie znam takiego narzedzia ktoremu ze spokojnym sumieniem, bez zadnej biezacej kontroli moznaby powierzyc automatyczna i cykliczna synchronizacje dwoch baz, nawet mysql'owych.
  • "scalic ..." : a czym sie roznia wobec omawianego problemu, dwa rozne requesty wyslane przez dwa rozne klienty w tym samym czasie do monolitu na jednym serwerze, od tych samych requestow wysylanych do wydzielonych mikroserwisow?
  • "postawic ..." : sytuacja wlasciwie identyczna do tej z monolitem.

Wlasciwie, teoretycznie to zadanie rewelacja dla szyny, ale praktycznie w 99,99% kolejka okazuje sie zbyt waskim gardlem. Nawet jesli operacje na poszczegolnych tabelach puszczane sa przez wydzielone kolejki, to najwieksze bezpieczenstwo daje wylacznie warunkowosc kazdej, tzn po potwierdzeniu zakonczenia poprzedniej, w przeciwnym przypadku kazdy pojedynczy strzal niesie za soba ryzyko kotla.

O ile wiem nikt jeszcze nie wymyslil na to dobrego rozwiazania i koczy sie to praca strazaka z workiem piachu i lopata w reku.

rakim napisał(a):

W ogóle myślę, że kilka aplikacji robiących zmiany na tych samych tabelach w bazie to proszenie się o kłopot, bo sprowadza się to do stworzenia rozproszonego monolitu.

Wydzielone tabele/bazy danych per mikroserwis, to nie jest jakas kategoryczna i niepodwazalna regula. To po prostu najbardziej korzystna, logiczna, ale wylacznie zwyczajowa praktyka pozwalajaca utrzymywac mikroserwisy w stanie zblizonym do optymalnego.

Czasami jest to jednak niemozliwe do uzyskania i trzeba sobie radzic w zaleznosci od aktualnego stanu rzeczy.
Decoupling mikroserwisow polega na separacji kodu i funkcjonalnosci a nie danych na ktorych ten kod i funkcjonalnosci operuja, stad tez wspolna baza i wydzielanie wspoldzielonej paczki okazuje sie nie tyle wyborem, ale niezalezna od naszego widzimise koniecznoscia. Sprawe ulatwia rowniez fakt, ze tak naprawde poza CRUD'em reszta operacji na bazie jest specyficzna dla okreslonych serwisow i rygorystyczna aktualizacja takiej paczki raczej rzadko jest powodem problemow - zwlaszcza jesli stosuje sie ze zrozumieniem "I" z SOLID.

edytowany 3x, ostatnio: proximus-prime
SL
  • Rejestracja:około 7 lat
  • Ostatnio:około 10 godzin
  • Postów:876
0

Jak już tak robisz to chociaż zrób monorepo i dwie trzymaj w nim tego DALa i obie apki.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)