Apa itu Kunci Utama Hash dan Range?

Jawaban:

571

" Hash dan Range Primary Key " berarti bahwa satu baris dalam DynamoDB memiliki kunci primer unik yang terdiri dari hash dan kunci range . Misalnya dengan kunci hash X dan kunci rentang Y , kunci utama Anda secara efektif XY . Anda juga dapat memiliki beberapa tombol rentang untuk kunci hash yang sama tetapi kombinasinya harus unik, seperti XZ dan XA . Mari kita gunakan contoh mereka untuk setiap jenis tabel:

Kunci Utama Hash - Kunci utama terbuat dari satu atribut, atribut hash. Misalnya, tabel ProductCatalog dapat memiliki ProductID sebagai kunci utamanya. DynamoDB membangun indeks hash yang tidak teratur pada atribut primary key ini.

Ini berarti bahwa setiap baris tidak memiliki nilai ini. Setiap baris dalam DynamoDB akan memiliki nilai unik yang diperlukan untuk atribut ini . Indeks hash yang tidak berurutan berarti apa yang dikatakan - data tidak dipesan dan Anda tidak diberi jaminan apa pun tentang bagaimana data disimpan. Anda tidak akan dapat membuat query pada indeks unordered seperti Dapatkan saya semua baris yang memiliki lebih ProductID dari X . Anda menulis dan mengambil item berdasarkan kunci hash. Misalnya, Dapatkan saya baris dari yang tabel yang memiliki ProductID X . Anda membuat kueri terhadap indeks tidak berurutan sehingga Anda menentangnya pada dasarnya adalah pencarian nilai kunci, sangat cepat, dan menggunakan sangat sedikit throughput.


Kunci Utama Hash dan Rentang - Kunci utama terbuat dari dua atribut. Atribut pertama adalah atribut hash dan atribut kedua adalah atribut rentang. Misalnya, tabel Thread forum dapat memiliki ForumName dan Subjek sebagai kunci utamanya, di mana ForumName adalah atribut hash dan Subjek adalah atribut range. DynamoDB membangun indeks hash yang tidak berurutan pada atribut hash dan indeks rentang yang diurutkan pada atribut rentang.

Ini berarti bahwa kunci utama setiap baris adalah kombinasi dari hash dan kunci rentang . Anda bisa membuat langsung mendapat di baris tunggal jika Anda memiliki kunci hash dan rentang, atau Anda dapat membuat kueri terhadap indeks rentang yang diurutkan . Misalnya, dapatkan Dapatkan saya semua baris dari tabel dengan kunci H X yang memiliki tombol rentang lebih besar dari Y , atau kueri lain yang memengaruhi itu. Mereka memiliki kinerja yang lebih baik dan penggunaan kapasitas yang lebih sedikit dibandingkan dengan Pemindaian dan Permintaan terhadap bidang yang tidak diindeks. Dari dokumentasi mereka :

Hasil kueri selalu diurutkan berdasarkan tombol rentang. Jika tipe data dari tombol rentang adalah Angka, hasilnya dikembalikan dalam urutan numerik; jika tidak, hasilnya dikembalikan dalam urutan nilai kode karakter ASCII. Secara default, urutan pengurutan naik. Untuk membalikkan urutan, atur parameter ScanIndexForward ke false

Saya mungkin melewatkan beberapa hal saat saya mengetik ini dan saya hanya menggaruk permukaan. Ada banyak lebih aspek untuk mempertimbangkan ketika bekerja dengan DynamoDB tabel (throughput, konsistensi, kapasitas, indeks lainnya, distribusi kunci, dll). Anda harus melihat contoh tabel dan halaman data untuk contoh.

mkobit
sumber
53
ini adalah salah satu jawaban stack overflow paling berguna yang pernah saya baca.
Tommy
7
Mengapa tidak ada opsi untuk hanya menggunakan rentang tanpa hash? Misalnya, jika semua data saya disimpan dengan stempel waktu sebagai kunci utama, saya ingin dapat memilih "semua data antara pukul 2 dan 4 sore pada 10/15/2015"
Teofrostus
3
@ Teofrostus, kunci hash digunakan untuk mengidentifikasi partisi yang berisi item. Tanpa itu, DynamoDB tidak akan melihat partisi mana. Tidak tahu di mana harus mencari mengalahkan Kueri, dan merupakan kasus penggunaan untuk Pemindaian (atau Global Secondary Index, tapi itu tidak cocok untuk kasus penggunaan Anda menggunakan apa-apa selain waktu) seri untuk memilih data).
sheldonh
1
@ mkobit apakah ada cara saya dapat mengambil semua kunci sortir yang diberikan kunci partisi tanpa melakukan pemindaian?
unknownerror
1
@ VNR Saya tidak yakin saya mengerti pertanyaan Anda dalam konteks DynamoDB. Apakah Anda mengatakan mendapatkan semua kunci hash + range saat memberikan kunci hash?
mkobit
19

