NoSQL: Co to są dane nieustrukturyzowane?

9

obecnie działamy na granicy zasobów dzięki naszemu rozwiązaniu opartemu na serwerze mssql.

Mamy teraz wiele tradycyjnych opcji dotyczących następnego ruchu, aby poradzić sobie z obciążeniem:

  • kupuj szybsze procesory i IO
  • podzielić niektórych klientów na oddzielny serwer
  • przenieś db do klastra

Wszystkie są albo drogie pod względem licencjonowania i sprzętu, albo czasu. Chcę więc dodać kolejną opcję, przenosząc cały system do skalowalnego rozwiązania, które obiecuje silnik nosql Cassandra.

Nie jestem jednak pewien i nie mam doświadczenia z bazami danych noSQL, dlatego muszę zrozumieć strukturę „nieustrukturyzowanych” danych.

W naszej aplikacji przechowujemy dane wprowadzane przez użytkowników na różne sposoby jako listy „klucz-wartość”. Istnieje tabela nadrzędna, która zawiera element head (jak Order), oraz tabela podrzędna z parami klucz-wartość zawierającymi zawartość zamówienia (jak Order_Lines).

Pod względem biznesowym Zamówienia i Linie Zamówienia są jednostką. Ale ze względu na RDBMS są one przechowywane w tabelach i muszą być przez cały czas łączone.

Podczas operacji czasami wybieramy ładowanie tylko górnej części, ale przez większość czasu ładujemy wiersz główny + niektóre KVP, aby wyświetlić przydatne informacje.

Na przykład na liście przeglądowej pokazujemy identyfikator nagłówka + niektóre wartości w kolumnach dla każdego wiersza.

AKTUALIZACJA: Przechowujemy wszelkiego rodzaju formularze. Zasadniczo przechowujemy „dokumenty”. Niemniej jednak musimy przygotować i przeszukiwać te formularze według dowolnej wartości, sortować itp. Kontrola dostępu do danych dodaje kolejną warstwę współzależności do bazy danych.

Jak można się domyślić, ilość i dostępność niektórych KVP różni się w zależności od obiektu. Nie ma uzasadnionej możliwości utworzenia pojedynczych tabel dla każdego rodzaju obiektu, ponieważ musielibyśmy utworzyć tysiące tabel dla różnych kombinacji danych.

Czy tego rodzaju „słownikowe” zbiory danych lepiej przechowywać w bazie danych noSQL? Czy z tego skorzystamy na wydajności? Czy Cassandra modelowałaby te głowy i KVP jako jeden zestaw danych? Patrząc na stronę Cassandra i niektóre samouczki, mam wrażenie, że nie ma tak dużej różnicy między naszym RDBMS a Cassandrą pod względem organizacji danych - pozostawiając nam tyle samo złączeń, jeśli chcesz wybrać 5 KVP dla listy dla każdego wiersza.

Oświecenie jest mile widziane, również wskaźniki do dokumentów wyjaśniających problemy są w porządku.

thst
źródło

Odpowiedzi:

3

Istnieje kilka pojęć, które należy rozróżnić. Jedna dotyczy struktury, a druga schematu.

Dane strukturalne to takie, w których aplikacja z góry zna znaczenie każdego otrzymanego bajtu. Dobrym przykładem są pomiary z czujnika. W przeciwieństwie do tego strumień na Twitterze jest nieustrukturyzowany. Schemat dotyczy tego, jaka część struktury jest przekazywana do DBMS, jak ma się to wymusić. Kontroluje, ile DBMS analizuje przechowywane dane. DBMS wymagany na podstawie schematu, taki jak SQL Server, może przechowywać nieprzetworzone dane (varbinary) lub opcjonalnie przeanalizowane dane (xml) i w pełni przeanalizowane dane (kolumny).

Bazy danych NoSQL DBMS leżą w spektrum od braku analizowania (sklepy kluczy i wartości) w górę. Cassandra oferuje pod tym względem stosunkowo bogatą funkcjonalność. Różnice między sklepami relacyjnymi polegają na jednorodności danych. Po zdefiniowaniu tabeli mogą być tam przechowywane tylko dane pasujące do tej definicji. Jednak w Cassandrze, nawet jeśli kolumny i rodziny są zdefiniowane, nie ma wymogu, aby dwa wiersze w tej samej tabeli wyglądały podobnie do siebie. Do projektanta aplikacji należy decyzja, ile idzie w jednym rzędzie (zwanym także dokumentem) i co jest przechowywane osobno, połączone wskaźnikami. W efekcie, ile chcesz denormalizacji.

Zaletą jest to, że można pobrać pełny zestaw danych za pomocą jednego odczytu sekwencyjnego. To jest szybkie. Jedną wadą jest to, że Ty, programista aplikacji, jesteś teraz całkowicie odpowiedzialny za wszystkie kwestie związane z integralnością danych i kompatybilnością wsteczną, na zawsze, za każdy fragment kodu, który kiedykolwiek dotyka tego magazynu danych. Trudno to naprawić. Ponadto jesteś zamknięty w jednym punkcie widzenia danych. Jeśli wpiszesz wiersze według numeru zamówienia, w jaki sposób zgłaszasz sprzedaż dotyczącą jednego konkretnego produktu, regionu lub klienta?

