web-dev-qa-db-fra.com

DynamoDB: comment stocker une liste d'éléments

Je souhaite stocker une liste d'éléments appartenant à un objet parent.

L'objet parent serait comme suit:

user_id - hash key
timestamp - range key
attributeA - String
attributeB - Number
listC - List of objects

listC est une liste d'objets (comme JSON), où chaque objet peut avoir quelques champs:

attrX - number
attrY - string
attrZ - string

La taille de la liste peut varier, de quelques éléments aux centaines de lectures.

Comment dois-je les stocker?

En raison des limites de DynamoDB, je crains de ne pas pouvoir conserver cette liste en tant qu'attribut de l'objet parent. Je pense que de déplacer ces listes vers un autre tableau. Cependant, je ne sais pas si je devrais:

  1. conserver l'élément de chaque liste dans un enregistrement distinct,
  2. fractionner les éléments de la liste en plusieurs enregistrements distincts, où chaque enregistrement de base de données contient peu d'éléments.

Approche (1):

-------------------------------------
| parent_id | attrX | attrY | attrZ |
-------------------------------------
|  178      |  2    | "abc" | "xyz" |
-------------------------------------
|  178      | 2.4   | "klm" | "qwe" |
------------------------------------- 

Approche (2):

------------------------------------------------------------------------  
| parent_id | Chunk |  ListC                                            |
------------------------------------------------------------------------
|  178      |  1    | [{ X: "2", Y: "abc" }, { X: "2.4", Y: "klm" } ]   |
-------------------------------------------------------------------------
|  178      |  2    | [{ X: "2.8", Y: "nop" }, { X: "3.2", Y: "qrs" } ] |
------------------------------------------------------------------------ 

Que me recommanderiez-vous?

13
nicq

En fait, l'approche dépend du Query Access Pattern (QAP).

Approche 1: -

  1. Approche normalisée typique semblable à la conception du SGBDR. Cependant, nous devons penser cela du point de vue NoSQL. Il y a pas de jointure dans DynamoDB. Potentiellement, vous devrez peut-être lire deux tableaux pour obtenir les données requises. Veuillez noter que le coût est calculé sur la base des unités de capacité de lecture. Ainsi, les deux lectures différentes vous coûteront.

  2. Cette approche peut être acceptable si la taille de l'élément dépasse la taille de l'élément DynamoDB 400 Ko

  3. Vous pouvez écrire une expression de requête pour filtrer les données par attributs attrX, attrY et attrZ car elles sont stockées en tant qu'attributs de type de données scalaires normaux

Approche 2: -

  1. Approche NoSQL préférée pour conserver toutes les données requises dans une seule table. Aucune inscription ou lecture supplémentaire n'est requise

  2. Besoin de déterminer si la taille de l'élément peut dépasser 400 Ko

  3. Indique si vous devez écrire une requête pour filtrer les données par attributs attrX, attrY et attrZ. Veuillez noter que dans cette approche, les données ListC sont stockées en tant que type de données List of Map DynamoDB. Dans la plupart des scénarios, DynamoDB n'a pas la possibilité d'interroger les structures de données complexes comme celle-ci (c'est-à-dire Map inside List type de données)

Liste des objets - signifie la liste des cartes sur la base de données DynamoDB

{X: "2.8", Y: "nop"} - est l'objet. Cela se traduit par le type de données MAP sur la base de données DynamoDB.

Le crochet extérieur se traduit par le type de données LIST sur DynamoDB

8
notionquest