Różnica między kluczem partycji, kluczem kompozytowym i kluczem klastrowym w Cassandrze?

Czytałem artykuły w sieci, aby zrozumieć różnice między następującymi typami key. Ale wydaje mi się to trudne do uchwycenia. Przykłady z pewnością pomogą lepiej zrozumieć.

primary key,
partition key, 
composite key 
clustering key
Author: Rodrigo, 2014-07-25

7 answers

Wokół tego jest wiele zamieszania, postaram się to uprościć jak to tylko możliwe.

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

Kluczem podstawowym może być proste a nawet zadeklarowane w linii:

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

Oznacza to, że jest wykonana przez jedną kolumnę.

Ale kluczem podstawowym może być również kompozytowe (aka związek ), generowane 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 kompozytowe klucz podstawowy," pierwsza część " klucza nazywa się klucz partycji (w tym przykładzie key_part_one jest kluczem partycji), a druga część klucza to Klucz klastrowy (w tym przykładzie key_part_two )

Należy pamiętać, że zarówno klucz partycji, jak i klastra mogą być wykonane 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 nazwiskami ...

  • klucz partycji jest odpowiedzialny za dystrybucję danych w węzłach.
  • klucz klastrowy jest odpowiedzialny za sortowanie danych wewnątrz partycji.
  • klucz podstawowy jest odpowiednikiem klucza partycji w tabeli kluczy z pojedynczym polem (np. prosty ).
  • klucz złożony/złożony jest dowolną wielokolumnową klucz

Dalsze informacje o użytkowaniu: dokumentacja DATASTAX


Przykłady małych zastosowań i treści
proste klucz:
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

Zawartość tabeli

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

klucz złożony / złożony można pobierać "szerokie wiersze" (tzn. można odpytywać tylko za pomocą klucza partycji, nawet jeśli masz zdefiniowane 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żna zapytać z wszystkich kluczy (zarówno partycji, jak i klastrów)...

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

Wyjście 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, jak poniżej

Eg: PRIMARY KEY((col1, col2), col10, col4))

Możesz wykonać zapytanie tylko przekazując co najmniej col1 i col2, są to Kolumny 2, które definiują klucz partycji. "Ogólna" zasada, aby zapytanie jest trzeba przekazać co najmniej wszystkie partycjonuj kolumny kluczy, następnie możesz dodać opcjonalnie każdy klucz klastrowy w kolejności, w jakiej są ustawione.

Więc poprawne zapytania to ( z wyłączeniem indeksów drugorzędnych )

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

Invalid:

  • col1 i col2 i col4
  • wszystko, co nie zawiera zarówno col1 jak i col2
Mam nadzieję, że to pomoże.
 931
Author: Carlo Bertuccini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 08:01:18

Dodanie odpowiedzi redux jako zaakceptowanej jest dość długie. Terminy " row " i "column" są używane w kontekście CQL, a nie w jaki sposób Cassandra jest faktycznie zaimplementowana.

  • klucz podstawowy jednoznacznie identyfikuje wiersz.
  • klucz złożony jest kluczem utworzonym z wielu kolumn.
  • klucz partycji jest podstawowym narzędziem do wyszukiwania zbioru wierszy, np. partycji.
  • klucz klastrowy jest częścią klucza podstawowego, która nie jest kluczem partycji (i definiuje uporządkowanie wewnątrz partycji).

Przykłady:

  • PRIMARY KEY (a): kluczem partycji jest a.
  • PRIMARY KEY (a, b): kluczem partycji jest a, kluczem klastrowania jest b.
  • PRIMARY KEY ((a, b)): kluczem partycji złożonej jest (a, b).
  • PRIMARY KEY (a, b, c): kluczem partycji jest a, kluczem klastra złożonego jest (b, c).
  • PRIMARY KEY ((a, b), c): kluczem partycji złożonej jest (a, b), kluczem klastrowania jest c.
  • PRIMARY KEY ((a, b), c, d): kompozytowy klucz partycji to (a, b), złożony kluczem klastrowym jest (c, d).
 84
Author: OrangeDog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-14 14:13:24

W Cassandrze różnica między kluczem podstawowym,kluczem partycji, kluczem złożonym, kluczem klastrowym zawsze powoduje pewne zamieszanie.. Więc zamierzam wyjaśnić poniżej i co odnoszą się do siebie nawzajem. Używamy CQL (Cassandra Query Language) do dostępu do bazy danych Cassandra. Uwaga: - odpowiedź jest zgodna z zaktualizowaną wersją Cassandry. Klucz Podstawowy :-

W Cassandrze są 2 różne sposoby użycia klucza podstawowego .

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

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

W CQL, kolejność w jakiej kolumny są zdefiniowane dla najważniejszych spraw. Pierwsza kolumna klucza jest nazywana kluczem partycji posiadającym właściwość, że wszystkie wiersze współdzielące ten sam klucz partycji (nawet w rzeczywistości w całej tabeli) są przechowywane na tym samym fizycznym węźle. Ponadto wstawianie/aktualizowanie / usuwanie wierszy dzielących ten sam klucz partycji dla danej tabeli jest wykonywane atomicznie i w izolacji. Zauważ, że możliwe jest posiadanie klucza partycji kompozytowej, tj. klucza partycji złożonego z wielu kolumn, używając dodatkowego zestawu nawiasów do określ, które kolumny tworzą klucz partycji.

