Mój zespół boi się relacyjnych baz danych z relacjami klucza obcego i nie rozumiem dlaczego


12

Jestem stosunkowo świeżo po studiach, więc większość mojej znajomości relacyjnych baz danych pochodzi z mojego kursu baz danych, gdzie wszystko, co nie jest w BCNF lub 3NF, jest parodią. Z pewnością jest to jeden koniec ekstremum, ale mój zespół w pracy naprawdę wydaje się, że doprowadza go do kompletnego przeciwnego końca.

W naszych schematach db mikrousług, jednostki rzadko mają więcej niż jedną tabelę. Wszystko, co zwykle normalizujesz w innej tabeli, jest przechowywane w kolumnie Json. Jeśli później okaże się, że należy zapytać o jedną z właściwości w tym pliku Json, dodawana jest nowa kolumna, a dane są przechowywane w obu miejscach (tak, w dwóch różnych kolumnach w tej samej tabeli).

W wielu przypadkach te kolumny Json zdecydowanie mają przewagę. Jeśli nigdy nie musisz pytać o te dane i jeśli nigdy nie musisz wprowadzać jednostronnych zmian do tych danych (czego oczywiście nie możesz przewidzieć), nie jest to zły pomysł. Ponadto wiele naszych usług albo nie widzi serwera, albo jest hostowanych na maszynach z nieprzyzwoitą ilością miejsca na dysku na to, czego potrzebowały, więc duplikacja danych nie jest ogromnym problemem. (Chociaż coś, co ogólnie chciałbym uniknąć z filozofii)

Obecnie tworzymy usługę, która dopasowuje reguły w oparciu o zestaw warunków, które posiadają, a następnie wykonuje zestaw działań związanych z tymi regułami, gdy reguły są prawdziwe (np. Wszystkie warunki są spełnione). Mój zespół podrzędny, który od razu buduje tę usługę, uważa, że ​​normalizacja działań i warunków z dala od reguł w schemacie przynosi znaczne korzyści. Oczywiście tabela ta utrzymuje relacje klucza obcego z identyfikatorem reguły. Z naszej perspektywy możemy uniknąć powielania danych w warunkach, co pozwala nam zapewnić, że są one oceniane tylko raz i łatwo jest znaleźć warunki i reguły, których potrzebujemy, gdy są potrzebne, bez konieczności wyciągania każdej reguły i wyszukiwania w pamięci.

Rozmawiając dziś z jednym z naszych głównych inżynierów, próbował odepchnąć mnie daleko od tego schematu. Próba argumentowania pod każdym względem, że tak naprawdę go nie potrzebujemy, spowoduje w przyszłości problemy z wydajnością, odwołując się do starego monolitu, który posiadamy, który jest parodią projektową. Nazywał to, co robimy, „starym sposobem”, a płaskie stoły z Jsonem „nowym sposobem”. Twierdził, że w miejscach, w których chcę atomowości, nie potrzebujemy jej i że zamiast zapytań powinniśmy robić więcej rzeczy w pamięci. Jest to zasada projektowania, której przestrzega obecnie wiele naszych usług. Nie spodziewamy się, że ilość naszych danych znacznie wzrośnie, co powinno przyspieszyć nasze zapytania. To, czego oczekujemy, to dużo czasu poświęconego na ocenę reguł i wykonywanie działań.

Rozumiem, że nierelacyjne bazy danych stały się bardziej popularne w ostatnich latach, ale nawet kiedy aktywnie szukam informacji na temat wpływu relacji klucza obcego na wydajność, nie widzę wielu informacji przemawiających za jego argumentem. Przypuszczam, że mogą wprowadzać duże transakcje, które mogą powodować problemy, ale wydaje się, że jest to problem niezależny od samego klucza obcego.

Czy to moja naiwność? Czy jest to coś, czego naprawdę brakuje mi i mojej ekipie? Wyraźnie nie podałem szczegółowych informacji na temat naszego problemu, ponieważ niekoniecznie szukam rozwiązania tego problemu. Biorąc pod uwagę, że jest to powszechny trend w naszym większym zespole, jestem naprawdę ciekawy, czy coś z tym wiąże.