Michael Green
źródło
1
W naszym przypadku dane, które przechowujemy, są w zasadzie danymi. Użytkownik definiuje formularz w czasie wykonywania i może go modyfikować w dowolnym momencie. Formularz można zbudować z tysięcy pól. Może się to zdarzyć, jeśli zostaną przechwycone dane podobne do listy. Gdybyśmy znali dane z góry - w czasie projektowania db normalizowalibyśmy je. Twój komentarz na temat widoku danych sprawia, że ​​myślę: jeśli formularze są zapisywane jako dokument, w jaki sposób tworzysz na nich widok listy lub sortujesz dane według pola w prawdziwym życiu? Zmniejszyć dane, przypomnieć sobie i przygotować listę w kodzie?
thst
Historycznie było to po stronie klienta - odzyskałeś dokumenty i zrobiłeś to, co musiałeś. CQL zawiera klauzule, które każdy programista SQL powinien znać. Map Reduce to architektura dla dużych zestawów danych. I wygląda na to, że Cassandra 3.0 będzie miała zmaterializowane widoki .
Michael Green
5

Pomimo głównego nurtu baz danych noSQL IMHO decyzja o przyjęciu takiej technologii powinna być podejmowana zgodnie z osiągnięciami potrzebnymi na podstawie przechowywanych informacji, nie tylko uwzględniając wydajność, którą obecnie posiadasz. Oznacza to, że być może najlepszą opcją jest trzymanie się bazy danych SQL i poprawianie swojego sprzętu.

Ale dodatkowo przeczytałem w twoim pytaniu coś, co skłoniło mnie do myślenia. Nie ma wiele na temat obecnego stanu bazy danych, ale zdanie „zasadniczo przechowujemy dane wprowadzane przez użytkowników na różne sposoby, ponieważ listy„ klucz-wartość ” sprawiają, że zastanawiam się, czy problemem nie byłby zły model danych, a nie brak zasobów fizycznych. Zarządzałem naprawdę dużymi tabelami (+10 miliardów wierszy) z niewiarygodną wydajnością w „tradycyjnych” bazach danych SQL.

Nie twierdzę, że to źle, po prostu, ponieważ oczywiście nie mogę ocenić cię we właściwym modelu danych z tak małą ilością informacji o twoim obecnym rozwiązaniu, ale po prostu pomyśl o ponownym przejrzeniu twojego modelu danych jako dodatkowej opcji wraz z resztą, ponieważ może tam znaleźć jakieś wskazówki.

Zazwyczaj listy klucz-wartość są przydatne jako kompromis, gdy nie można wdrożyć modelu w jego ostatecznym stanie, ponieważ nie znasz różnych kluczy, z którymi musisz się zmierzyć, lub gdy potrzebujesz wartości jednego z możliwych klucze do określonego elementu. Ale po wdrożeniu zazwyczaj lubię ponownie zastanawiać się nad takimi decyzjami po chwili, gdy zebrałeś wystarczającą ilość informacji, aby zidentyfikować typowy przypadek użycia i zdecydować, czy decyzja dotycząca modelu danych jest najlepsza. Jeśli wiesz, że będziesz mieć pewną liczbę kluczy, spróbuj wykonać test porównawczy z projektem zwykłego stołu w tradycyjny sposób

CREATE TABLE benchmarkTable (
  element INTEGER,
  key1 VARCHAR(xx),
  key2 INTEGER,
  key3 DECIMAL(5,2),
...
);

... i dodając odpowiednie indeksy. Wypróbuj i zmierz plany wykonania przy użyciu obu podejść. Możesz być szczególnie zaskoczony, jeśli zbierzesz więcej niż jeden klucz na raz, ponieważ między innymi zaletami należy zmniejszyć rozmiar bloku danych, a tym samym poprawić wydajność.

Mam nadzieję, że to pomaga, a przynajmniej poszerza możliwości i otwiera nową linię do dochodzenia.

LironCareto
źródło
Doceniam twoją odpowiedź, ale w rzeczywistości sytuacja jest taka, że ​​tak naprawdę nie znamy struktury danych. Przechowujemy dane formularzy i nie znamy struktury modelu formularza. Wiemy oczywiście o aplikacji, ale jest ona dynamiczna i można ją zmienić w dowolnym momencie.
thst
Zrozumiany. Nie wiem, jak trudne to jest, ale jako pomysł, aby spróbować, czy byłoby dobrze stworzyć tabelę zawierającą pulę wspólnych kluczy, do których odwołuje się tabela wypełniona przez użytkownika przez wykonującego FK, może INTEGERA? Może jest to nieco lepsze działanie niż indeksowanie kolumny varchar, która, jeśli zmienia się bardzo dynamicznie, myślę, że nie będzie krótka. Zmniejszyłoby to również rozmiar indeksu.
LironCareto
1
To prowadzi do pytania, ale omówiliśmy pewne ograniczenia możliwości użytkowników. Na przykład zmniejsz maksymalne pola tabeli aplikacji do 10 pól db varchar waniliowych. Jest to denormalizacja schematu, polegająca na tym, że zasadniczo wybiera się główny zestaw danych i 10 wartości kolumny aplikacji za jednym razem lub z maksymalnie jednym połączeniem w dodatkowej tabeli db. Zmieniając odpowiednie wartości, musielibyśmy również zmodyfikować ten jeden wiersz db w kodzie. Wydaje się to wykonalne i zmniejsza liczbę sprzężeń nawet o 10 dla wyboru wyświetlającego tablicę aplikacji. Jednak zmiana definicji kolumny aplikacji użytkownika jest wtedy bardzo droga.
thst
1
Jest ok, nie martw się. Myślę, że rozumiem twój punkt widzenia, a twoje podejście wydaje mi się dobrym kompromisem między poprawą wydajności a wykonalnością. Ważne jest, aby mieć statystyki użytkowania, aby ustalić te pola. Czy przeprowadziłeś testy? Przynajmniej może to dać ci trochę czasu, zanim znajdziesz (lepsze? Definitywne?) Rozwiązanie, lub może odkryć, że możesz z tym pracować przez długi czas.
LironCareto