Quando usar várias tabelas no DynamoDB?

11

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 Projecte Documentformar uma Documentstabela:

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 emailcampo para pesquisas de registros de usuários e outro no document-idcampo 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?

David Eyk
fonte

Respostas:

7

Sim, é legítimo fazer o que você está dizendo. Ambos são realmente. Existem algumas variáveis ​​que você não possui aqui e podem ajudar a orientar como o modelo de dados deve ser feito.

  1. Que tipo de escala você deseja obter com esse aplicativo e modelo de dados?
  2. Dos padrões de acesso do aplicativo, qual é a proporção de leituras entre esses padrões. Significando qual é o mais atingido em relação aos outros.
  3. Dos padrões de acesso que você lista, quantas vezes por segundo eles são executados?

Por exemplo, se 80% de todas as leituras são para encontrar os usuários em um projeto e isso precisa acontecer 30.000 / s, mas no seu aplicativo, poucas pessoas irão além e descobrirão os documentos para os projetos. é 20% das leituras gerais e pode ser apenas 2000 leituras / s. Esse primeiro é o "caminho ativo" do seu aplicativo e deve ser otimizado.

Pense também dessa maneira: com um banco de dados não relacional como o DynamoDB, você pode otimizar como o aplicativo usa e acessa os dados e não como o banco de dados relacional, no qual você precisa se preocupar muito com a forma como ele é armazenado no banco de dados.

Kirk
fonte
Em uma das conversas inevitáveis, um engenheiro sênior declarou aproximadamente o seguinte - no passado, o armazenamento era relativamente mais caro que a computação; por isso, otimizamos para armazenamento (Relational DB), mas agora o armazenamento é muito barato! A computação é relativamente mais cara; portanto, optimizar para computar (noSQL, optimizado para leitura)
Gaz_Edge
Estou de acordo, o NoSql permite que eu gerencie meus dados de acordo com meus requisitos de aplicação. É uma questão de proporção entre leitura e alteração de dados.
Anurag pareek 17/01/19