Co to jest klucz główny skrótu i ​​zakresu?

Odpowiedzi:

571

Klucz główny skrótu i ​​zakresu ” oznacza, że ​​pojedynczy wiersz w DynamoDB ma unikalny klucz główny złożony zarówno z skrótu, jak i klucza zakresu . Na przykład z kluczem skrótu X i klawiszem zakresu Y , kluczem podstawowym jest XY . Możesz także mieć wiele kluczy zakresu dla tego samego klucza skrótu, ale kombinacja musi być unikalna, na przykład XZ i XA . Użyjmy ich przykładów dla każdego rodzaju tabeli:

Klucz główny skrótu - klucz podstawowy składa się z jednego atrybutu, atrybutu skrótu. Na przykład tabela ProductCatalog może mieć ProductID jako swój klucz podstawowy. DynamoDB buduje nieuporządkowany indeks skrótu na tym atrybucie klucza podstawowego.

Oznacza to, że każdy wiersz jest wyłączony z tej wartości. Każdy wiersz w DynamoDB będzie miał wymaganą, unikalną wartość dla tego atrybutu . Nieuporządkowany indeks skrótu oznacza to, co mówi - dane nie są uporządkowane i nie daje się żadnych gwarancji dotyczących sposobu przechowywania danych. Nie będzie w stanie dokonać zapytania na indeksie nieuporządkowanej takich jak zrozumcie mnie wszystkie wiersze, które mają większą ProductID niż x . Piszesz i pobierasz elementy na podstawie klucza skrótu. Na przykład, Daj mi wiersz z tej tabeli, która ma ProductID X . Pytasz o nieuporządkowany indeks, więc dostajesz się do niego w zasadzie wyszukiwania klucz-wartość, są one bardzo szybkie i wymagają bardzo małej przepustowości.


Klucz główny skrótu i ​​zakresu - klucz podstawowy składa się z dwóch atrybutów. Pierwszy atrybut to atrybut skrótu, a drugi atrybut to atrybut zakresu. Na przykład tabela wątków forum może mieć ForumName i Temat jako klucz podstawowy, gdzie ForumName to atrybut skrótu, a Temat to atrybut zakresu. DynamoDB buduje nieuporządkowany indeks skrótu na atrybucie skrótu i ​​indeks posortowanego zakresu na atrybucie zakresu.

Oznacza to, że kluczem podstawowym każdego wiersza jest kombinacja klucza skrótu i ​​zakresu . Możesz wykonać bezpośrednie pobieranie w pojedynczych wierszach, jeśli masz zarówno klucz skrótu, jak i zakres, lub możesz wykonać zapytanie dotyczące posortowanego indeksu zakresu . Na przykład pobierz Uzyskaj wszystkie wiersze z tabeli za pomocą klawisza skrótu X, które mają klucze zakresu większe niż Y , lub inne zapytania, które mają na to wpływ. Mają lepszą wydajność i mniejsze zużycie pojemności w porównaniu do skanów i zapytań względem pól, które nie są indeksowane. Z ich dokumentacji :

Wyniki zapytania są zawsze sortowane według klucza zakresu. Jeśli typ danych klucza zakresu to Number, wyniki są zwracane w kolejności numerycznej; w przeciwnym razie wyniki są zwracane w kolejności według wartości kodu znaków ASCII. Domyślnie kolejność sortowania jest rosnąca. Aby odwrócić kolejność, ustaw parametr ScanIndexForward na false

Prawdopodobnie przeoczyłem kilka rzeczy, pisząc to i tylko podrapałem się po powierzchni. Istnieje wiele więcej aspektów, które należy wziąć pod uwagę przy pracy z tabelami DynamoDB (przepustowość, konsystencja, pojemności, innych indeksów, dystrybucji kluczy, itp). Przykłady można znaleźć w przykładowych tabelach i na stronie danych .

