Qu'est-ce que la clé primaire Hash et Range?

Je ne suis pas capable de comprendre quelle plage de clé primaire est ici -

Http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key

Et comment ça marche?

Que signifient-ils par "index de hachage non ordonné sur l'attribut de hachage et un index de plage trié sur l'attribut de plage"?

149
demandé sur coffee-grinder 2014-12-06 10:35:57

3 réponses

"de Hachage et de la Gamme de Clé Primaire" signifie qu'une seule ligne dans DynamoDB a une clé primaire unique composée à la fois de la hash et le range clé. Par exemple avec une clé de hachage de X et la portée de la clé de Y, votre clé primaire est effectivement XY. Vous pouvez également avoir plusieurs gamme de clés pour la même clé de hachage, mais la combinaison doit être unique, comme XZ et XA. Utilisons leurs exemples pour chaque type de table:

Hachage Clé primaire - la clé primaire est constituée d'un attribut, un hachage attribut. Par exemple, une table ProductCatalog peut avoir ProductID comme sa clé primaire. DynamoDB construit un index de hachage non ordonné sur ceci attribut de clé primaire.

Cela signifie que chaque ligne est désactivée de cette valeur. chaque ligne de DynamoDB aura une valeur unique requise pour cet attribut . L'index de hachage non ordonné signifie ce qui est dit - les données ne sont pas ordonnées et vous n'avez aucune garantie sur la façon dont les données sont stockées. vous ne pourrez pas faire de requêtes sur un index non ordonné tel que Obtenez-moi toutes les lignes qui ont un ProductID supérieur à X. Vous écrivez et récupérez des éléments en fonction de la clé de hachage. Par exemple, Obtenez-moi la ligne de cette table qui a ProductID X. Vous faites une requête contre un index non ordonné, donc vos résultats sont essentiellement des recherches clé-valeur, sont très rapides et utilisent très peu de débit.


Clé primaire de hachage et de Plage-Le la clé primaire est faite de deux attribut. Le premier attribut est l'attribut de hachage et la deuxième attribut est l'attribut range. Par exemple, la table de discussion du forum peut avoir ForumName et Subject comme clé primaire, où ForumName est l'attribut et le sujet de hachage sont l'attribut range. DynamoDB construit un index de hachage non ordonné sur l'attribut de hachage et un index de plage trié sur la plage de l'attribut.

Cela signifie que la clé primaire de chaque ligne est la combinaison de la clé de hachage et de plage . Vous pouvez faire des gets directs sur des lignes simples si vous avez à la fois le hachage et la clé de plage, ou vous pouvez faire une requête contre l'index de plage trié . Par exemple, get me récupère toutes les lignes de la table avec la clé de hachage X qui ont des clés de plage supérieures à Y, ou d'autres requêtes à cet effet. Ils ont de meilleures performances et moins d'utilisation de la capacité par rapport aux analyses et aux requêtes sur les champs qui ne sont pas indexés. À partir de leur documentation:

Les résultats de la requête sont toujours triés par la clé de plage. Si le type de données de la clé de plage est Number, les résultats sont retournés dans l'ordre numérique; sinon, les résultats sont retournés dans l'ordre du code de caractère ASCII valeur. Par défaut, l'ordre de tri est croissant. Pour inverser la commande, définissez le paramètre ScanIndexForward sur false

J'ai probablement manqué certaines choses en tapant ceci et je n'ai fait que gratter la surface. Il y a beaucoup de choses plus aspects à prendre en prise en compte lors de l'utilisation de tables DynamoDB (débit, cohérence, capacité, autres indices, distribution de clés, etc.). Vous devriez jeter un oeil à la page exemples de tables et de données pour des exemples.

391
répondu mkobit 2016-12-29 17:16:03

Comme tout se mélange. D'abord les blocs de construction sont:

  1. Tableau
  2. Article
  3. attribut KV.

Pensez à L'élément comme une ligne et à L'attribut KV comme des cellules dans cette ligne.

  1. Vous pouvez obtenir un élément (une ligne) par clé primaire.
  2. Vous pouvez obtenir plusieurs éléments (plusieurs lignes) en spécifiant (HashKey, RangeKeyQuery)

Vous pouvez faire (2) seulement si vous avez décidé que votre PK est composé de (HashKey, SortKey).

Plus visuellement comme son complexe, la façon dont je le vois:

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

Donc, ce qui se passe ci-dessus. Notez les observations suivantes. Comme nous l'avons dit, nos données appartiennent à (Table, Item, KVAttribute). Ensuite, chaque élément a une clé primaire. Maintenant, la façon dont vous composez cette clé primaire est significative dans la façon dont vous pouvez accéder aux données.

Si vous décidez que votre PrimaryKey est simplement une clé de hachage, alors vous pouvez en obtenir un seul élément. Si vous décidez cependant que votre clé primaire est hashKey + SortKey, vous pouvez également faire une requête de plage sur votre clé primaire car vous obtiendrez vos éléments par (HashKey + SomeRangeFunction (sur la clé de plage)). Ainsi, vous pouvez obtenir plusieurs éléments avec votre requête de clé primaire.

Note: Je ne me suis pas référé aux index secondaires.

2
répondu Tomer Ben David 2018-09-10 09:10:04

@vnr vous pouvez récupérer toutes les clés de tri associées à une clé de partition en utilisant simplement la requête en utilisant la clé partion. Pas besoin de scan. Le point ici est que la clé de partition est obligatoire dans une requête . La clé de tri est utilisée uniquement pour obtenir la plage de données

0
répondu Srini Sydney 2017-05-04 07:17:57