Karma ve Aralık Birincil Anahtarı nedir?


Yanıtlar:


571

" Karma ve Aralık Birincil Anahtarı ", DynamoDB'deki tek bir satırın hem karma hem de aralık anahtarından oluşan benzersiz bir birincil anahtara sahip olduğu anlamına gelir . Örneğin, X'in karma tuşu ve Y'nin aralık tuşu ile birincil anahtarınız etkili bir şekilde XY'dir . Aynı karma anahtar için birden fazla aralık anahtarınız da olabilir, ancak kombinasyonun XZ ve XA gibi benzersiz olması gerekir . Her bir tablo türü için örneklerini kullanalım:

Hash Birincil Anahtarı - Birincil anahtar, bir öznitelik, bir hash özniteliğinden oluşur. Örneğin, bir ProductCatalog tablosu birincil anahtarı olarak ProductID değerine sahip olabilir. DynamoDB, bu birincil anahtar özniteliğinde sırasız bir karma dizini oluşturur.

Bu, her satırın bu değerden çıkarıldığı anlamına gelir. DynamoDB'deki her satırın bu özellik için gerekli ve benzersiz bir değeri olacaktır . Sırasız karma indeksi, ne söylendiği anlamına gelir - veriler sipariş edilmez ve verilerin nasıl saklandığına dair size herhangi bir garanti verilmez. X ürününden büyük bir ProductID değeri olan tüm satırları al gibi sıralanmamış bir dizinde sorgu yapamazsınız . Karma anahtarını temel alarak öğeleri yazar ve alırsınız. Örneğin, bana bu tablodan ProductID X olan satırı getir . Düzensiz bir dizine karşı bir sorgu yapıyorsunuz, böylece ona karşı elde ettiğiniz temelde anahtar / değer aramaları, çok hızlı ve çok az verim kullanıyorsunuz.


Karma ve Aralık Birincil Anahtarı - Birincil anahtar iki öznitelikten oluşur. İlk özellik hash özelliğidir ve ikinci özellik range özelliğidir. Örneğin, forum İş Parçacığı tablosu birincil anahtar olarak ForumName ve Subject olabilir; burada ForumName hash özniteliğidir ve Subject range aralığıdır. DynamoDB, hash özniteliğinde sırasız bir karma indeksi ve range özniteliğinde sıralanmış bir aralık dizini oluşturur.

Bu, her satırın birincil anahtarının sağlama ve aralık tuşunun birleşimi olduğu anlamına gelir . Hem karma hem de aralık anahtarınız varsa tek satırlara doğrudan girebilir veya sıralanan aralık dizinine karşı bir sorgu yapabilirsiniz . Örneğin, Y'den büyük aralık anahtarlarına sahip Hash anahtarı X veya bu soruna etki eden diğer sorguları içeren tablodaki tüm satırları al . Dizine eklenmemiş alanlara karşı Taramalar ve Sorgular ile karşılaştırıldığında daha iyi performans ve daha az kapasite kullanımına sahiptir. Gönderen onların belgelerine :

Sorgu sonuçları her zaman aralık tuşuna göre sıralanır. Aralık tuşunun veri türü Sayı ise, sonuçlar sayısal sırada döndürülür; aksi takdirde sonuçlar ASCII karakter kodu değerlerine göre döndürülür. Varsayılan olarak, sıralama düzeni artar. Sırayı tersine çevirmek için ScanIndexForward parametresini false olarak ayarlayın

Bunu yazarken bazı şeyleri kaçırdım ve sadece yüzeyi çizdim. Orada çok daha DynamoDB tablolarla çalışırken dikkate almak yönleri (throughput, tutarlılık, kapasite, diğer endekslere, anahtar dağıtım, vb.) Örnekler için örnek tablolara ve veri sayfasına bir göz atmalısınız .


53
Bu şimdiye kadar okudum en yararlı yığın taşma cevaplarından biridir.
Tommy

7
Neden yalnızca karma olmayan aralığı kullanma seçeneği yoktur? Örneğin, tüm verilerim zaman damgasıyla birincil anahtar olarak depolanırsa, "
15/15/2015 tarihinde

3
@Teofrostus, hash tuşu, öğeleri içeren bölümü tanımlamak için kullanılır. Onsuz, DynamoDB hangi bölüme bakacağınızı bilmez. Nereye bakacağınızı bilmemek bir Sorguyu yener ve Tarama (veya Global İkincil Dizin için kullanım durumudur, ancak bu, bir zamandan başka bir şey kullanmamanız için uygun değildir. veri seçmek için seri).
sheldonh

1
@mkobit, tarama yapmadan bölüm anahtarı verilen tüm sıralama anahtarlarını alabilmemin herhangi bir yolu var mı?
unknownerror

1
@VNR Sorunuzu DynamoDB bağlamında anladığımdan emin değilim. Bir karma anahtarı sağlarken tüm karma + aralık tuşlarını al diyor musunuz?
mkobit

19

Her şey karıştıkça, ne anlama geldiğini simüle etmek için işlevine ve koduna bakalım

