read dynamodb consistent hash amazon-dynamodb primary-key database nosql

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



consistent read dynamodb (4)

" 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. No podrá realizar consultas en un índice desordenado , como Obtenerme todas las filas que tienen un ProductID mayor que X. Escribe y recupera elementos según la clave hash. Por ejemplo, Consígame 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 valores 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 Subject como su clave principal, donde ForumName es el atributo hash y Subject 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 de hash y rango . 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 tienen 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 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.

No puedo entender qué clave principal de rango está aquí:

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

¿Y, cómo funciona?

¿Qué quieren decir con "índice hash desordenado en el atributo hash y un índice de rango ordenado en el atributo de rango"?


@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

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) puede jugar Ngame (range)

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.

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


@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


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 esa clave primaria como 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 artículo (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, KVAttribute). Entonces cada artículo tiene una clave primaria. Ahora, la forma en que compones esa clave primaria es significativa en 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.