As melhores práticas do DyanmoDB deixam claro que:
Você deve manter o mínimo de tabelas possível em um aplicativo DynamoDB. A maioria das aplicações bem projetadas requer apenas uma tabela.
Acho divertido, então, que quase todos os tutoriais que eu já vi lidando com o DyanmoDB têm um design de várias tabelas.
Mas o que isso significa na prática?
Vamos considerar um aplicativo simples com três entidades principais: Usuários, Projetos e Documentos. Um usuário possui vários projetos e um projeto pode ter vários documentos. Normalmente, precisamos consultar os projetos para um usuário e os documentos para um projeto. Lê supera as gravações por uma margem significativa.
O design da tabela de um tutorial ingênuo usaria três tabelas:
Users
Hash key
user-id
Projects
Hash key Global Index
project-id user-id
Documents
Hash key Global Index
document-id project-id
Poderíamos facilmente entrar em colapso Project
e Document
formar uma Documents
tabela:
Documents
Hash key Sort key Global Index
project-id document-id user-id
Mas por que parar aí? Por que não uma mesa para governar todos eles? Uma vez que User
é a raiz de tudo ...
Users
Hash key Sort key
user-id aspect
--------- ---------
foo user email: foo@bar.com ...
foo project:1 title: "The Foo Project"
foo project:1:document:2 document-id: 2 ...
Em seguida, teríamos um Índice Global no, digamos, o email
campo para pesquisas de registros de usuários e outro no document-id
campo para pesquisas diretas de documentos.
É assim que deve funcionar? É legítimo jogar esses tipos de dados extremamente divergentes na mesma tabela? Ou o segundo design de duas mesas é uma abordagem melhor?
Em que momento seria correto adicionar uma segunda tabela?