Czytałem artykuły w Internecie, aby zrozumieć różnice między następującymi key
typami. Ale trudno mi to pojąć. Przykłady z pewnością pomogą lepiej zrozumieć.
primary key,
partition key,
composite key
clustering key
Czytałem artykuły w Internecie, aby zrozumieć różnice między następującymi key
typami. Ale trudno mi to pojąć. Przykłady z pewnością pomogą lepiej zrozumieć.
primary key,
partition key,
composite key
clustering key
Odpowiedzi:
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 ...
Dalsze informacje o użytkowaniu: DOKUMENTACJA DANYCH
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 )
Nieważny:
Mam nadzieję że to pomoże.
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.
Przykłady:
PRIMARY KEY (a)
: Klucz partycji to a
.PRIMARY KEY (a, b)
: Klucz partycji to a
klucz 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)
.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 :-
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.
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 .
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:
Jakich kolumn używasz w klauzuli where z wyjątkiem kolumn klucza podstawowego.
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.
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!
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.
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)
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}).