Sadece bir satır almanın yolu birincil anahtar yoluyladır

getRow(pk: PrimaryKey): Row

Birincil anahtar veri yapısı şu olabilir:

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

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

Ancak bu durumda birincil anahtarınızın bölüm anahtarı + sıralama anahtarı olduğuna karar verebilirsiniz:

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

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

Sonuçta:

  1. Birincil anahtarınızın yalnızca bölüm anahtarı olduğuna mı karar verdiniz? bölüm anahtarı ile tek satır almak.

  2. Birincil anahtarınızın bölüm anahtarı + sıralama anahtarı olduğuna mı karar verdiniz? 2.1 Tek satır (bölüm tuşu, sıralama tuşu) veya satır aralığı (bölüm tuşu) ile alın

Her iki şekilde de birincil anahtarla tek bir satır alırsınız, tek soru, birincil anahtarın yalnızca bölüm anahtarı veya bölüm anahtarı + sıralama anahtarı olarak tanımlanmasıdır.

Yapı taşları:

  1. tablo
  2. madde
  3. KV Özelliği.

Öğeyi bir satır ve KV Özelliğini o satırdaki hücreler olarak düşünün.

  1. Birincil anahtarı kullanarak bir öğeyi (satır) alabilirsiniz.
  2. (HashKey, RangeKeyQuery) belirterek birden çok öğe (birden çok satır) alabilirsiniz

(2) 'yi ancak PK'nizin (HashKey, SortKey)' den oluştuğuna karar verdiyseniz yapabilirsiniz.

Karmaşık olarak daha görsel olarak, onu gördüğüm şekilde:

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

Peki yukarıda neler oluyor. Aşağıdaki gözlemlere dikkat edin. Dediğimiz gibi verilerimiz (Tablo, Eşya, KVAttribute) 'a aittir. Sonra her öğenin birincil anahtarı vardır. Artık birincil anahtarı oluşturma şekliniz verilere nasıl erişebileceğiniz konusunda anlamlıdır.

PrimaryKey'nizin bir karma anahtarı olduğuna karar verirseniz, o zaman harika bir şey elde edebilirsiniz. Ancak birincil anahtarınızın hashKey + SortKey olduğuna karar verirseniz, öğelerinizi (HashKey + SomeRangeFunction (aralık anahtarı)) ile alacağınız için birincil anahtarınızda bir aralık sorgusu da yapabilirsiniz. Böylece birincil anahtar sorgunuzla birden fazla öğe alabilirsiniz.

Not: İkincil dizinlere değinmedim.


4

İyi açıklanmış bir cevap zaten mkobit tarafından verilmiştir, ancak aralık anahtarının ve karma anahtarının büyük bir resmini ekleyeceğim.

Basit bir deyişle range + hash key = composite primary key Dynamodb'un CoreComponents resim açıklamasını buraya girin

Birincil anahtar bir karma anahtar ve isteğe bağlı bir aralık anahtarından oluşur. Hash anahtarı DynamoDB bölümünü seçmek için kullanılır. Bölümler, tablo verilerinin bir parçasıdır. Aralık tuşları, bölümdeki öğeleri varsa sıralamak için kullanılır.

Yani her ikisinin de farklı bir amacı var ve birlikte karmaşık sorgulama yapmaya yardımcı oluyorlar. Yukarıdaki örnekte hashkey1 can have multiple n-range.Range ve hashkey'in başka bir örneği oyun, userA Ngame (hashkey)oynayabilir(range)

resim açıklamasını buraya girin

Tablolar, Öğeler ve Nitelikler'de açıklanan Müzik tablosu, bileşik birincil anahtarlı (Artist ve SongTitle) bir tablo örneğidir. Bu öğe için Sanatçı ve SongTitle değerlerini verirseniz, Müzik tablosundaki herhangi bir öğeye doğrudan erişebilirsiniz.

Bileşik birincil anahtar, verileri sorgularken size ek esneklik sağlar. Örneğin, yalnızca Sanatçı için değer sağlarsanız, DynamoDB bu sanatçının tüm şarkılarını alır. Belirli bir sanatçının yalnızca bir şarkı alt kümesini almak için, SongTitle için bir dizi değerle birlikte Sanatçı için bir değer sağlayabilirsiniz.

resim açıklamasını buraya girin

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


MusicTablodaki örnekte, bir sanatçı aynı başlığa sahip iki şarkı üretemez, ancak sürpriz olur - video oyunlarında 1993'ten Doom ve 2016'dan Doom ve en.wikipedia.org/wiki/Doom_(franchise) aynı "sanatçı" ( geliştirici): id Software.
Vitaly Zdanevich

0

@vnr, bölüm anahtarıyla ilişkili sorguyu kullanarak bir bölüm anahtarıyla ilişkili tüm sıralama anahtarlarını alabilirsiniz. Tarama gerektirmez. Buradaki nokta, bir sorguda bölüm anahtarının zorunlu olmasıdır. Sıralama tuşu yalnızca veri aralığını almak için kullanılır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.