Różnica między kluczem partycji, kluczem złożonym a kluczem do klastrowania w Cassandrze?


523

Czytałem artykuły w Internecie, aby zrozumieć różnice między następującymi keytypami. Ale trudno mi to pojąć. Przykłady z pewnością pomogą lepiej zrozumieć.

primary key,
partition key, 
composite key 
clustering key

23
Znalazłem ten artykuł, który zawiera wiele szczegółowych wyjaśnień dotyczących tych pojęć.
mynków

W tym artykule wyraźnie wskazano te warunki.
duong_dajgja

@duong_dajgja URL udostępniony przez Ciebie powyżej jest uszkodzony, czy możesz edytować komentarz za pomocą prawidłowego / przydatnego adresu URL?
realPK

@realPK Link jakoś zniknął. Ale znalazłem dla ciebie kolejny link tutaj quora.com/… .
duong_dajgja

Odpowiedzi:


1171

Jest wiele zamieszania wokół tego, postaram się uczynić to tak prostym, jak to możliwe.

Klucz podstawowy to ogólna koncepcja wskazująca jedną lub więcej kolumn używanych do pobierania danych z tabeli.

Klucz podstawowy może być PROSTY, a nawet zadeklarowany wbudowany:

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );

Oznacza to, że składa się z jednej kolumny.

Ale kluczem podstawowym może być również KOMPOZYT (zwany ZWIĄZKIEM ), generowany z większej liczby kolumn.

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, key_part_two)      
  );

W sytuacji klucza podstawowego KOMPOZYTOWEGO „pierwsza część” klucza nazywa się KLUCZEM PARTYCJI (w tym przykładzie klucz_part_one to klucz partycji), a drugą częścią klucza jest KLUCZ klastrowy (w tym przykładzie key_part_two )

Należy pamiętać, że zarówno partycja, jak i klucz klastrowania mogą być tworzone przez więcej kolumn , oto jak:

 create table stackoverflow_multiple (
      k_part_one text,
      k_part_two int,
      k_clust_one text,
      k_clust_two int,
      k_clust_three uuid,
      data text,
      PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)      
  );

Za tymi nazwami ...

  • Klucz podziału jest odpowiedzialna za dystrybucję danych w całej węzłów.
  • Klastry Kluczowe jest odpowiedzialny za sortowania danych w partycji.
  • Klucz podstawowy jest równoznaczne z kluczem podziału w tabeli pojedynczego pola klucz (czyli prosty ).
  • Composite / Key związek jest po prostu dowolny klawisz wielokrotnego kolumna

Dalsze informacje o użytkowaniu: DOKUMENTACJA DANYCH


Małe przykłady użycia i treści
PROSTY KLUCZ:

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

zawartość tabeli

key | data
----+------
han | solo

KLUCZ KOMPOZYTOWY / ZWIĄZANY może wyszukiwać „szerokie wiersze” (tzn. Można wyszukiwać tylko za pomocą klucza partycji, nawet jeśli zdefiniowano klucze klastrowania)

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';

zawartość tabeli

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player

Ale możesz wykonać zapytanie za pomocą całego klucza (zarówno partycji, jak i klastrowania) ...

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;

wynik zapytania

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player

Ważna uwaga: klucz partycji jest minimalnym specyfikatorem potrzebnym do wykonania zapytania za pomocą where clause. Jeśli masz złożony klucz partycji, taki jak poniżej

na przykład: PRIMARY KEY((col1, col2), col10, col4))

Możesz wykonać zapytanie tylko przekazując co najmniej zarówno col1, jak i col2, są to 2 kolumny, które definiują klucz partycji. Zgodnie z ogólną zasadą zapytania należy przekazać co najmniej wszystkie kolumny kluczy partycji, a następnie można opcjonalnie dodać każdy klucz klastrowania w kolejności, w jakiej są ustawione.

więc prawidłowe zapytania to (z wyłączeniem indeksów wtórnych )

  • col1 i col2
  • col1 i col2 i col10
  • col1 i col2 oraz col10 i col 4

