Comment interrogez-vous DynamoDB?

Je regarde DynamoDB d’Amazon car il semble que cela enlève tout le tracas de la maintenance et de la mise à l’échelle de votre serveur de firebase database. J’utilise actuellement MySQL, et la maintenance et la mise à l’échelle de la firebase database constituent un casse-tête complet.

J’ai parcouru la documentation et j’ai du mal à comprendre comment structurer vos données pour pouvoir les retrouver facilement.

Je suis totalement nouveau sur les bases de données NoSQL et non relationnelles.

À partir de la documentation Dynamo, il semble que vous ne pouvez interroger qu’une table sur la clé de hachage principale et la clé de plage primaire avec un nombre limité d’opérateurs de comparaison.

Ou vous pouvez exécuter une parsing de table complète et lui appliquer un filtre. Le problème est qu’il n’parsing que 1 Mo à la fois, vous devrez donc probablement répéter votre parsing pour trouver un nombre X de résultats.

Je me rends compte que ces limitations leur permettent de fournir des performances prévisibles, mais il semble que cela rend vraiment difficile la diffusion de vos données. Et réaliser des parsings de table complètes semble être vraiment inefficace et ne deviendrait que moins efficace au fur et à mesure de la croissance de votre table.

Par exemple, disons que j’ai un clone de Flickr. La table Mes images peut ressembler à:

  • ID de l’image (numéro, clé de hachage principale)
  • Date d’ajout (numéro, clé de la plage primaire)
  • ID utilisateur (chaîne)
  • Tags (jeu de cordes)
  • etc

Donc, en utilisant query, je serais en mesure de lister toutes les images des 7 derniers jours et de limiter le nombre de résultats à X assez facilement.

Mais si je voulais lister toutes les images d’un utilisateur particulier, je devrais faire une parsing complète de la table et filtrer par nom d’utilisateur. Même chose irait pour les balises.

Et comme vous ne pouvez numériser que 1 Mo à la fois, vous devrez peut-être effectuer plusieurs parsings pour trouver X nombre d’images. Je ne vois pas non plus un moyen de s’arrêter facilement à un nombre X d’images. Si vous essayez de saisir 30 images, votre première parsing peut en trouver 5 et votre seconde peut en trouver 40.

Ai-je raison? Est-ce fondamentalement un compromis? Vous obtenez des performances de firebase database prévisibles très rapides, sans maintenance. Mais le compromis est que vous devez construire beaucoup plus de logique pour gérer les résultats?

Ou suis-je totalement hors de la base ici?

Oui, vous avez raison sur le compromis entre performance et flexibilité des requêtes.

Mais il existe quelques astuces pour réduire la douleur – les indices / dénormalisation secondaires étant probablement les plus importants.

Vous auriez une autre table indexée sur l’ID utilisateur, répertoriant toutes leurs images, par exemple. Lorsque vous ajoutez une image, vous mettez à jour cette table et vous ajoutez une ligne à la table indexée sur l’ID de l’image.

Vous devez décider des requêtes dont vous avez besoin, puis concevoir le modèle de données qui les entoure.

Je pense que vous devez créer votre propre index secondaire , en utilisant une autre table.

Cette table “schéma” pourrait être:

User ID (Ssortingng, Primary Key) Date Added (Number, Range Key) Image ID (Number) 

De cette façon, vous pouvez interroger par ID utilisateur et filtrer par date également

Vous pouvez utiliser la clé composite de la plage de hachage comme index principal.

De la page DynamoDB:

Une clé primaire peut être une clé de hachage à atsortingbut unique ou une clé de plage de hachage composite. Une seule clé primaire de hachage d’atsortingbut pourrait être, par exemple, «UserID». Cela vous permettrait de lire et d’écrire rapidement des données pour un élément associé à un ID utilisateur donné.

Une clé de plage de hachage composite est indexée en tant qu’élément de clé de hachage et élément de clé de plage. Cette clé en plusieurs parties maintient une hiérarchie entre les valeurs des premier et second éléments. Par exemple, une clé de plage de hachage composite peut être une combinaison de «UserID» (hachage) et «Timestamp» (plage). En maintenant l’élément de clé de hachage constant, vous pouvez effectuer une recherche dans l’élément clé de la plage pour récupérer des éléments. Cela vous permettrait d’utiliser l’API de requête pour, par exemple, extraire tous les éléments d’un identifiant unique sur une plage d’horodatages.