web-dev-qa-db-fra.com

NoSQL: Obtention des 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 tableaux de données avec quelques dizaines de millions de lignes chacun.
  • Les tableaux de données sont horodatés (clé) - valeur
  • Les tableaux de données sont écrits une fois par seconde

La dernière entrée de chaque table doit être rapidement accessible et sera probablement interrogée le plus (en quelque sorte comme "suivre les données en temps réel"). Avec l'absence de 'Last ()' ou similaire, 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. De plus, la majeure partie du trafic serait concentrée sur cette table (bonne/mauvaise?). Existe-t-il une meilleure solution ou est-ce que je manque quelque chose?

Disons également que nous voulons interroger les valeurs dans les tableaux de données. Étant donné que l'analyse est évidemment hors de question, la seule option qui reste pour créer un index secondaire en dupliquant les données, doublant efficacement les exigences de stockage et les opérations d'écriture de quantité? D'autres solutions?

Je regarde principalement DynamoDB et Azure Table Storage, mais je suis également curieux de savoir comment BigTable gère cela.

27
user1597701

Je viens de publier un article aujourd'hui avec quelques "recettes" courantes sur DynamoDB . L'un d'eux est "Stockage des révisions d'articles, toujours à jour" Je pense que cela pourrait vous intéresser :)

En un mot, vous pouvez obtenir le dernier élément en utilisant Query(hash_key=..., ScanIndexForward=True, limit=1)

Mais cela suppose que vous avez un range_key_defined.

Avec Scan, vous n'avez aucun 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 les partitions et la demande Scan est ensuite équilibrée en 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, comme vous préférez

Ensuite, vous pouvez utiliser le "truc" de Query + Limit=1 + ScanIndexForward=false

38
yadutaf

En général, vous voulez probablement inverser l'horodatage, il diminue donc avec le temps, laissant la dernière ligne en haut.

Voici un article de blog qui explique comment procéder avec le stockage Windows Azure: http://blog.smarx.com/posts/using-numbers-as-keys-in-windows-Azure .

[~ # ~] mise à jour [~ # ~]

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 simplement spécifier ScanIndexForward=false et Limit=1 pour obtenir le dernier élément.

0
user94559