39 votes

NoSQL : Récupérer les dernières valeurs des tables DynamoDB/Azure Table Storage

J'ai un petit problème qui nécessite quelques suggestions :

  • Disons que nous avons quelques centaines de tables de données avec quelques dizaines de millions de lignes chacune.
  • Les tableaux de données sont timestamp(key) - value
  • Les tableaux de données sont écrits une fois par seconde

La dernière entrée de chaque table doit pouvoir être obtenue rapidement et sera probablement la plus interrogée. (un peu comme "suivre les données en temps réel"). En l'absence de 'Last()' ou autre, je pensais créer une autre table "LatestValues" où la dernière entrée de chaque table de données est mise à jour pour une récupération plus rapide. Cependant, cela ajouterait une mise à jour supplémentaire pour chaque opération d'écriture. En outre, la plupart du trafic serait concentré sur cette table (bon/mauvais ?). Existe-t-il une meilleure solution pour cela ou est-ce que je rate quelque chose ?

Supposons également que nous voulions interroger les valeurs des tables de données. Puisque le balayage est évidemment hors de question, la seule option restante est-elle de créer un index secondaire en dupliquant les données, doublant ainsi les besoins de stockage et le nombre d'opérations d'écriture ? Y a-t-il d'autres solutions ?

Je m'intéresse principalement à DynamoDB et à Azure Table Storage, mais je suis également curieux de savoir comment BigTable gère cela.

58voto

jtlebi Points 2598

Je viens de publier un article aujourd'hui avec quelques les "recettes" courantes concernant DynamoDB . L'un d'entre eux est "Stocker les révisions d'articles, obtenir toujours les dernières" Je pense que cela pourrait vous intéresser :)

En bref, vous pouvez obtenir le dernier article en utilisant Query(hash_key=..., ScanIndexForward=True, limit=1)

Mais, cela suppose que vous avez une clé_de_plage définie.

Avec Scan vous n'avez pas de paramètre tel que ScanIndexForward=false et de toute façon, vous ne pouvez pas vous fier à l'ordre car les données sont réparties sur des partitions et la Scan La demande est alors équilibrée en termes de charge.

Pour atteindre votre objectif avec DynamoDB, vous pouvez "diviser" votre horodatage de cette façon :

  1. hash_key : date
  2. range_key : heure ou horodatage complet, selon votre préférence

Ensuite, vous pouvez utiliser l'astuce du Query + Limit=1 + ScanIndexForward=false

-1voto

smarx Points 18006

En général, vous souhaitez simplement inverser l'horodatage, de sorte qu'il diminue au fil du temps, en laissant la ligne la plus récente en haut.

Voici un de mes articles de blog expliquant comment faire cela avec le stockage Windows Azure : http://blog.smarx.com/posts/using-numbers-as-keys-in-Windows-azure .

UPDATE

J'utilise DynamoDB pour un projet, mais de manière très simpliste, donc je n'ai pas beaucoup d'expérience. Cela dit, http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html me suggère que vous pouvez juste spécifier ScanIndexForward=false y Limit=1 pour obtenir le dernier élément.

-3voto

Alec Points 143

Pour les personnes qui ont trouvé ce fil de discussion mais qui ne s'intéressent qu'à une seule table :

Vous pouvez obtenir le dernier élément d'un tableau dans l'interface utilisateur en cliquant sur la colonne pour trier par ces valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X