mkobit
źródło
53
jest to jedna z najbardziej przydatnych odpowiedzi na przepełnienie stosu, jakie kiedykolwiek przeczytałem.
Tommy
7
Dlaczego nie ma opcji używania zakresu bez skrótu? Na przykład, jeśli wszystkie moje dane są przechowywane ze znacznikiem czasu jako kluczem podstawowym, chciałbym mieć możliwość wybrania „wszystkich danych między 14.00 a 16.00 w dniu
15.10.2015 r.
3
@Teofrostus, klucz skrótu służy do identyfikacji partycji zawierającej elementy. Bez niego DynamoDB nie sprawdziłby, w której partycji zajrzeć. Nie wiedząc, gdzie szukać, pokonuje Kwerendę, i jest przypadkiem użycia Skanowania (lub Globalnego Indeksu Dodatkowego, ale nie nadaje się do użycia przez użycie tylko czasu seria do wyboru danych).
sheldonh
1
@ mkobit czy jest jakiś sposób, aby odzyskać wszystkie klucze sortowania danego klucza partycji bez skanowania?
nieznany błąd
1
@VNR Nie jestem pewien, czy rozumiem twoje pytanie w kontekście DynamoDB. Czy mówisz, że otrzymujesz wszystkie klucze skrótu + zakresu, podając klucz skrótu?
mkobit
19

Ponieważ cała sprawa się miesza, spójrzmy na jej funkcję i kod, aby symulować, co to znaczy

Jedyny sposób, aby uzyskać wiersz jest poprzez klucz podstawowy

getRow(pk: PrimaryKey): Row

Podstawowa struktura danych klucza może być następująca:

// If you decide your primary key is just the partition key.
class PrimaryKey(partitionKey: String)

// and in thids case
getRow(somePartitionKey): Row

Jednak w tym przypadku możesz zdecydować, że klucz podstawowy to klucz partycji + klucz sortowania:

// if you decide your primary key is partition key + sort key
class PrimaryKey(partitionKey: String, sortKey: String)

getRow(partitionKey, sortKey): Row
getMultipleRows(partitionKey): Row[]

Więc dolna linia:

  1. Zdecydowałeś, że twoim kluczem podstawowym jest tylko klucz partycji? pobierz pojedynczy wiersz według klucza partycji.

  2. Zdecydowałeś, że twoim kluczem podstawowym jest klucz partycji + klucz sortowania? 2.1 Uzyskaj pojedynczy wiersz według (klucz podziału, klucz sortowania) lub uzyskaj zakres wierszy według (klucz podziału)

W obu przypadkach otrzymujesz pojedynczy wiersz według klucza podstawowego, jedynym pytaniem jest, czy zdefiniowałeś ten klucz podstawowy jako tylko klucz partycji lub klucz partycji + klucz sortowania

Bloki konstrukcyjne to:

  1. Stół
  2. Pozycja
  3. Atrybut KV.

Pomyśl o Przedmiotu jako o rzędzie, a o Atrybucie KV o komórkach w tym rzędzie.

  1. Możesz dostać przedmiot (rząd) kluczem podstawowym.
  2. Możesz uzyskać wiele elementów (wiele wierszy), określając (HashKey, RangeKeyQuery)

Możesz zrobić (2) tylko wtedy, gdy zdecydujesz, że twoja PK składa się z (HashKey, SortKey).

Bardziej wizualnie, ponieważ jest złożony, tak jak go widzę:

+----------------------------------------------------------------------------------+
|Table                                                                             |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...|                       |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|+------------------------------------------------------------------------------+  |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...| |kv attr ...|         |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|+------------------------------------------------------------------------------+  |
|                                                                                  |
+----------------------------------------------------------------------------------+

+----------------------------------------------------------------------------------+
|1. Always get item by PrimaryKey                                                  |
|2. PK is (Hash,RangeKey), great get MULTIPLE Items by Hash, filter/sort by range     |
|3. PK is HashKey: just get a SINGLE ITEM by hashKey                               |
|                                                      +--------------------------+|
|                                 +---------------+    |getByPK => getBy(1        ||
|                 +-----------+ +>|(HashKey,Range)|--->|hashKey, > < or startWith ||
|              +->|Composite  |-+ +---------------+    |of rangeKeys)             ||
|              |  +-----------+                        +--------------------------+|
|+-----------+ |                                                                   |
||PrimaryKey |-+                                                                   |
|+-----------+ |                                       +--------------------------+|
|              |  +-----------+   +---------------+    |getByPK => get by specific||
|              +->|HashType   |-->|get one item   |--->|hashKey                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

