web-dev-qa-db-ja.com

ハッシュと範囲の主キーとは何ですか?

Rangeの主キーがここにあるのか理解できません -

http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key

そしてそれはどのように動作しますか?

「ハッシュ属性の順序付けされていないハッシュインデックスと範囲属性のソートされた範囲インデックス」とはどういう意味ですか?

176
Mannu

"ハッシュと範囲の主キー)は、DynamoDBの単一行にハッシュ範囲の両方のキーで構成される一意の主キーがあることを意味します。 XのハッシュキーおよびYの範囲キー。主キーは事実上XYです。同じハッシュキーに対して複数の範囲キーを組み合わせることもできますが、組み合わせはXZXAのように)一意である必要があります。テーブルの種類ごとに例を使用しましょう。

ハッシュ主キー - 主キーは1つの属性、ハッシュ属性で構成されています。たとえば、ProductCatalogテーブルは、ProductIDを主キーとして持つことができます。 DynamoDBは、この主キー属性に基づいて番号なしハッシュインデックスを作成します。

これは、すべての行がこの値からキーオフされていることを意味します。 DynamoDBの各行には、この属性に必要な一意の値があります順序付けられていないハッシュインデックスとは、データが順序付けられていないこと、およびデータの格納方法に対する保証がないことを意味します。 順序付けされていないインデックスに対してクエリを実行することはできませんXより大きいProductIDを持つすべての行を取得します。ハッシュキーに基づいてアイテムを作成および取得します。たとえば、 、ProductID Xを持つテーブルから行を取得します。順序付けされていないインデックスに対してクエリを実行しているので、取得されるのは基本的にキー値ルックアップであり、非常に高速です。


ハッシュと範囲の主キー - 主キーは2つの属性で構成されています。最初の属性はハッシュ属性で、2番目の属性は範囲属性です。たとえば、フォーラムのThreadテーブルでは、ForumNameとSubjectを主キーとして使用できます。ここで、ForumNameはハッシュ属性、Subjectは範囲属性です。 DynamoDBは、ハッシュ属性に順序付けられていないハッシュインデックスを作成し、範囲属性にソートされた範囲インデックスを作成します。

つまり、すべての行の主キーはハッシュキーと範囲キーの組み合わせです。ハッシュキーと範囲キーの両方がある場合は単一行で直接取得することも、ソート範囲インデックスに対してクエリを実行することもできます。たとえば、get ハッシュキーXがYよりも大きい範囲キーを持つすべての行、またはそれに影響する他のクエリをテーブルから取得します。から 彼らのドキュメント

クエリ結果は常に範囲キーによってソートされます。範囲キーのデータ型がNumberの場合、結果は数値順に返されます。それ以外の場合、結果はASCII文字コード値の順序で返されます。デフォルトでは、ソート順は昇順です。順序を逆にするには、ScanIndexForwardパラメータをfalseに設定します。

私はこれをタイプしたので私はおそらくいくつかのことを見逃していた、そして私は表面を引っ掻いただけだった。 たくさんもっと DynamoDBテーブルを扱うときに考慮すべき点 (スループット、一貫性、容量、他のインデックス、キー配布など)があります。 サンプル表とデータ 例のページ。

480
mkobit

全体が混乱しているように。まずビルディングブロックは:

  1. 項目
  2. KV属性.

Itemを行として、KV Attributeをその行のセルとして考えます。

  1. 主キーで項目(行)を取得できます。
  2. (HashKey、RangeKeyQuery)を指定すると、複数の項目(複数の行)を取得できます。

あなたのPKが(HashKey、SortKey)で構成されていると決心した場合にのみ、(2)を行うことができます。

もっと複雑に見えるように、私がそれを見る方法:

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

だから何が起こっているのですか。次のことに注意してください。私達が言ったように私達のデータは(Table、Item、KVAttribute)に属しています。そして、すべてのItemは主キーを持ちます。その主キーを作成する方法は、データにアクセスする方法に意味があります。

あなたのPrimaryKeyが単にハッシュキーであるとあなたが決めるならば、すばらしいあなたはそれから単一のアイテムを取り出すことができます。ただし、主キーをhashKey + SortKeyと決めた場合は、(HashKey + SomeRangeFunction(on range key))でアイテムを取得するため、主キーで範囲クエリを実行することもできます。そのため、主キークエリで複数の項目を取得できます。

注:副次索引については言及しませんでした。

9
Tomer Ben David

十分に説明された答えはすでに@mkobitによって与えられていますが、範囲キーとハッシュキーの全体像を追加します。

簡単な言葉でrange + hash key = composite primary keyDynmodbのコアコンポーネントenter image description here

主キーは、ハッシュキーとオプションの範囲キーで構成されます。ハッシュキーは、DynamoDBパーティションを選択するために使用されます。パーティションはテーブルデータの一部です。範囲キーは、パーティション内のアイテムが存在する場合、それらをソートするために使用されます。

そのため、両方に異なる目的があり、一緒に複雑なクエリを実行するのに役立ちます。上記の例でhashkey1 can have multiple n-range.範囲とハッシュキーの別の例はゲームです。userA(hashkey)はNgame(range)を再生できます

enter image description here

テーブル、アイテム、および属性で説明されている音楽テーブルは、複合主キー(アーティストおよびソングタイトル)を持つテーブルの例です。その項目にArtistおよびSongTitleの値を指定すると、Musicテーブルの任意の項目に直接アクセスできます。

複合主キーを使用すると、データをクエリする際の柔軟性が高まります。たとえば、アーティストの値のみを指定した場合、DynamoDBはそのアーティストのすべての曲を取得します。特定のアーティストによる曲のサブセットのみを取得するには、SongTitleの値の範囲とともにArtistの値を指定できます。

enter image description here

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

1
Adiii

@vnr partion keyを使ったクエリを使うだけでパーティションキーに関連するすべてのソートキーを取得できます。スキャンする必要はありません。ここで重要なのは、パーティションキーがクエリに必須であるということです。ソートキーはデータの範囲を取得するためにのみ使用されます

0
Srini Sydney