Investigamos por distintos sitios para así darte la solución a tu dilema, si tienes alguna inquietud puedes dejarnos la inquietud y responderemos sin falta.
Solución:
“Hash y clave primaria de rango“significa que una sola fila en DynamoDB tiene un primario único key compuesto tanto por el picadillo y el distancia key. Por ejemplo con un hash key de X y rango key de Y, tu principal key es efectivamente XY. También puede tener rango múltiple keys por el mismo hash key pero la combinación debe ser única, como XZ y XA. Usemos sus ejemplos para cada tipo de tabla:
Hash Primary Key: la principal key está hecho de uno attribute, un hash
attribute. Por ejemplo, una tabla ProductCatalog puede tener ProductID como su principal key. DynamoDB crea un índice hash desordenado en este primario key attribute.
Esto significa que todas las filas se eliminan de este valor. Cada fila en DynamoDB tendrá un valor único requerido para este attribute. 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 tal como Consígueme todas las filas que tengan un ProductID mayor que X. Escribes y recuperas elementos basados en el hash key. Por ejemplo, Consígueme la fila de esa tabla que tiene ProductID X. Está haciendo una consulta contra un índice desordenado, por lo que se opone básicamente a keyLas búsquedas de valores son muy rápidas y utilizan muy poco rendimiento.
Hash y clave principal de rango: la principal key está hecho de dos
attributes. El primero attribute es el hash attribute y el segundo
attribute es el rango attribute. Por ejemplo, la tabla Thread del foro puede tener ForumName y Subject como su principal key, donde ForumName es el hash attribute y el sujeto es el rango attribute. DynamoDB crea un índice hash desordenado en el hash attribute y un índice de rango ordenado en el rango attribute.
Esto significa que cada fila es primaria key es el combinación de hash y rango key. Puede hacer entradas directas en filas individuales si tiene tanto el hash como el rango key, o puede realizar una consulta contra el índice de rango ordenado. Por ejemplo, obtén Consígueme todas las filas de la tabla con Hash key X que tienen rango keys mayor que Y, u otras consultas al respecto. Tienen un mejor rendimiento y un menor uso de la capacidad en comparación con los análisis y las consultas en los campos que no están indexados. De su documentación:
Los resultados de la consulta siempre se ordenan por rango key. Si el tipo de datos del rango key 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 false
Probablemente me perdí algunas cosas mientras escribía esto y solo arañé la superficie. Existen mucho más aspectos a tener en cuenta al trabajar con tablas de DynamoDB (rendimiento, consistencia, capacidad, otros índices, key distribución, etc.). Debería echar un vistazo a las tablas de muestra y la página de datos para ver ejemplos.
Como todo se está mezclando, veamos su función y código para simular lo que significa de manera clara.
los solamente la forma de obtener una fila es a través de primaria key
getRow(pk: PrimaryKey): Row
Primario key La estructura de datos puede ser la siguiente:
// 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 su principal key es partición key + ordenar key 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:
Decidió que su principal key es partición key ¿solamente? obtener una sola fila por partición key.
Decidió que su principal key es partición key + ordenar key? 2.1 Obtener una sola fila por (partición key, clasificar key) u obtener un rango de filas por (partición key)
De cualquier manera, obtienes una sola fila por primaria key la única pregunta es si definiste ese primario key ser partición key solo o partición key + ordenar key
Los bloques de construcción son:
- Mesa
- Artículo
- Atributo KV.
Piense en Item como una fila y en Atributo KV como celdas en esa fila.
- Puede obtener un elemento (una fila) por primario key.
- 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 por complejo, 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á sucediendo arriba? Note las siguientes observaciones. Como dijimos, nuestros datos pertenecen a (Table, Item, KVAttribute). Entonces, cada artículo tiene un key. Ahora, la forma en que compones esa primaria key es significativo sobre cómo puede acceder a los datos.
Si decide que su PrimaryKey es simplemente un hash key entonces genial puedes sacar un solo artículo de él. Sin embargo, si decide que su key es hashKey + SortKey, entonces también puede hacer una consulta de rango en su key porque obtendrá sus artículos por (HashKey + SomeRangeFunction (en el rango key)). Para que pueda obtener varios elementos con su key consulta.
Nota: no me referí a índices secundarios.
@Mkobit ya da una respuesta bien explicada, pero agregaré una imagen grande del rango key y hash key.
En unas simples palabras range + hash key = composite primary key
Componentes principales de Dynamodb
Un primario key se compone de un hash key y una gama opcional key. Picadillo key se utiliza para seleccionar la partición DynamoDB. Las particiones son parte de los datos de la tabla. Distancia keys 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 hashkey es game, userA(hashkey)
puede jugar Ngame(range)
La tabla de música descrita en Tablas, elementos y atributos es un ejemplo de una tabla con un primario compuesto key (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 canción para ese elemento.
Una primaria compuesta key 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