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.
źródło
Odpowiedzi:
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 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:
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ą.
źródło
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ą.
źródło
Myślę, że boją się odtworzenia tej samej starej „parodii”, która była tam wcześniej, niż samej referencyjnej integralności.
Jeśli potrafisz solidnie uzasadnić (wymaganie niefunkcjonalne), że potrzebujesz atomowości, będą potrzebowali dobrego, solidnego kontrargumentu, aby wyjść z tego.
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.
źródło
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.
źródło
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.
źródło