Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Como modelar dados relacionais com DynamoDB?

Como modelar dados relacionais com DynamoDB?

Modelar dados no banco NoSQL AWS DynamoDB nem sempre é uma tarefa fácil, principalmente para quem tem background com bancos de dados relacionais. Com esta palestra, vou demonstrar uma das maneiras de pensar a modelagem da sua aplicação para utilizar DynamoDB sem sofrimento.

Flávio Omar Losada

May 10, 2021
Tweet

More Decks by Flávio Omar Losada

Other Decks in Technology

Transcript

  1. Apresentação - Flávio Omar Losada - Bacharel em Ciência da

    Computação - Pesquisador na Senior Sistemas - Podcaster na Taverna da Programação
  2. Partições e chave-valor 1 2 3 4 5 6 7

    8 9 { “chave”: 2, “desc”: “Produto” ... }
  3. Cobrança por escritas, leituras e armazenamento* *Armazenamento: A cobrança por

    armazenamento se dá após 25GB, sendo cobrado U$ 0,25 por mês para cada GB excedente. Unidade de solicitação de gravação: 1 KB Unidade de solicitação de leitura: 4 KB U$ 1,25/mi unidades de solicitação de gravação U$ 0,25/mi unidades de solicitação de leitura Tabela
  4. Escrevendo e recuperando dados Chave de partição (Partition Key -

    PK) Chave de ordenação (Sort Key - SK) id date description 1 2021-05-05T20:00:00.000 Z I think you got the wrong car, McFly. OBRIGATÓRIAS
  5. Schemaless Não há pré-definição de campos nas tabelas, cada registro

    pode conter um conjunto diferente de colunas. id Atributos 15 16 descricao valor Bicicleta 500,00 descricao valor cor Capa de chuva 50,00 Amarela
  6. Modelo de entidade e relacionamento O primeiro passo é definir

    o domínio da aplicação com o modelo de entidade e relacionamento. A modelagem precisa ser bem pensada e ser para um domínio específico.
  7. Quais perguntas eu quero responder? - Obter um pedido; -

    Obter um produto; - Obter itens de um pedido; - Obter um item do pedido; - Listar pedidos de um determinado status; - Obter pedidos que contém determinado produto; Esta etapa é de extrema importância, pois vai definir todas as ações que serão passíveis de execução na sua modelagem. Adicionar novas perguntas no futuro pode ser muito complexo!
  8. Partition key e Sort key... Como convenção, definimos duas colunas:

    pk (partition key) e sk (sort key). São colunas “dinâmicas”. pk sk Atributos PEDIDO#0001 PEDIDO PEDIDO#0002 PEDIDO dataPedido nomeCliente status 2021-05-05 Cliente 01 CONCLUIDO dataPedido nomeCliente status 2021-05-14 Cliente 04 AGUARDANDO
  9. E como recuperamos um pedido? Utilizando a API do DynamoDB,

    podemos fazer o comando... pk = ‘PEDIDO#0001’ AND sk = ‘PEDIDO’
  10. Produtos... Para os produtos, a ideia segue a mesma... pk

    sk Atributos PRODUTO#0115 PRODUTO PRODUTO#0302 PRODUTO descricao valor Bicicleta 500,00 descricao valor cor Capa de chuva 50,00 Amarela
  11. Itens do pedido Para os itens do pedido a ideia

    muda um pouco, mas ainda muito similar... pk sk Atributos PEDIDO#0001 ITEMPED#2fS6VX PEDIDO#0001 ITEMPED#ei5pNM idProduto valor quantidade 0115 500,00 1 idProduto valor quantidade 0302 50,00 1 PEDIDO#0001
  12. Quais perguntas eu quero responder? - Obter um pedido; -

    Obter um produto; - Obter itens de um pedido; - Obter um item do pedido; - Listar pedidos de um determinado status; - Obter pedidos que contém determinado produto;
  13. Obter um item sem o número do pedido... BEGINS_WITH(pk, PEDIDO#)

    AND sk = ‘ITEMPED#2fS6VX’ É preciso criar um índice. O DynamoDB possui dois tipos de índices: 1. Local Secondary Index (LSI) - Permite criar uma variação da chave composta, alterando a Sort key e mantendo a mesma Partition key 2. Global Secondary Index (GSI) - Permite criar uma nova combinação de chaves, alterando os campos que representam tanto a partition key quanto a sort key
  14. Criando um índice global (GSI) Vamos criar um índice para

    inverter os papéis dos campos pk e sk. sk pk Atributos ITEMPED#2fS6VX PEDIDO#0001 ITEMPED#ei5pNM PEDIDO#0001 idProduto valor quantidade 0115 500,00 1 idProduto valor quantidade 0302 50,00 1 Partition Key Sort key
  15. Agora podemos executar... sk = ‘ITEMPED#2fS6VX’ AND BEGINS_WITH(pk, ‘PEDIDO#’) --

    using GSI É preciso deixar explícito na API do DynamoDB que deseja utilizar o índice global.
  16. Quais perguntas eu quero responder? - Obter um pedido; -

    Obter um produto; - Obter itens de um pedido; - Obter um item do pedido; - Listar pedidos de um determinado status; - Obter pedidos que contém determinado produto;
  17. Como listar pedidos por status? O campo status precisa estar

    na coluna da Partition key. Cria-se um novo GSI. status pk Atributos CONCLUIDO PEDIDO#0001 AGUARDANDO PEDIDO#0002 dataPedido nomeCliente sk 2021-05-05 Cliente 01 PEDIDO dataPedido nomeCliente sk 2021-05-14 Cliente 04 PEDIDO Partition Key Sort key
  18. Obter pedidos que contém um produto... Precisamos criar um novo

    índice. Desta vez definindo o campo idProduto como Partition key. idProduto pedidoItem Atributos 0115 0001#2fS6VX 0302 0001#ei5pNM pk valor quantidade sk ITEMPED#2fS6VX 500,00 1 PEDIDO#0001 pk valor quantidade sk ITEMPED#ei5pNM 50,00 1 PEDIDO#0001
  19. Buscando pedido que contém produto... idProduto = ‘0115’-- using GSI3

    idProduto = ‘0115’ AND BEGINS_WITH(pedidoItem, ‘0001#’) using GSI3
  20. Quais perguntas eu quero responder? - Obter um pedido; -

    Obter um produto; - Obter itens de um pedido; - Obter um item do pedido; - Listar pedidos de um determinado status; - Obter pedidos que contém determinado produto;