Odpowiedź na twoje pytanie w tytule brzmiałaby: „Boją się starego monolitu w twoim towarzystwie”. Ale treść twojego pytania wydaje się zadawać coś zupełnie innego, np. „Czy klucze obce powodują problemy z wydajnością?”
Christian Hackl

2
Zastanawiam się, jaki procent RDBMS
wbudowali w

To, czy takie podejście jest dobre, czy nie, zależy od rodzaju aplikacji, którą budujesz, jej potrzeb i kierunku, w którym podążasz (wymagania, ograniczenia architektoniczne) - czegoś, czego tak naprawdę nie możemy ocenić. Jeśli chodzi o NoSQL - chodziło o wsparcie ogromnej możliwości sprzedaży w poziomie i uznanie, że nie wszystkie aplikacje wymagają ścisłych ograniczeń RDBMS. Aby dowiedzieć się więcej, skorzystaj z 3 najlepszych odpowiedzi tutaj jako punktu początkowego (2. i 3. podają więcej szczegółów).
Filip Milovanović

2
Jeśli mogę udzielić porady nietechnicznej: nieco ją stonuj. Poddajesz wiele osądu („tak, w dwóch różnych kolumnach w tym samym stole”, „travesty projektowania”) na temat pracy, w której nie brałeś udziału w podejmowaniu decyzji projektowych i robiłeś to z pozycji minimalnego doświadczenia w świecie rzeczywistym . Nie mogę powiedzieć, że masz rację, czy nie, ponieważ nie widziałem projektu, ale systemy to zwykle szereg kompromisów, w wyniku których gotowy produkt jest funkcjonalny, ale mniej niż koncepcyjnie czysty. Stanie się to wyraźniejsze w miarę rozwoju kariery, a podejmowanie tych decyzji stanie się częścią Twojej pracy.
Blrfl

@Blrfl Doskonale ułożone
Robbie Dee

Odpowiedzi:


8

Kluczowym słowem do zrozumienia, skąd pochodzi Twój zespół, są „mikrousługi”. Warto najpierw przeczytać tę koncepcję, szczególnie w przypadku następujących informacji:

  • Jak należy przechowywać dane?
  • Zasady projektowania?
  • Jak są zaprojektowane do skalowania?

Jak w przypadku każdego stosunkowo nowego sposobu robienia rzeczy (a 5-10 lat jest stosunkowo nowym, jeśli chodzi o architekturę oprogramowania), przekonasz się, że ideały i rzeczywistość są nieco inne.

Jednym z ideałów jest to, że każda mikrousługa powinna mieć własny magazyn danych. UWAGA: Powiedziałem magazyn danych, a nie bazę danych. Są przypadki, w których po prostu potrzebujesz wyszukiwarki, magazynu obiektów blob lub zwykłego buforowania w przeciwieństwie do zwykłej bazy danych. W zależności od tego, z kim rozmawiasz, ten ideał może nawet przejść do magazynu danych na instancję mikrousług!

Najważniejsze jest to, że kiedy mówisz o przejściu na skalę internetową, bezpieczeństwo i znajomość transakcji ACID (Atomowość, Spójność, Izolacja i Trwałość) po prostu nie skalują się, gdy masz miliony użytkowników w jednej bazie danych. Wraz z pojawieniem się NoSQL paradygmat przesunął się bardziej w kierunku BASE (zasadniczo dostępny, stan miękki, ostateczna spójność). ( odniesienie )

Zmiana sposobu zarządzania danymi ma wpływ na PH:

  • Rzeczy, którymi zajmowała się baza danych, należy teraz zarządzać w kodzie
  • Łatwiej jest skalować, rzucając więcej wystąpień mikrousług na problem, niż dodając „nieskończone” zasoby do serwera
  • Zwiększasz niezawodność kosztem większej złożoności

Nie mogę odpowiedzieć na szczegóły dotyczące twojego zespołu ani tego, jak duże zamierzają uzyskać rozwiązanie, ale zazwyczaj nie musisz mieć rozwiązania typu wszystko albo nic. Nie będę tu siedzieć i oceniać, czy zespół dokonuje właściwych wyborów. Podaję tylko kontekst, abyś mógł przynajmniej zrozumieć, skąd pochodzą.


