web-dev-qa-db-fra.com

Qu'est-ce que la clé primaire de hachage et de plage?

Je ne suis pas en mesure de comprendre quelle est la clé primaire de Range ici -

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

et comment ça marche?

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

186
Mannu

" Clé primaire de hachage et de plage " signifie qu'une seule ligne de DynamoDB possède une clé primaire unique composée du hachage et la touche plage . Par exemple, avec une clé de hachage de X et une clé de plage de Y, votre clé primaire est effectivement XY. Vous pouvez également avoir plusieurs clés de plage 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:

Clé primaire de hachage - La clé primaire est composée d'un attribut, un attribut de hachage. Par exemple, une table ProductCatalog peut avoir la clé primaire ProductID. DynamoDB génère un index de hachage non ordonné sur cet attribut de clé primaire.

Cela signifie que chaque ligne est supprimée de cette valeur. Chaque ligne de DynamoDB aura une valeur unique et requise pour cet attribut . Un index de hachage non ordonné signifie ce qui est dit - les données ne sont pas ordonnées et aucune garantie ne vous est donnée quant à la manière dont les données sont stockées. Vous ne pourrez pas effectuer de requêtes sur un index non ordonné tel que . Obtenez-moi toutes les lignes dont le ProductID est 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 le ProductID X . Vous effectuez une requête sur un index non ordonné, vous obtenez ainsi des recherches sur les valeurs-clés, sont très rapides et n'utilisez que très peu de débit.


Clé primaire de hachage et de plage - La clé primaire est composée de deux attributs. Le premier attribut est l'attribut de hachage et le deuxième attribut est l'attribut range. Par exemple, la table primaire du forum peut avoir pour nom principal ForumName et Subject, où ForumName est l'attribut de hachage et Subject, l'attribut range. DynamoDB génère un index de hachage non ordonné sur l'attribut de hachage et un index de plage trié sur l'attribut de plage.

Cela signifie que la clé primaire de chaque ligne est la combinaison de la clé de hachage et de la plage . Vous pouvez créer des accès directs sur des lignes uniques si vous disposez à la fois des clés de hachage et de plage, ou vous pouvez effectuer une requête sur l'index de plage trié . Par exemple, get Obtenez-moi toutes les lignes de la table avec la clé de hachage X dont les clés de plage sont supérieures à Y , ou les autres requêtes associées à cet effet. Elles offrent de meilleures performances et une utilisation de capacité moindre par rapport aux analyses et requêtes sur des champs non indexés. De leur documentation :

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

J'ai probablement raté certaines choses au fur et à mesure que je tapais ceci et que je ne faisais que gratter la surface. Il y a beaucoup plus aspects à prendre en compte lors de l'utilisation de tables DynamoDB (débit, cohérence, capacité, autres index, distribution de clés, etc.) . Vous devriez jeter un oeil à la page exemples de tables et de données pour des exemples.

503
mkobit

Comme tout se mélange. Premièrement, les blocs de construction sont les suivants:

  1. Table
  2. Article
  3. Attribut KV.

Pensez à Item en tant que ligne et à l'attribut KV en tant que cellules de 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) uniquement si vous avez décidé que votre PC est composée de (HashKey, SortKey).

Plus visuellement que sa complexité, telle que je la 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                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

Alors qu'est-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. Désormais, la manière dont vous composez cette clé primaire a un sens pour accéder aux données.

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

Remarque: je n'ai pas fait référence aux index secondaires.

10
Tomer Ben David

@Mkobit donne déjà une réponse bien expliquée, mais je vais ajouter une grande image de la clé de plage et de la clé de hachage.

En quelques mots range + hash key = composite primary keyCoreComponents of Dynamodbenter image description here

Une clé primaire est composée d'une clé de hachage et d'une clé de plage facultative. La clé de hachage est utilisée pour sélectionner la partition DynamoDB. Les partitions font partie des données de la table. Les clés de plage sont utilisées pour trier les éléments de la partition, s'ils existent.

Donc, les deux ont un but différent et ensemble, aident à faire une requête complexe. Dans l'exemple ci-dessus, hashkey1 can have multiple n-range. Un autre exemple de plage et de hashkey est le jeu. UserA(hashkey) peut jouer à Ngame(range).

enter image description here

La table Musique décrite dans Tableaux, Articles et Attributs est un exemple de table avec une clé primaire composite (Artist et SongTitle). Vous pouvez accéder directement à n'importe quel élément de la table Musique si vous fournissez les valeurs Artist et SongTitle pour cet élément.

Une clé primaire composite vous donne une flexibilité supplémentaire lors de l'interrogation de données. Par exemple, si vous fournissez uniquement la valeur pour Artist, DynamoDB récupère toutes les chansons de cet artiste. Pour récupérer uniquement un sous-ensemble de chansons d'un artiste particulier, vous pouvez fournir une valeur pour Artist avec une plage de valeurs pour SongTitle.

enter image description here

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

1
Adiii

@vnr vous pouvez récupérer toutes les clés de tri associées à une clé de partition en utilisant simplement la requête à l'aide d'une clé de partition. Pas besoin de scanner. Le point ici est que la clé de partition est obligatoire dans une requête. Les clés de tri sont utilisées uniquement pour obtenir une plage de données

0
Srini Sydney