Ketika semuanya bercampur, mari kita lihat fungsi dan kode untuk mensimulasikan apa artinya secara konsisten

Satu- satunya cara untuk mendapatkan baris adalah melalui kunci primer

getRow(pk: PrimaryKey): Row

Struktur data kunci utama dapat berupa ini:

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

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

Namun Anda dapat memutuskan kunci utama Anda adalah kunci partisi + kunci sortir dalam kasus ini:

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

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

Jadi intinya:

  1. Memutuskan bahwa kunci utama Anda hanya kunci partisi? dapatkan satu baris dengan kunci partisi.

  2. Memutuskan bahwa kunci utama Anda adalah kunci partisi + kunci sortir? 2.1 Dapatkan baris tunggal dengan (kunci partisi, kunci sortir) atau dapatkan rentang baris dengan (kunci partisi)

Dengan cara apa pun Anda mendapatkan satu baris dengan kunci primer satu-satunya pertanyaan adalah apakah Anda menetapkan kunci primer hanya untuk kunci partisi atau kunci partisi + tombol sortir

Blok bangunan adalah:

  1. Meja
  2. Barang
  3. Atribut KV.

Pikirkan Item sebagai baris dan atribut KV sebagai sel di baris itu.

  1. Anda bisa mendapatkan item (baris) dengan kunci utama.
  2. Anda bisa mendapatkan banyak item (beberapa baris) dengan menentukan (HashKey, RangeKeyQuery)

Anda dapat melakukan (2) hanya jika Anda memutuskan bahwa PK Anda terdiri dari (HashKey, SortKey).

Lebih visual sebagai kompleksnya, cara saya melihatnya:

+----------------------------------------------------------------------------------+
|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                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

Jadi apa yang terjadi di atas. Perhatikan pengamatan berikut. Seperti yang kami katakan, data kami adalah milik (Tabel, Item, KVAttribute). Kemudian Setiap Item memiliki kunci utama. Sekarang cara Anda menyusun kunci utama bermakna dalam cara Anda dapat mengakses data.

Jika Anda memutuskan bahwa PrimaryKey Anda hanyalah kunci hash maka hebat Anda bisa mendapatkan satu item dari itu. Namun jika Anda memutuskan bahwa kunci utama Anda adalah hashKey + SortKey maka Anda juga bisa melakukan kueri rentang pada kunci utama Anda karena Anda akan mendapatkan item Anda dengan (HashKey + SomeRangeFunction (pada tombol rentang)). Jadi Anda bisa mendapatkan banyak item dengan kueri kunci utama Anda.

Catatan: Saya tidak merujuk ke indeks sekunder.

Tomer Ben David
sumber
4

Jawaban yang sudah dijelaskan dengan baik sudah diberikan oleh @mkobit, tapi saya akan menambahkan gambar besar dari tombol rentang dan kunci hash.

Dengan kata sederhana range + hash key = composite primary key CoreComponents of Dynamodb masukkan deskripsi gambar di sini

Kunci utama terdiri dari kunci hash dan kunci rentang opsional. Kunci hash digunakan untuk memilih partisi DynamoDB. Partisi adalah bagian dari data tabel. Tombol rentang digunakan untuk mengurutkan item di partisi, jika ada.

Jadi keduanya memiliki tujuan yang berbeda dan bersama-sama membantu melakukan kueri yang kompleks. Pada contoh di atas Contoh hashkey1 can have multiple n-range.lain dari range dan hashkey adalah game, userA (hashkey)dapat memainkan Ngame(range)

masukkan deskripsi gambar di sini

Tabel Musik yang dijelaskan dalam Tabel, Item, dan Atribut adalah contoh tabel dengan kunci primer gabungan (Artis dan SongTitle). Anda dapat mengakses item apa saja di tabel Musik secara langsung, jika Anda memberikan nilai Artis dan SongTitle untuk item itu.

Kunci primer komposit memberi Anda fleksibilitas tambahan saat meminta data. Misalnya, jika Anda hanya memberikan nilai untuk Artis, DynamoDB mengambil semua lagu oleh artis itu. Untuk hanya mengambil subset lagu dari artis tertentu, Anda dapat memberikan nilai untuk Artis bersama dengan sejumlah nilai untuk SongTitle.

masukkan deskripsi gambar di sini

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

Adiii
sumber
Dalam contoh dengan Musictabel, seorang artis tidak dapat menghasilkan dua lagu dengan judul yang sama, tetapi mengejutkan - dalam permainan video kami memiliki Doom dari tahun 1993 dan Doom dari 2016 en.wikipedia.org/wiki/Doom_(franchise) dengan "artis" yang sama ( pengembang): id Software.
Vitaly Zdanevich
0

@ vnr Anda dapat mengambil semua kunci sortir yang terkait dengan kunci partisi dengan hanya menggunakan kueri menggunakan kunci partion. Tidak perlu dipindai. Intinya di sini adalah kunci partisi wajib dalam kueri. Sortir kunci hanya digunakan untuk mendapatkan rentang data

Srini Sydney
sumber