Partycjonowanie i klastrowanie Definicja klucza podstawowego składa się z dwóch części: klucza partycji i kolumn grupujących. Pierwsza część mapuje do klucza wiersza silnika pamięci masowej, podczas gdy 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)
);

Tutaj device_id to klucz partycji, a checked_at to cluster_key.

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

 12
Author: Big Data Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-15 08:51:40

Klucz podstawowy : składa się z kluczy partycji [i opcjonalnych kluczy klastrowych (lub kolumn)]
klucz partycji: wartość hash klucza partycji jest używana do określenia konkretnego węzła w klastrze do przechowywania danych
Klucz klastrowy : służy do sortowania danych w każdej z partycji (lub odpowiedzialnych węzłów i ich replik)

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

Composite Partition Key: użycie tylko jednej kolumny jako klucza partycji może spowodować problemy z szerokimi wierszami (zależy od przypadku użycia/modelowania danych). Stąd klucz partycji jest czasami określany jako kombinacja więcej niż jednej kolumny.

co do zamieszania, z których jeden jest obowiązkowy, które można pominąć itp. w zapytaniu, starając się imagine Kasandra jako olbrzym pomaga. Tak więc w Hashmapie nie można pobrać wartości bez klucza.
Tutaj, Klucze partycji odgrywają rolę tego klucza. Więc każde zapytanie musi mieć je określone. Bez którego Cassandra nie będzie wiedziała, którego węzła szukać.
Klucze klastrowania (kolumny, które są opcjonalne) pomagają w dalszym zawężaniu wyszukiwania zapytań po tym, jak Cassandra znajdzie konkretny węzeł (i jego repliki) odpowiedzialny za ten konkretny klucz partycji .

 5
Author: dd9chndn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-29 11:05:50

W skrócie:

Klucz partycji to nic innego jak identyfikacja dla wiersza, ta identyfikacja najczęściej jest pojedynczą kolumną (zwaną kluczem podstawowym) czasami kombinacją wielu kolumn (zwaną kluczem kompozytowym partycji).

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

  1. Jakich kolumn używasz w klauzuli where oprócz podstawowej kluczowe kolumny.

  2. Jeśli masz bardzo duże rekordy, to na czym mogę podzielić datę dla łatwego zarządzania. Na przykład, Mam dane z 1million ewidencji ludności hrabstwa. Więc dla łatwego zarządzania, i klastra danych na podstawie stanu i po pincode i tak dalej.

 3
Author: Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 06:30:21

Warto zauważyć, że prawdopodobnie użyjesz ich o wiele więcej niż w podobnych pojęciach w świecie relacyjnym (klucze złożone).

Przykład-załóżmy, że musisz znaleźć ostatnich n użytkowników, którzy niedawno dołączyli do grupy użytkowników X. Jak to zrobić efektywnie, ponieważ odczyty są dominujące w tym przypadku? Jak to (z oficjalnego poradnika Cassandry):

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, klucz partycjonujący jest sam w sobie złożony, a klucz klastrujący jest datą połączoną. Powód klastra klucz {[9] } jest datą przyłączenia, ponieważ wyniki są już sortowane (i przechowywane, co sprawia, że wyszukiwanie jest szybkie). Ale dlaczego używamy klucza złożonego dla klucza partycjonującego ? Ponieważ zawsze chcemy odczytać jak najmniej partycji. Jak umieszczenie join_date tam pomaga? Teraz użytkownicy z tej samej grupy i tej samej daty dołączenia będą rezydować w jednej partycji! Oznacza to, że zawsze będziemy czytać jak najmniej partycji (najpierw zacznij od najnowszej, następnie przejdź do starszej i tak NA, zamiast skakać między nimi).

W rzeczywistości, w skrajnych przypadkach trzeba również użyć hash join_date zamiast join_date sam - tak, że jeśli zapytasz o Ostatnie 3 dni często te mają ten sam hash i dlatego są dostępne z tej samej partycji!

 0
Author: kboom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-24 16:50:56

W projektowaniu bazy danych klucz złożony to zestaw superkluczy, który nie jest minimalny.

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

Podana tabela: pracownicy {employee_id, imię, nazwisko}

Możliwe superkey to:

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

{employee_id} jest jedynym minimalnym superkey, co czyni go również jedynym kluczem kandydata -- biorąc pod uwagę, że {firstname} i {nazwisko} nie gwarantują wyjątkowości. Ponieważ podstawowym kluczem jest zdefiniowany jako wybrany klucz kandydata i w tym przykładzie istnieje tylko jeden klucz kandydata, {employee_id} jest minimalnym kluczem superkey, jedynym kluczem kandydata i jedynym możliwym kluczem głównym.

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

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

Jedynym kluczem złożonym jest {employee_id, firstname, surname} , ponieważ ten klucz zawiera klucz złożony ({employee_id,firstname}) i atrybut, który nie jest superkey ({nazwisko}).

 -2
Author: Khurana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 10:18:38