2013-02-23 3 views
0

J'espérais que quelqu'un pourrait me aider à comprendre comment concevoir mieux ma table (s) pour DynamoDB. Je construis une application qui est utilisée pour suivre les visites qu'un certain utilisateur fait au profil d'un autre utilisateur.DynamoDB Modèle/clés conseils

Actuellement, j'ai un MongoDB où une entrée contient les champs suivants:

  • userId
  • visitedProfileId
  • Date
  • état
  • isMobile

Comment cela se traduit à DynamoDB d'une manière ce ne serait pas trop lent? Je devrais faire des requêtes de recherche pour sélectionner tous les éléments qui ont un certain userId, en prenant le statut et isMobile en affect. Que seraient les clés? Puis-je utiliser la fonctionnalité limite pour demander uniquement les dernières entrées x (triées par date?).

Je aime vraiment la façon dont DynamoDB peut être utilisé, mais il semble vraiment un peu compliqué à faire le clic entre une base de données NoSQL régulière et une base de données NoSQL clé-valeur.

Répondre

3

Il y a deux façons vous pouvez le faire - et cela dépend probablement de tout autre vous interroger pouvez faire sur ce tableau.

  1. Faites votre HashKey de la table du userId, puis le RangeKey peut être <status>:<isMobile>:<date> (par exemple active:true:2013-03-25T04:05:06.789Z). Ensuite, vous pouvez query en utilisant BEGINS_WITH dans le RangeKeyCondition (et ScanIndexForward ensemble à false pour revenir dans l'ordre croissant).

    Alors disons que vous vouliez trouver les 20 dernières lignes de l'ID utilisateur 1234abcd qui ont un status de active et un isMobile de true (je suppose que ce que vous entendez par « prendre [les] en affecter ») , votre query ressemblerait à ceci:

    { 
        "TableName": "Users", 
        "Limit": 20, 
        "HashKeyValue": { "S": "1234abcd" }, 
        "RangeKeyCondition": { 
        "ComparisonOperator": "BEGINS_WITH" 
        "AttributeValueList": [{ "S": "active:true:" }], 
        }, 
        "ScanIndexForward": false 
    } 
    
  2. Une autre façon serait de faire le HashKey<userId>:<status>:<isMobile> et le RangeKey serait juste le date. Vous n'auriez pas besoin d'un RangeKeyCondition dans ce cas (et dans l'exemple, le HashKeyValue serait { "S": "1234abcd:active:true" }).