¿Qué es la clave primaria de hash y rango?

Respuestas:

571

" Clave primaria de hash y rango " significa que una sola fila en DynamoDB tiene una clave primaria única compuesta por la clave hash y la clave de rango . Por ejemplo, con una clave hash de X y una clave de rango de Y , su clave principal es efectivamente XY . También puede tener varias teclas de rango para la misma clave hash, pero la combinación debe ser única, como XZ y XA . Usemos sus ejemplos para cada tipo de tabla:

Clave primaria de hash: la clave principal está compuesta de un atributo, un atributo hash. Por ejemplo, una tabla ProductCatalog puede tener ProductID como clave principal. DynamoDB crea un índice hash desordenado en este atributo de clave principal.

Esto significa que cada fila está desconectada de este valor. Cada fila en DynamoDB tendrá un valor único requerido para este atributo . El índice hash desordenado significa lo que dice: los datos no están ordenados y no se le da ninguna garantía sobre cómo se almacenan los datos. Usted no será capaz de realizar consultas en un índice desordenada como Tráeme todas las filas que tienen un mayor ProductID que X . Escribe y recupera elementos en función de la clave hash. Por ejemplo, me Obtener la fila de esa tabla que tiene ProductID X . Está realizando una consulta contra un índice desordenado, por lo que sus contrastes son básicamente búsquedas de valor clave, son muy rápidas y usan muy poco rendimiento.


Clave principal de hash y rango: la clave principal está compuesta por dos atributos. El primer atributo es el atributo hash y el segundo atributo es el atributo de rango. Por ejemplo, la tabla de subprocesos del foro puede tener ForumName y Asunto como clave principal, donde ForumName es el atributo hash y Asunto es el atributo de rango. DynamoDB crea un índice hash desordenado en el atributo hash y un índice de rango ordenado en el atributo de rango.

Esto significa que la clave principal de cada fila es la combinación de la clave hash y range . Puede obtener entradas directas en filas individuales si tiene tanto la clave hash como la clave de rango, o puede realizar una consulta contra el índice de rango ordenado . Por ejemplo, obtenga Obtenerme todas las filas de la tabla con la tecla Hash X que tengan teclas de rango mayores que Y u otras consultas a ese efecto. Tienen un mejor rendimiento y un menor uso de capacidad en comparación con los análisis y consultas en los campos que no están indexados. De su documentación :

Los resultados de la consulta siempre se ordenan por la tecla de rango. Si el tipo de datos de la clave de rango es Número, los resultados se devuelven en orden numérico; de lo contrario, los resultados se devuelven en orden de valores de código de caracteres ASCII. Por defecto, el orden de clasificación es ascendente. Para invertir el orden, establezca el parámetro ScanIndexForward en falso

Probablemente me perdí algunas cosas mientras escribía esto y solo rasqué la superficie. Hay muchos más aspectos a tener en cuenta al trabajar con tablas DynamoDB (rendimiento, consistencia, capacidad, otros índices, distribución de claves, etc.). Debe echar un vistazo a las tablas de muestra y la página de datos para ver ejemplos.

mkobit
fuente
53
Esta es una de las respuestas de desbordamiento de pila más útiles que he leído.
Tommy
77
¿Por qué no hay una opción para usar solo el rango sin hash? Por ejemplo, si todos mis datos se almacenan con su marca de tiempo como la clave principal, me gustaría poder elegir "todos los datos entre las 2 y las 4 PM el 15/10/2015"
Teofrostus
3
@Teofrostus, la clave hash se usa para identificar la partición que contiene los elementos. Sin él, DynamoDB no vería en qué partición mirar. Sin saber dónde mirar, se vence una consulta, y es el caso de uso de un escaneo (o índice secundario global, pero eso no es adecuado para su caso de uso de usar nada más que un tiempo serie para seleccionar datos).
sheldonh
1
@mkobit, ¿hay alguna forma de recuperar todas las claves de clasificación dadas por la clave de partición sin escanear?
Unknownerror
1
@VNR No estoy seguro de entender su pregunta en el contexto de DynamoDB. ¿Está diciendo que obtenga todas las teclas hash + range al proporcionar una clave hash?
mkobit
19

