Chociaż język zapytań Cassandra przypomina język SQL, ich metody modelowania danych są zupełnie inne.
W Cassandrze zły model danych może obniżyć wydajność, zwłaszcza gdy użytkownicy próbują zaimplementować koncepcje RDBMS na Cassandrze. Najlepiej jest pamiętać o kilku zasadach opisanych poniżej.
W tym samouczku nauczysz się:
- Zasady modelu danych Cassandra
- Modeluj swoje dane w Cassandrze
- Obsługa relacji jeden do jednego
- Obsługa relacji jeden do wielu
- Obsługa wielu do wielu relacji
Zasady modelu danych Cassandra
W Cassandrze pisma nie są drogie. Cassandra nie obsługuje łączeń, grupowania, klauzuli OR, agregacji itp. Musisz więc przechowywać swoje dane w taki sposób, aby można było je w pełni odzyskać. Dlatego należy pamiętać o tych zasadach podczas modelowania danych w Cassandrze.
- Zmaksymalizuj liczbę zapisów
W Cassandrze pisma są bardzo tanie. Cassandra jest zoptymalizowana pod kątem wysokiej wydajności zapisu. Spróbuj więc zmaksymalizować swoje zapisy, aby uzyskać lepszą wydajność odczytu i dostępność danych. Istnieje kompromis między zapisem i odczytem danych. Dlatego zoptymalizuj wydajność odczytu danych, maksymalizując liczbę zapisów danych.
- Maksymalizuj powielanie danych
Denormalizacja danych i duplikacja danych są defacto Cassandry. Miejsce na dysku nie jest droższe niż pamięć, przetwarzanie procesora i operacje we / wy. Ponieważ Cassandra jest rozproszoną bazą danych, duplikacja danych zapewnia natychmiastową dostępność danych i brak pojedynczego punktu awarii.
Cele modelowania danych
Podczas modelowania danych w Cassandrze powinieneś mieć następujące cele.
- Rozłóż dane równomiernie w klastrze
Chcesz mieć taką samą ilość danych w każdym węźle klastra Cassandra. Dane są rozprowadzane do różnych węzłów na podstawie kluczy partycji, czyli pierwszej części klucza podstawowego. Spróbuj więc wybrać liczby całkowite jako klucz podstawowy do równomiernego rozprowadzania danych w klastrze.
- Zminimalizuj liczbę partycji odczytywanych podczas odpytywania danych
Partycja to grupa rekordów z tym samym kluczem partycji. Po wysłaniu zapytania odczytu zbiera dane z różnych węzłów z różnych partycji.
Jeśli będzie wiele partycji, wszystkie te partycje należy odwiedzić w celu zebrania danych zapytania.
Nie oznacza to, że partycje nie powinny być tworzone. Jeśli twoje dane są bardzo duże, nie możesz przechowywać tak dużej ilości danych na jednej partycji. Pojedyncza partycja zostanie spowolniona.
Spróbuj więc wybrać zrównoważoną liczbę partycji.
Dobry klucz podstawowy
Weźmy przykład i sprawdźmy, który klucz podstawowy jest dobry.
Oto tabela MusicPlaylist.
Create table MusicPlaylist(SongId int,SongName text,Year int,Singer text,Primary key(SongId, SongName));
W powyższym przykładzie tabela MusicPlaylist,
- Songid jest kluczem partycji, a
- SongName to kolumna grupująca
- Dane będą grupowane na podstawie SongName. Tylko jedna partycja zostanie utworzona z SongId. W tabeli MusicPlaylist nie będzie żadnej innej partycji.
Pobieranie danych będzie powolne przez ten model danych z powodu złego klucza podstawowego.
Oto kolejna tabela MusicPlaylist.
Create table MusicPlaylist(SongId int,SongName text,Year int,Singer text,Primary key((SongId, Year), SongName));
W powyższym przykładzie tabela MusicPlaylist,
- Songid i Year to klucz partycji, a
- SongName to kolumna grupująca.
- Dane będą grupowane na podstawie SongName. W tej tabeli co roku tworzona będzie nowa partycja. Wszystkie piosenki roku będą w tym samym węźle. Ten klucz podstawowy będzie bardzo przydatny dla danych.
Dzięki temu modelowi danych pobieranie naszych danych będzie szybkie.
Modeluj swoje dane w Cassandrze
Podczas modelowania zapytań należy pamiętać o następujących rzeczach.
- Określ, jakie zapytania chcesz obsługiwać
- Łączy
- Grupuj według
- Filtrowanie według której kolumny itp.
- Utwórz tabelę zgodnie ze swoimi zapytaniami
Utwórz tabelę zgodnie ze swoimi zapytaniami. Stwórz tabelę, która spełni Twoje pytania. Spróbuj utworzyć tabelę w taki sposób, aby odczytać minimalną liczbę partycji.
Przede wszystkim określ, jakie zapytania chcesz.
Na przykład czy potrzebujesz?
Obsługa relacji jeden do jednego
Relacja jeden do jednego oznacza, że dwie tabele mają odpowiedniki jeden do jednego. Na przykład student może zarejestrować tylko jeden kurs, a ja chcę wyszukać studenta, na który kurs jest zapisany.
W tym przypadku schemat tabeli powinien obejmować wszystkie szczegóły dotyczące ucznia odpowiadające temu konkretnemu kursowi, takie jak nazwa kursu, numer wpisu studenta, nazwisko ucznia itp.
Create table Student_Course(Student rollno int primary key,Student_name text,Course_name text,);
Obsługa relacji jeden do wielu
Relacje jeden do wielu oznacza, że między dwiema tabelami występuje jeden do wielu odpowiedników.
Na przykład kurs może być studiowany przez wielu studentów. Chcę wyszukać wszystkich studentów, którzy studiują dany kurs.
Więc pytając o nazwę kursu, otrzymam nazwiska wielu studentów, którzy będą studiować dany kurs.
Create table Student_Course(Student_rollno int,Student_name text,Course_name text,);
Mogę pobrać wszystkich studentów do określonego kursu za pomocą następującego zapytania.
Select * from Student_Course where Course_name='Course Name';
Obsługa wielu do wielu relacji
Relacje wiele do wielu oznacza wiele do wielu korespondencji między dwiema tabelami.
Na przykład kurs może być studiowany przez wielu studentów, a student może również uczyć się wielu kursów.
Chcę wyszukać wszystkich studentów, którzy studiują dany kurs. Chcę również przeszukać cały kurs, który studiuje dany student.
Więc w tym przypadku będę miał dwie tabele, tj. Podzielę problem na dwa przypadki.
Najpierw utworzę tabelę, za pomocą której możesz znaleźć kursy dla konkretnego ucznia.
Create table Student_Course(Student_rollno int primary key,Student_name text,Course_name text,);
Mogę znaleźć wszystkie kursy danego ucznia za pomocą następującego zapytania. ->
Select * from Student_Course where student_rollno=rollno;
Po drugie, utworzę tabelę, w której możesz sprawdzić, ilu studentów studiuje na danym kursie.
Create table Course_Student(Course_name text primary key,Student_name text,student_rollno int);
Potrafię znaleźć studenta na określonym kursie za pomocą następującego zapytania.
Select * from Course_Student where Course_name=CourseName;
Różnica między RDBMS i Cassandra Data Modeling
RDBMS |
Cassandra |
Przechowuje dane w znormalizowanej formie |
Przechowuje dane w zdenormalizowanej formie |
Starsze dbms; uporządkowane dane |
Sklep z szerokimi rzędami, dynamiczny; dane ustrukturyzowane i nieustrukturyzowane |
Podsumowanie
Modelowanie danych w Cassandrze różni się od innych baz danych RDBMS. Modelowanie danych w Cassandrze ma pewne zasady. Zasady te muszą być przestrzegane w celu dobrego modelowania danych. Oprócz tych reguł widzieliśmy trzy różne przypadki modelowania danych i sposoby radzenia sobie z nimi.