Dois-je toujours créer mon DynamoDB à l'aide de tables de hachage et de la gamme de clé primaire de type?
Dans les docs ( http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/APISummary.html ), il est indiqué:
Vous pouvez interroger uniquement les tables dont la clé primaire est de hachage et de gamme de type
et
nous vous recommandons de concevoir des applications que vous pouvez utiliser l'opération de Requête pour la plupart, et utiliser le Scan uniquement le cas échéant
Ce n'est pas directe, mais est-il préférable d'utiliser les hash-et-gamme de clés primaires?
EDIT:
Réponse TL;DR: Utiliser selon la clé primaire de type qui fait sens pour votre modèle de données et l'utilisation des index secondaires pour mieux interroger l'appui.
Références:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
http://www.allthingsdistributed.com/2013/12/dynamodb-global-secondary-indexes.html
https://forums.aws.amazon.com/thread.jspa?messageID=604862
Dans quelle situation avez-vous à l'aide de Simples Clés de Hachage sur DynamoDB?
OriginalL'auteur Brett | 2015-04-28
Vous devez vous connecter pour publier un commentaire.
Le choix de la clé à utiliser est une question de Cas d'Utilisation et des Exigences en matière de Données pour un scénario particulier. Par exemple, si vous stockez Session Utilisateur Données qu'il n'aurait pas beaucoup de sens à l'aide de la Gamme de Clés depuis chaque enregistrement peut être référencé par un GUID et accessible directement, sans groupement exigences. En termes généraux, une fois que vous connaissez l'Id de Session que vous venez de faire le point spécifique de l'interrogation par la clé. Un autre exemple pourrait être le stockage de Compte d'Utilisateur ou des données de Profil, chaque utilisateur possède son propre et vous sera très probablement y accéder directement (par l'Utilisateur ou autre chose).
Toutefois, si vous stockez les Éléments de Commande puis le Gamme de Clés fait beaucoup plus de sens puisque vous voulez probablement pour récupérer les éléments regroupés par leur Ordre.
En termes de Modèle de Données, le Clé de Hachage vous permet de vous identifier de manière unique un enregistrement à partir de votre tableau, et le Gamme de Clés peut éventuellement être utilisé pour trier et grouper plusieurs dossiers qui sont généralement récupérées ensemble. Exemple: Si vous définissez un total de stocker les Éléments de Commande, le Id de Commande pourrait être votre Clé de Hachage, et la OrderItemId la Gamme de Clés. Chaque fois que vous le souhaitez à la recherche de la les Éléments de Commande à partir d'un certain Ordre, vous venez de requête par la Clé de Hachage (numéro de Commande), et vous recevrez tous vos les éléments de commande.
Vous pouvez trouver ci-dessous une définition formelle de l'utilisation de ces deux clés:
De sorte que le Gamme de Clés ajoute un regroupement à la capacité de Modèle de Données, cependant, l'utilisation de ces deux touches aussi avoir des conséquences sur la Modèle de Stockage:
Non seulement la Clé de Hachage permet d'identifier de manière unique l'enregistrement, mais c'est aussi le mécanisme pour assurer la distribution de charge. Le Gamme de Clés (lorsque utilisé) permet d'indiquer les enregistrements qui seront, pour la plupart extraites ensemble, par conséquent, le stockage peut également être optimisée pour un tel besoin.
Choisir les bonnes touches pour représenter vos données est l'un des aspects les plus critiques au cours de votre processus de conception, et qu'il influe directement sur la façon dont beaucoup de votre application doit effectuer, à l'échelle et de coût.
Notes de bas de page:
Le Modèle de Données est le modèle à travers lequel nous percevons et de manipuler nos données. Il décrit la façon dont nous interagissons avec les données dans la base de données [FOWLER]. En d'autres termes, c'est la façon dont vous le résumé de votre modèle de données, la façon de groupe de vos entités, les attributs que vous choisissez comme clés primaires, etc
Le Modèle de Stockage explique comment la base de données stocke et manipule les données en interne [FOWLER]. Bien que vous ne pouvez pas contrôler directement, vous pouvez certainement d'optimiser la manière dont les données sont récupérées ou écrit en sachant comment la base de données fonctionne en interne.
userId
. Au moment de la connexion, je ne sais pas leuserId
et le besoin de faire une requête suremail
. (Je pourrais utiliseremail
comme clé primaire, mais je ne peux pas la recherche paruserId
). Je n'ai pas creusé assez profond encore pour obtenir une poignée sur le local et le global index, mais j'ai l'impression que ma réponse peut-être là.Selon l'article lié sur Vogels blog, il ressemble à la GSI est ce que je suis à la recherche pour. "En outre, un GSI de la performance est conçu pour répondre DynamoDB du chiffre ms de latence - vous pouvez ajouter des éléments à une table d'Utilisateurs pour un jeu de l'app avec des dizaines de millions d'utilisateurs avec id d'utilisateur de la clé primaire, mais de les retrouver en fonction de leur ville d'origine, sans réduction des performances des requêtes."
Les exemples de Vogels le blog de l'utilisation de hachage et de gamme type de clés primaires. Pourrait même être atteint avec de hachage clés primaires?
Bon, je crois que j'ai ce. Pourriez-vous confirmer cela pour moi? Je peux créer
user
table avecuserId
que le hachage de la clé primaire (pas de plage). Je peux alors créer un GSIUserEmailIndex
avec une clé primaire deemail
qui va me donneruserId
(depuis les clés primaires sont toujours projetés dans le GSIs). Je peux alors obtenir leuserId
en interrogeantUserEmailIndex
avec leemail
, puis à l'aide de lauserId
je peux obtenir de l'élément de lauser
table.Il est logique, vous pourriez avoir une table avec email#mot de passe de la clé de hachage et le nom d'utilisateur comme un attribut ... votre processus de connexion voudrais essayer de le faire d'un simple GetItem avec le calcul de clé de hachage, si l'identifiant est retourné non seulement vous avez la confirmation du processus d'authentification, mais aussi la clé pour récupérer d'autres informations de l'utilisateur.
OriginalL'auteur bsd
Pas nécessairement. Il est préférable de choisir une clé primaire qui prend en charge les modèles d'accès à votre cas d'utilisation.
Par exemple, disons que vous voulez avoir une table pour Utilisateurs. Vous permettra de stocker les détails pour un seul utilisateur (nom, adresse de courriel, le créateur, etc.). Votre motif de l'accès peut-être que vous êtes aller chercher le détail d'un Utilisateur. Dans ce cas, il est plus logique d'utiliser une clé primaire de type de hachage, avec une clé de hachage de userId.
Disons que vous aussi, vous souhaitez une autre table qui stocke Groupes. Votre motif de l'accès peut-être que vous voulez obtenir tous les membres d'un groupe donné. Ici, il est plus logique d'utiliser une clé primaire de type de hachage et de la gamme, avec votre de hachage et de la gamme des clés respectivement être groupId et userId.
Les choses importantes à savoir sont les les différences entre les deux types de clés (citation ci-dessous) et le Lignes directrices pour Travailler avec des Tables:
Vous pouvez en savoir plus sur les meilleures pratiques dans le Dynamo DB Lignes directrices pour Travailler avec des Tables de la documentation
Query
sur une table de Hachage de la Clé Primaire est impossible.J'ai utilisé
userId
comme mon exemple, mais tout aussi bien utiliseremailAddress
comme la clé de hachage (dépend de votre conception et de l'accès). Disons que vous avezemailAddress
comme le hash pour la table. Lorsque vous souhaitez accéder à un élément de ce tableau à l'aide deemailAddress
, de vous faire uneGetItem
appel. Vous ne permet pas d'interroger ce tableau sur leemailAddress
. Si vous avez besoin d'accéder à cette table à l'aide d'un autre attribut(s) comme les clés, vous devrez créer un index et une requête à l'encontre de l'indice. Cet indice peut également être de hash / hash-plage, et vous définissez les attributs pour être projeté sur elle.Merci. Je suis conscient que je pourrais utiliser
email
que ma clé de hachage, mais mon plus courantes de cas d'utilisation est à la recherche paruserId
. Dire que j'ai un RESTE de ressourcesGET /users/1
je pourrais facilement requête pouruserId
1. Ce serait beaucoup plus fréquente que l'interrogation par e-mail, je voudrais principalement utiliser pour la connexion. Hypothétiquement, si j'étais à-dire "la seule fois que je veux requête par e-mail est sur login" serait-il mieux de faire une Analyse conditionnelle au lieu de créer un index secondaire? Je comprends un Scan serait beaucoup plus coûteux, mais depuis qu'il est relativement rare d'action qui serait probablement pas mal, pas vrai? Merci encore!OriginalL'auteur mkobit
Comme d'autres l'ont déjà dit - ne devriez-vous pas.
La déclaration que la confusion et vous avez dû vous poser cette question, en premier lieu, mal:
Vous pouvez interroger des tables dont la clé primaire est unique attribut (seule partition).
Preuve:
Sortie de la dernière commande (il fonctionne):
OriginalL'auteur golem