Nieważny:

  • col1 i col2 i col4
  • wszystko, co nie zawiera zarówno col1, jak i col2

Mam nadzieję że to pomoże.


7
Jak napisałem - << „Ogólną” zasadą do zapytania jest to, że musisz przekazać przynajmniej wszystkie kolumny kluczy partycji, a następnie możesz dodać każdy klucz w kolejności, w jakiej są ustawione. >> - ponieważ col10 jest wcześniej zdefiniowany col4 musisz przekazać go do zapytania również o col4
Carlo Bertuccini,

2
Możesz dodać indeksy wtórne, ale to nie znaczy, że możesz wykonać „dowolne” zapytanie cql - i więcej: przed utworzeniem indeksu wtórnego powinieneś policzyć do 10 ... 000 ..... :)
Carlo Bertuccini

2
Indeksy wtórne są implementowane jako indeksy lokalne - nie są dystrybuowane w klastrze. Każdy węzeł klastra jest odpowiedzialny za przechowywanie wtórnych indeksów danych, które posiada. Z tego powodu zapytanie dotyczące sec.index może obejmować wszystkie węzły w klastrze
Carlo Bertuccini,

5
Przez kilka dni to mnie myliło, dzięki za tę odpowiedź, teraz jestem w stanie zbudować model danych w mojej głowie.
Roger Dwan

2
łał. właśnie uratowałeś mnie godziny lub dni! Dziękuję, wspaniałe wyjaśnienie.
Andre Garcia,

128

Dodanie odpowiedzi podsumowującej jako zaakceptowanej jest dość długie. Terminy „wiersz” i „kolumna” są używane w kontekście CQL, a nie w jaki sposób Cassandra jest faktycznie implementowana.

  • Klucz podstawowy jednoznacznie identyfikuje wiersz.
  • Klucz kompozyt jest kluczowym utworzone z wielu kolumn.
  • Klucz partycji jest podstawowym odnośnika do znalezienia zestawu wierszy, czyli partycji.
  • Klucz klastrów jest częścią klucza podstawowego, który nie jest kluczem podziału (i określa kolejność wewnątrz partycji).

Przykłady:

  • PRIMARY KEY (a): Klucz partycji to a.
  • PRIMARY KEY (a, b): Klucz partycji to aklucz klastrowania b.
  • PRIMARY KEY ((a, b)): Złożony klucz partycji to (a, b).
  • PRIMARY KEY (a, b, c): Klucz partycji jest a, kluczem klastrowania kompozytowego jest (b, c).
  • PRIMARY KEY ((a, b), c): Kluczem partycji kompozytowej jest (a, b)klucz klastrowania c.
  • PRIMARY KEY ((a, b), c, d): Złożony klucz partycji to (a, b)kompozytowy klucz klastrowania (c, d).

15

W Cassandra różnica między kluczem podstawowym, kluczem partycji, kluczem złożonym, kluczem do klastrowania zawsze powoduje pewne zamieszanie. Więc wyjaśnię poniżej i będę odnosić się do siebie nawzajem. Używamy CQL (Cassandra Query Language) do dostępu do bazy danych Cassandra. Uwaga: - Odpowiedź jest zgodna ze zaktualizowaną wersją Cassandry. Główny klucz :-

W Cassandra istnieją 2 różne sposoby korzystania z klucza podstawowego.

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

W CQL kolejność definiowania kolumn dla KLUCZA PODSTAWOWEGO ma znaczenie. Pierwsza kolumna klucza nazywa się kluczem partycji posiadającym właściwość polegającą na tym, że wszystkie wiersze współdzielące ten sam klucz partycji (nawet w całej tabeli) są przechowywane w tym samym węźle fizycznym. Również wstawianie / aktualizacja / usuwanie w wierszach współużytkujących ten sam klucz partycji dla danej tabeli są wykonywane atomowo i oddzielnie. Zauważ, że możliwe jest posiadanie złożonego klucza partycji, tj. Klucza partycji utworzonego z wielu kolumn, za pomocą dodatkowego zestawu nawiasów, aby określić, które kolumny tworzą klucz partycji.

