web-dev-qa-db-fra.com

Quand utiliser plusieurs tables dans DynamoDB?

Le DyanmoDB meilleures pratiques précise que:

Vous devez conserver le moins de tables possible dans une application DynamoDB. La plupart des applications bien conçues ne nécessitent qu'une seule table.

Je trouve amusant alors que presque tous les tutoriels que j'ai vus concernant DyanmoDB aient une conception multi-tables.

Mais qu'est-ce que cela signifie dans la pratique?

Prenons une application simple avec trois entités principales: les utilisateurs, les projets et les documents. Un utilisateur possède plusieurs projets et un projet peut avoir plusieurs documents. Nous devons généralement interroger les projets d'un utilisateur et les documents d'un projet. Les lectures sont plus nombreuses que les écritures avec une marge importante.

La conception d'un tableau d'un didacticiel naïf utiliserait trois tableaux:

Users
Hash key
user-id

Projects
Hash key       Global Index
project-id     user-id

Documents
Hash key       Global Index
document-id    project-id

Nous pourrions assez facilement réduire Project et Document en une seule table Documents:

Documents
Hash key    Sort key        Global Index
project-id  document-id     user-id

Mais pourquoi s'arrêter là? Pourquoi pas une table pour les gouverner tous? Puisque le User est la racine de tout ...

Users
Hash key    Sort key
user-id     aspect
---------   ---------
foo         user                   email: [email protected] ...
foo         project:1              title: "The Foo Project"
foo         project:1:document:2   document-id: 2     ...

Ensuite, nous aurions un index global sur, disons, le champ email pour les recherches d'enregistrements utilisateur, et un autre sur le document-id champ pour les recherches directes de documents.

Est-ce ainsi que cela est censé fonctionner? Est-il légitime de jeter des types de données aussi divergents dans la même table? Ou la deuxième conception à deux tables est-elle une meilleure approche?

À quel moment serait-il correct d'ajouter un deuxième tableau?

11
David Eyk

Oui, il est légitime de faire ce que vous dites. Les deux le sont en fait. Il y a certaines variables que vous n'avez pas ici et peuvent aider à guider la façon dont le modèle de données doit être fait.

  1. À quelle échelle souhaitez-vous parvenir avec cette application et ce modèle de données?
  2. Parmi les modèles d'accès de l'application, quel est le rapport de lectures entre ces modèles. Ce qui signifie que l'un est le plus touché par rapport aux autres.
  3. Parmi les modèles d'accès que vous répertoriez, combien de fois par seconde sont-ils effectués?

Par exemple, si 80% de toutes les lectures visent à trouver les utilisateurs d'un projet et que cela doit se produire 30 000/s, mais dans votre application, moins de personnes iront plus loin et trouveront les documents pour les projets, alors il représente 20% des lectures globales et ne peut être que de 2000 lectures/s. Ce premier est le "chemin chaud" de votre application et doit être optimisé pour.

Pensez-y également de cette façon, avec une base de données non relationnelle comme DynamoDB, vous pouvez optimiser la façon dont votre application utilise et accède aux données et pas comme la base de données relationnelle où vous devez vous inquiéter beaucoup de la façon dont elle est stockée dans la base de données.

7
Kirk