Co się dzieje powyżej. Zwróć uwagę na następujące obserwacje. Jak powiedzieliśmy, nasze dane należą do (Tabela, pozycja, KVAttribute). Następnie każdy przedmiot ma klucz podstawowy. Teraz sposób, w jaki skomponowałeś ten klucz podstawowy, ma znaczenie dla uzyskania dostępu do danych.

Jeśli zdecydujesz, że klucz podstawowy to po prostu klucz skrótu, to świetnie, że możesz z niego wydobyć pojedynczy przedmiot. Jeśli jednak zdecydujesz, że kluczem podstawowym jest hashKey + SortKey, możesz również wykonać zapytanie dotyczące zakresu na kluczu podstawowym, ponieważ otrzymasz swoje przedmioty przez (HashKey + SomeRangeFunction (klawisz zakresu)). Dzięki temu możesz uzyskać wiele elementów za pomocą zapytania o klucz podstawowy.

Uwaga: nie odnosiłem się do indeksów wtórnych.

Tomer Ben David
źródło
4

Dobrze wyjaśniona odpowiedź została już podana przez @mkobit, ale dodam duży obraz klawisza zakresu i klawisza skrótu.

W prostych słowach range + hash key = composite primary key CoreComponents of Dynamodb wprowadź opis zdjęcia tutaj

Klucz podstawowy składa się z klucza skrótu i ​​opcjonalnego klucza zakresu. Klawisz skrótu służy do wybierania partycji DynamoDB. Partycje są częściami danych tabeli. Klucze zakresu służą do sortowania elementów partycji, jeśli istnieją.

Oba mają więc inny cel i razem pomagają w złożonym zapytaniu. W powyższym przykładzie hashkey1 can have multiple n-range.Innym przykładem zakresu i skrótu jest gra, użytkownik A (hashkey)może grać w Ngame(range)

wprowadź opis zdjęcia tutaj

Tabela muzyki opisana w tabelach, przedmiotach i atrybutach jest przykładem tabeli ze złożonym kluczem podstawowym (Artist i SongTitle). Możesz uzyskać bezpośredni dostęp do dowolnego elementu w tabeli muzyki, jeśli podasz dla tego elementu wartości Artist i SongTitle.

Złożony klucz podstawowy zapewnia dodatkową elastyczność przy wyszukiwaniu danych. Na przykład, jeśli podasz tylko wartość Wykonawcy, DynamoDB pobierze wszystkie utwory tego wykonawcy. Aby pobrać tylko podzbiór utworów określonego wykonawcy, możesz podać wartość Wykonawca wraz z zakresem wartości SongTitle.

wprowadź opis zdjęcia tutaj

https://www.slideshare.net/InfoQ/amazon-dynamodb-design-patterns-best-practices https://www.slideshare.net/AmazonWebServices/awsome-day-2016-module-4-databases-amazon-dynamodb -and-amazon-rds https://ceyhunozgun.blogspot.com/2017/04/implementing-object-persistence-with-dynamodb.html

Adii
źródło
W przykładzie z Musictabelą jeden artysta nie może wyprodukować dwóch piosenek o tym samym tytule, ale niespodzianka - w grach wideo mamy Dooma z 1993 roku i Dooma z 2016 roku en.wikipedia.org/wiki/Doom_(franchise) z tym samym „artystą” ( programista) id Software.
Witalij Zdanewicz
0

@vnr można pobrać wszystkie klucze sortowania powiązane z kluczem partycji, po prostu używając zapytania za pomocą klucza partycji. Nie ma potrzeby skanowania. Chodzi o to, że klucz partycji jest obowiązkowy w zapytaniu. Klawisz sortowania służy tylko do uzyskania zakresu danych

Srini Sydney
źródło