+1 Świetne rzeczy - wokół mikrousług jest wiele subtelności, na pewno oznacza to, że nie chodzi tylko o zamianę baz danych.
Robbie Dee

@RobbieDee, zgodził się. Na tym świecie jest dużo złożoności i nie wszyscy zgadzają się co do szczegółów.
Berin Loritsch

To powinna być odpowiedź. Trochę o każdej mikrousługi mającej własny magazyn danych naprawdę jest czynnik różnicujący. Powoduje to dużą zmianę potrzeb i rozwiązań w zakresie przechowywania danych, a magazyn danych zgodny z ACID nie jest tak korzystny jak kiedyś.
Greg Burghardt

7
To dobra odpowiedź i głosowałem za nią. Chciałbym jedynie zaznaczyć, że to, co nazywacie „skalą internetową”, dotyczy tylko największych firm; w przypadku zdecydowanej większości korporacyjnych baz danych i stron internetowych (powiedziałbym, że 95% z nich) „konwencjonalne” znormalizowane bazy danych SQL są nadal całkowicie wykonalne.
Robert Harvey

@RobertHarvey, zgadzam się z całego serca. Przeczytałem wiele artykułów o mikrousługach, które określają to, o czym napisałem. W naszych własnych projektach korzystamy z bazy danych SQL z odpowiednią normalizacją i ograniczeniami. Zraniłoby to serce purysty, ale w rzeczywistości nasza baza użytkowników jest raczej niewielka (setki lub użytkownicy), a baza danych nie była dla nas problemem wydajnościowym.
Berin Loritsch

3

OK, nie będąc głównym inżynierem projektu, naprawdę musisz przestrzegać jego wskazówek dotyczących tego projektu.

Zachęcam do opracowania własnego projektu systemu i jego prototypu w domu, aby zrozumieć wszelkie kompromisy. Zrób to dla własnego wykształcenia i wspomnij o tym w pracy tylko wtedy, gdy możesz zademonstrować przykłady pracy.

Z mojego doświadczenia wynika, że ​​istnieją ograniczenia, które powodują spowolnienie wydajności bazy danych. I tak, musisz sprawdzić te ograniczenia. Jest to jednak o wiele większy problem, gdy baza danych jest niespójna, a to spowoduje, że napiszesz SQL i więcej kodu w celu kompensacji, często zwiększając złożoność systemu, a także spowalniając go.

3nf, jeśli zostanie to odpowiednio wykonane, sprawi, że baza danych będzie szybsza, ponieważ więcej z niej można buforować, ponieważ przechowywanych jest mniej nadmiarowych danych. Jednak w bieżącym zadaniu zestaw danych może nie być wystarczająco duży, aby faktycznie zobaczyć różnicę wydajności między znormalizowaną bazą danych a bazą nienormalizowaną.


+1 Świetny pomysł. A jeśli objętości są zbyt duże jak na maszynę programistyczną, próbka 1 na N często może również dać świetny wgląd.
Robbie Dee

2

Myślę, że boją się odtworzenia tej samej starej „parodii”, która była tam wcześniej, niż samej referencyjnej integralności.

Twierdził, że w miejscach, w których chcę atomowości, nie potrzebujemy jej ...

Jeśli potrafisz solidnie uzasadnić (wymaganie niefunkcjonalne), że potrzebujesz atomowości, będą potrzebowali dobrego, solidnego kontrargumentu, aby wyjść z tego.

... zamiast zapytań powinniśmy robić więcej rzeczy w pamięci. To zasada projektowania ... Nie przewidujemy, że ilość naszych danych znacznie wzrośnie ...

Miejmy nadzieję, że masz rację. Sugerowałbym, że poleganie na tym, że dane pozostają „wystarczająco małe”, aby zachować wydajność, jest ryzykowne.

Jaka jest szybkość zmian tych zasad? Im więcej masz duplikacji, tym więcej czasu (inaczej pieniędzy) marnujesz na aktualizację tego samego w wielu miejscach.


1

Kluczowe koncepcje RDBMS mają ponad 40 lat. W tamtych czasach magazynowanie było bardzo drogie, a wszelka redundancja była odrzucana. Chociaż koncepcje RDBMS są wciąż aktualne, idea denormalizacji wydajności (w celu zmniejszenia liczby dołączeń) została powszechnie przyjęta w ostatnich dziesięcioleciach.

