¿Qué es la clave principal de hash y rango?
No puedo entender qué rango/clave principal hay aquí en los documentos sobre cómo trabajar con tablas y datos en DynamoDB.
¿Como funciona?
¿Qué quieren decir con "índice hash desordenado en el atributo hash y un índice de rango ordenado en el atributo de rango"?
" Clave primaria de hash y rango " significa que una sola fila en DynamoDB tiene una clave primaria única compuesta tanto por la clave hash como por la 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 puedes tener varias claves 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 principal hash: la clave principal está formada por 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 se elimina de este valor. Cada fila en DynamoDB tendrá un valor único y obligatorio para este atributo . El índice hash desordenado significa lo que dice: los datos no están ordenados y no se le ofrece ninguna garantía sobre cómo se almacenan los datos. No podrá realizar consultas en un índice desordenado como Obtenerme todas las filas que tengan un ProductID mayor que X . Escribe y recupera elementos según la clave hash. Por ejemplo, consígueme la fila de esa tabla que tiene ProductID X. Está realizando una consulta en un índice desordenado, por lo que sus resultados son básicamente búsquedas de valores clave, son muy rápidos y utilizan muy poco rendimiento.
Clave principal de hash y rango: la clave principal está formada por dos atributos. El primer atributo es el atributo hash y el segundo atributo es el atributo de rango. Por ejemplo, la tabla Hilo del foro puede tener Nombre del foro y Asunto como clave principal, donde Nombre del foro 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 de rango . Puede realizar obtención directa en filas individuales si tiene tanto la clave hash como la de rango, o puede realizar una consulta contra el índice de rango ordenado . Por ejemplo, obtenga Get me todas las filas de la tabla con la clave Hash X que tengan claves de rango mayores que Y u otras consultas en ese sentido. Tienen un mejor rendimiento y un menor uso de capacidad en comparación con los escaneos y las consultas en campos que no están indexados. De su documentación :
Los resultados de la consulta siempre se ordenan por clave 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. De forma predeterminada, 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 de DynamoDB (rendimiento, coherencia, capacidad, otros índices, distribución de claves, etc.). Debería echar un vistazo a las tablas de muestra y a la página de datos para ver ejemplos.
@mkobit ya proporciona una respuesta bien explicada, pero agregaré una imagen grande de la clave de rango y la clave hash.
En pocas palabras range + hash key = composite primary key
CoreComponents de Dynamodb
Una clave principal consta de una clave hash y una clave de rango opcional. La clave hash se utiliza para seleccionar la partición de DynamoDB. Las particiones son partes de los datos de la tabla. Las claves 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 realizar consultas complejas. En el ejemplo anterior, hashkey1 can have multiple n-range.
otro ejemplo de rango y clave hash es el juego, el usuario A (hashkey)
puede jugar Ngame.(range)
La tabla Música descrita en Tablas, elementos y atributos es un ejemplo de una tabla con una clave principal compuesta (Artista y Título de la canción). Puede acceder a cualquier elemento de la tabla Música directamente, si proporciona los valores de Artista y Título de la canción para ese elemento.
Una clave primaria compuesta le brinda flexibilidad adicional al consultar datos. Por ejemplo, si proporciona solo el valor de Artista, 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 Artista 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 -y-amazon-rds https://ceyhunozgun.blogspot.com/2017/04/implementing-object-persistence-with-dynamodb.html
Como todo se está mezclando, veamos su función y código para simular lo que significa de manera coherente.
La única forma de obtener una fila es mediante la clave principal.
getRow(pk: PrimaryKey): Row
La estructura de datos de clave primaria 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, puedes decidir que tu 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:
¿Decidiste que tu clave principal es solo la clave de partición? obtener una sola fila por clave de partición.
¿Decidiste que tu clave principal es clave de partición + clave de clasificación? 2.1 Obtener una sola fila por (clave de partición, clave de clasificación) u obtener un rango de filas por (clave de partición)
De cualquier manera, obtienes una sola fila por clave principal. La única pregunta es si definiste esa clave principal como clave de partición únicamente o clave de partición + clave de clasificación.
Los bloques de construcción son:
- Mesa
- Artículo
- Atributo KV.
Piense en el elemento como una fila y en el atributo KV como celdas de esa fila.
- Puede obtener un elemento (una fila) mediante clave principal.
- Puede obtener varios elementos (varias filas) especificando (HashKey, RangeKeyQuery)
Puede hacer (2) solo si decidió que su PK se compone de (HashKey, SortKey).
Más visualmente porque es complejo, tal como yo 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? Note las siguientes observaciones. Como dijimos, nuestros datos pertenecen a (Tabla, Artículo, Atributo KVA). Entonces cada elemento tiene una clave principal. Ahora bien, la forma en que compone esa clave principal influye en cómo puede acceder a los datos.
Si decide que su clave primaria es simplemente una clave hash, entonces es fantástico que pueda obtener un solo elemento de ella. Sin embargo, si decide que su clave principal es hashKey + SortKey, también puede realizar una consulta de rango en su clave principal porque obtendrá sus elementos mediante (HashKey + SomeRangeFunction (en la clave de rango)). De modo que puede obtener varios elementos con su consulta de clave principal.
Nota: no me referí a índices secundarios.