Partycjonowanie i klastrowanie Definicja KLUCZA PODSTAWOWEGO składa się z dwóch części: klucza partycji i kolumn klastrowania. Pierwsza część jest mapowana na klucz wiersza silnika pamięci, a druga służy do grupowania kolumn w rzędzie.

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

W tym przypadku identyfikator_urządzenia jest kluczem partycji, a sprawdzony jest kluczem klastra.

Możemy mieć wiele kluczy klastrowych, a także klucz partycji, który zależy od deklaracji.


6

11

Klucz podstawowy : składa się z kluczy partycji [i opcjonalnych kluczy klastrowych (lub kolumn)]
Klucz partycji : Wartość skrótu klucza partycji służy do określenia określonego węzła w klastrze do przechowywania danych
Klucz klastrowania : służy do sortuj dane w każdej partycji (lub w węźle odpowiedzialnym i jego replikach)

Złożony klucz główny : jak wspomniano powyżej, klucze klastrowania są opcjonalne w kluczu podstawowym. Jeśli nie są wymienione, jest to prosty klucz podstawowy. Jeśli wspomniane są klucze klastrowania, jest to klucz podstawowy złożony.

Złożony klucz partycji : użycie tylko jednej kolumny jako klucza partycji może powodować problemy z szerokimi wierszami (zależy od przypadku użycia / modelowania danych). Dlatego klucz partycji jest czasem określany jako kombinacja więcej niż jednej kolumny.

Jeśli chodzi o zamieszanie, które z nich jest obowiązkowe , które można pominąć itp. W zapytaniu, spróbuj wyobrazić sobie Cassandrę jako ogromną HashMap . Tak więc w HashMap nie można pobrać wartości bez klucza.
Tutaj klawisze partycji pełnią rolę tego klucza. Dlatego każde zapytanie musi je określić. Bez którego Cassandra nie będzie wiedziała, którego węzła szukać.
Te klucze grupowania (kolumny, które są opcjonalne) pomagają w dalszych zawęzić wyszukiwanie zapytania po Cassandra dowie węzeł konkretny (i to replik) odpowiedzialny za tego konkretnego klucza podziału .


5

W skrócie:

Klucz partycji to nic innego jak identyfikacja wiersza, przy czym identyfikacja to najczęściej pojedyncza kolumna (zwana kluczem podstawowym ), czasem kombinacja wielu kolumn (zwana kompozytowym kluczem partycji ).

Klucz klastra to nic innego jak indeksowanie i sortowanie . Klucze klastra zależą od kilku rzeczy:

  1. Jakich kolumn używasz w klauzuli where z wyjątkiem kolumn klucza podstawowego.

  2. Jeśli masz bardzo duże rekordy, to pod jakim względem mogę podzielić datę łatwego zarządzania. Przykład, mam dane z 1 miliona rekordów populacji hrabstwa. Aby ułatwić zarządzanie, grupuję dane na podstawie stanu i kodu PIN itd.


3
Klucz partycji NIE jest identyfikacją wiersza A ... identyfikuje grupę wierszy, z których wszystkie mają ten sam klucz partycji
wmac

1

Warto zauważyć, że prawdopodobnie użyjesz tych partii więcej niż w podobnych koncepcjach w świecie relacyjnym (klucze złożone).

Przykład - załóżmy, że musisz znaleźć ostatnich N użytkowników, którzy ostatnio dołączyli do grupy użytkowników X. W jaki sposób zrobiłbyś to skutecznie, biorąc pod uwagę odczyty, w tym przypadku dominują? Tak (z oficjalnego przewodnika Cassandra ):

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

Tutaj partycjonowanie klucza jest związek sobą a klucz klastrów jest dołączył data. Powodem, dla którego klucz klastrowania jest datą złączenia, jest to, że wyniki są już sortowane (i przechowywane, co sprawia, że ​​wyszukiwanie jest szybkie). Ale dlaczego używamy klucza złożonego do podziału klucza ? Ponieważ zawsze chcemy czytać jak najmniej partycji . W jaki sposób umieszczenie w nim wartości join_date pomaga? Teraz użytkownicy z tej samej grupy i tej samej daty dołączenia będą znajdować się na jednej partycji! Oznacza to, że zawsze będziemy czytać jak najmniej partycji (najpierw zacznij od najnowszej, a następnie przejdź do starszej itd., Zamiast przeskakiwać między nimi).