Tak więc w przypadku RDBMS o danym rozmiarze zazwyczaj masz logiczny projekt (bez redundancji) i fizyczny (z redundancją) wydajności.

Szybkie przechodzenie do dzisiejszych czasów, gdzie przechowywanie jest tanie, a procesory szybsze niż kiedykolwiek, niektóre z tych presji projektowych nie są tak ważne. Ostatecznie jest to decyzja o tym, czy zależy ci na redundancji i rejestrach sierocych. W niektórych branżach, takich jak bankowość, poprawność danych jest niezbędna, dlatego trudno jest przewidzieć, jak kiedykolwiek odejdą od RDBMS. W przypadku innych branż, nowi gracze cały czas wchodzą na rynek, więc wybory są niezliczone.

Jeśli chodzi o to, czy Twój zespół nie jest zadowolony z ograniczeń, jakie może przynieść RDBMS - kto wie? Z pewnością młodsi programiści, jak widzę, nie mają takiego systemu RDBMS, co twórcy poprzednich generacji, ale prawdopodobnie ma to większy związek z rozpowszechnianiem technologii programistycznych i platform baz danych.

Nie ma końca technologii, których programista może się nauczyć, i może być trudne wykonanie właściwego wykopu dla swojej kariery. Z pewnością dawno minęły czasy, gdy programiści byli jacksem wszystkich transakcji - jest po prostu zbyt wiele, czego można się nauczyć.

Ale - na pytanie w ręku. Jak sam przyznaje, nie spodziewasz się, że ilość danych wzrośnie, a system działa dobrze. Sprzedanie idei przeprojektowania rzeczy bez wyraźnej korzyści byłoby dla ciebie dość trudne. Być może gdybyś mógł wykonać dowód koncepcji, w którym podejście RDBMS przyniosłoby korzyści, byłaby to inna historia.


1
dlaczego jest to przegłosowane? to jest zrównoważona odpowiedź. pragmatyzm +1
Dirk Boer

Pragmatyzm jest dobry, ale nadal musisz być ostrożny. Denormalizowanie danych w imię wydajności na początku projektu cofa się przedwczesną optymalizacją. Nie przeprojektowanie starego działającego systemu jest oczywiście dobrym, pragmatycznym wyborem, ale odmowa zaprojektowania nowego systemu zgodnego ze standardami branżowymi w imię „zawsze robiliśmy coś przeciwnego i to działa” nie jest dobrym argumentem .
Vincent Savard

Denormalizowanie danych w imię wydajności na początku projektu ... Wskazówka: nie :)
Robbie Dee

1
Wartość RDBMS nie pochodzi z wydajności dysku.
TehShrike

0

To zależy od używanej bazy danych.

W tradycyjnym RDBMS masz rację. Powielanie danych jest obrzydliwością. Kolumny i ich równoważność json nieuchronnie się zsynchronizują, ponieważ nie ma nic, co by to wymusiło. Obsługa klucza obcego jest dobrze znana, świetnie sprawdza się w opisywaniu i egzekwowaniu relacji. Atomowość jest niezbędna do robienia niemal wszystkiego z danymi.

W konfiguracji typu nosql jest mniej jasne. Ponieważ nie ma trwałych relacji, egzekwowanie relacji staje się mniej ważne. Tego rodzaju treść JSON z indeksem kolumny jest znacznie bardziej powszechna w tych systemach, ponieważ brak relacji oznacza, że ​​rzadziej zsynchronizuje się. Atomowość jest ograniczona do pojedynczej tabeli, ponieważ tak działa nosql.

To, co jest lepsze, zależy od tego, co faktycznie robisz i czego tak naprawdę potrzebujesz.

Ale brzmi to tak, jakby twoi współpracownicy byli w kulcie ładunków. Zostały ugryzione przez stare złe rzeczy, więc teraz rzeczy muszą być nową błyszczącą rzeczą. Za kilka lat, gdy ugryzą ich nowe, lśniące rzeczy, miejmy nadzieję, że zrozumieją, że SQL kontra noSQL to zestaw kompromisów.

Ale nie zrobią tego. Mam nadzieję, że tak.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.