Nie rozumiem, jaki jest klucz podstawowy zakresu -
i jak to działa?
Co rozumieją przez „nieuporządkowany indeks skrótu w atrybucie skrótu i posortowany indeks zakresu w atrybucie zakresu”?
Nie rozumiem, jaki jest klucz podstawowy zakresu -
i jak to działa?
Co rozumieją przez „nieuporządkowany indeks skrótu w atrybucie skrótu i posortowany indeks zakresu w atrybucie zakresu”?
Odpowiedzi:
„ 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 .
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:
Zdecydowałeś, że twoim kluczem podstawowym jest tylko klucz partycji? pobierz pojedynczy wiersz według klucza partycji.
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:
Pomyśl o Przedmiotu jako o rzędzie, a o Atrybucie KV o komórkach w tym rzędzie.
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.
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
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)
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.
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
Music
tabelą 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
.
@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