W rzeczywistości, w ekstremalnych przypadkach, będziesz musiał użyć skrótu z Join_date zamiast samego Join_date - tak, że jeśli pytasz przez ostatnie 3 dni, często dzielą ten sam skrót i dlatego są dostępne z tej samej partycji!


0

Klucz podstawowy w Cassandra zwykle składa się z dwóch części - klucza partycji i kolumn klastrowania.

primary_key ((part_key), clustering_col)

Klucz partycji - pierwsza część klucza podstawowego. Głównym celem klucza partycji jest identyfikacja węzła, który przechowuje konkretny wiersz.

UTWÓRZ TABELĘ książka_telefoniczna (nr_telefonu, tekst imienia, wiek int, tekst miasta, KLUCZ PODSTAWOWY ((numer_ telefonu, imię), wiek);

Tutaj (numer_ telefonu, nazwa) to klucz partycji. Podczas wstawiania danych generowana jest wartość skrótu klucza partycji i ta wartość decyduje, do którego węzła powinien przejść wiersz.

Rozważ klaster 4-węzłowy, każdy węzeł ma zakres wartości skrótu, które może przechowywać. (Napisz) WSTAWIĆ DO WARTOŚCI książki telefonicznej (7826573732, „Joey”, 25, „Nowy Jork”);

Teraz wartość skrótu klucza partycji jest obliczana przez partycjoner Cassandra. powiedzmy, wartość skrótu (7826573732, „Joey”) → 12, teraz ten wiersz zostanie wstawiony do węzła C.

(Czytaj) WYBIERZ * Z KSIĄŻKI TELEFONICZNEJ GDZIE numer_przyczyny = 7826573732 i nazwa = „Joey”;

Teraz ponownie obliczana jest wartość skrótu klucza partycji (7826573732, „Joey”), która w naszym przypadku wynosi 12, a rezyduje ona w węźle C, z którego odbywa się odczyt.

  1. Klastry kolumn - druga część klucza podstawowego. Głównym celem posiadania grupowania kolumn jest przechowywanie danych w posortowanej kolejności. Domyślnie kolejność jest rosnąca.

W kluczu podstawowym może znajdować się więcej niż jeden klucz partycji i kolumny klastrowe, w zależności od rozwiązanego zapytania.

primary_key ((pk1, pk2), col 1, col2)


-3

W projekcie bazy danych klucz złożony to zbiór superkluczy, które nie są minimalne.

Klucz złożony to zestaw zawierający klucz złożony i co najmniej jeden atrybut, który nie jest superkluczem

Podana tabela: PRACOWNICY {identyfikator pracownika, imię, nazwisko}

Możliwe skróty to:

{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}

{pracownik_id} jest jedynym minimalnym superkluczem, co czyni go również jedynym kluczem kandydującym - biorąc pod uwagę, że {imię} i {nazwisko} nie gwarantują wyjątkowości. Ponieważ klucz podstawowy jest zdefiniowany jako wybrany klucz kandydujący i w tym przykładzie istnieje tylko jeden klucz kandydujący, {identyfikator_ pracownika} jest minimalnym superkluczem, jedynym kluczem kandydującym i jedynym możliwym kluczem podstawowym.

Wyczerpująca lista kluczy złożonych to:

{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}

Jedynym kluczem złożonym jest {identyfikator_ pracownika, imię, nazwisko}, ponieważ ten klucz zawiera klucz złożony ({identyfikator_ pracownika, imię}) i atrybut, który nie jest nadkluczem ({nazwisko}).


Pytanie zupełnie nie ma znaczenia. Edytuj odpowiedź, aby odpowiedzieć na klucze zadawane w kontekście Cassandry, a nie ogólne wyjaśnienie. TY.
realPK
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.