Como todo se está mezclando, echemos un vistazo a su función y código para simular lo que significa concisamente

La única forma de obtener una fila es a través de la clave primaria

getRow(pk: PrimaryKey): Row

La estructura de datos de la clave principal puede ser esta:

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

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

Sin embargo, puede decidir que su clave principal es clave de partición + clave de clasificación en este caso:

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

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

Entonces la conclusión:

  1. ¿Decidió que su clave principal es solo clave de partición? obtener una sola fila por clave de partición.

  2. ¿Decidió que su clave principal es clave de partición + clave de clasificación? 2.1 Obtenga una sola fila por (clave de partición, clave de clasificación) u obtenga un rango de filas por (clave de partición)

De cualquier manera, obtienes una sola fila por clave primaria, la única pregunta es si definiste que la clave primaria es solo clave de partición o clave de partición + clave de clasificación

Los bloques de construcción son:

  1. Mesa
  2. Articulo
  3. Atributo KV.

Piense en Item como una fila y en KV Attribute como celdas en esa fila.

  1. Puede obtener un elemento (una fila) por clave principal.
  2. Puede obtener varios elementos (varias filas) especificando (HashKey, RangeKeyQuery)

Puede hacer (2) solo si decidió que su PK está compuesta de (HashKey, SortKey).

Más visualmente como complejo, tal como lo veo:

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

Entonces, ¿qué está pasando arriba? Observe las siguientes observaciones. Como dijimos, nuestros datos pertenecen a (Tabla, Elemento, Atributo KVA). Entonces cada artículo tiene una clave primaria. Ahora, la forma en que compones esa clave primaria es significativa sobre cómo puedes acceder a los datos.

Si decide que su PrimaryKey es simplemente una clave hash, entonces puede obtener un solo elemento. Sin embargo, si decide que su clave principal es hashKey + SortKey, también puede hacer una consulta de rango en su clave principal porque obtendrá sus elementos mediante (HashKey + SomeRangeFunction (en la tecla de rango)). Para que pueda obtener varios elementos con su consulta de clave principal.

Nota: no me referí a índices secundarios.

Tomer Ben David
fuente
4

@Mkobit ya ha dado una respuesta bien explicada, pero agregaré una imagen general de la clave de rango y la clave hash.

En pocas palabras, range + hash key = composite primary key CoreComponents of Dynamodb ingrese la descripción de la imagen aquí

Una clave primaria consiste en una clave hash y una clave de rango opcional. La tecla hash se usa para seleccionar la partición DynamoDB. Las particiones son partes de los datos de la tabla. Las teclas de rango se utilizan para ordenar los elementos de la partición, si existen.

Entonces, ambos tienen un propósito diferente y juntos ayudan a hacer consultas complejas. En el ejemplo anterior hashkey1 can have multiple n-range.Otro ejemplo de rango y hashkey es el juego, el (hashkey)usuario A puede jugar a Ngame(range)

ingrese la descripción de la imagen aquí

La tabla de Música descrita en Tablas, Elementos y Atributos es un ejemplo de una tabla con una clave principal compuesta (Artist y SongTitle). Puede acceder a cualquier elemento de la tabla Música directamente, si proporciona los valores de Artista y Título de canción para ese elemento.

Una clave primaria compuesta le brinda flexibilidad adicional al consultar datos. Por ejemplo, si proporciona solo el valor para Artist, DynamoDB recupera todas las canciones de ese artista. Para recuperar solo un subconjunto de canciones de un artista en particular, puede proporcionar un valor para Artist junto con un rango de valores para SongTitle.

ingrese la descripción de la imagen aquí

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
fuente
En el ejemplo con la Musictabla, un artista no puede producir dos canciones con el mismo título, pero sorpresa: en los videojuegos tenemos Doom de 1993 y Doom de 2016 en.wikipedia.org/wiki/Doom_(franchise) con el mismo "artista" ( desarrollador): id Software.
Vitaly Zdanevich
0

@vnr puede recuperar todas las claves de clasificación asociadas con una clave de partición simplemente usando la consulta usando la clave de partición. No es necesario escanear. El punto aquí es que la clave de partición es obligatoria en una consulta. La clave de clasificación se usa solo para obtener un rango de datos

Srini Sydney
fuente