Datomic - Lidando com dados de maneira versionada

Preview:

Citation preview

DatomicLidando com dados de maneira versionada

Rodrigo Flores

@rlmflores

rodrigo.flores@nubank.com.br

Luiz Hespanha

@luiz_hespanha

luiz.hespanha@nubank.com.br

Datomic

Arquitetura

ACID

Funções

Dados em uma estrutura financeira

Datomic

Banco Orientado a Fatos

ID Nome Telefone Celular Telefone Fixo

1 John Doe 11 5555 5555 11 5556 5556

2 Mark Doe 11 5555 5556 NULL

3 Jane Doe 11 5555 6666 NULL

Modelo Entidade-Atributo-Valor (EAV)

ID Atributo Valor

1 Nome John Doe

1 Telefone Celular 11 5555 5555

1 Telefone Fixo 11 5556 5556

2 Nome Mark Doe

2 Telefone Celular 11 5555 5556

3 Nome Jane Doe

3 Telefone Celular 11 5555 6666

Modelo EAVT - Datomic

ID Atributo Valor Transação

1 Nome John Doe 12

1 Telefone Celular 11 5555 5555 12

1 Telefone Fixo 11 5556 5556 13

2 Nome Mary Poppins 25

2 Telefone Celular 11 5555 5556 67

2 Recomendado por

1 128

3 Nome Jane Doe 222

3 Telefone Celular 11 5555 6666 223

Fatos podem deixar de ser fatos

ID Atributo Valor Transação

1 Telefone Fixo 11 5555 5555 12

1 Telefone Fixo 11 5555 5555 55

É possível sobrescrever um fato

ID Atributo Valor Transação

1 Nome Jane Doe 25

1 Nome Jane Doe 98

1 Nome Jane Mary Doe 98

Mas isso é uma sobrescrita

Transações do banco de dados são entidades

ID Atributo Valor Transação

1 Nome John Doe 12

1 Telefone Celular 11 5555 5555 12

1 Telefone Fixo 11 5556 5556 13

2 Nome Mary Poppins 25

2 Telefone Celular 11 5555 5556 67

3 Nome Jane Doe 72

3 Telefone Celular 11 5555 6666 99

ID Atributo Valor

12 Hora 2012-09-12T00:00:00Z

13 Hora 2012-09-12T00:00:05Z

25 Hora 2012-09-22T00:00:00Z

Qualquer informação relevante pode ser adicionada na transação

ID Atributo Valor

12 Hora 2012-09-12T00:00:00Z

12 Usuário Joaquim José

13 Hora 2012-09-12T00:00:05Z

13 Usuário Maria Augusta

Arquivos em um controle de versão

Arquivos em uma pasta

vs

Queries

Programação Lógica

[[?entidade :atributo1 ?valor1]]

{:find [?celular] :in [?nome] :where [[?pessoa :pessoa/nome ?nome] [?pessoa :pessoa/telefone-celular ?celular]]}

{:find [?nome] :where [[?pessoa :pessoa/nome ?nome] [?pessoa :pessoa/idade ?idade] [(> ?idade 35)]]}

Schema

Todo atributo tem um tipo

Integer String

Long Boolean

Double UUID

Big Int Ref

Big Dec Instant

Float

Sempre não nulo

Não há obrigatoriedade de campo

Viajando no tempo

Default

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

As Of

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

Qual era o telefone da cliente cujo CPF é “11111111111” no instante 2015-05-08T01:12:00Z ?

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

Qual o nome do cliente cujo CPF é “11111111111” no instante 2015-04-01T01:12:00Z ?

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

Since

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

Quais foram os clientes que mudaram de nome após dia 01/04 ?

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

History

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

Qual foram todos os nomes utilizados pelo cliente cujo CPF é 11111111111 ?

ID Atributo Valor Hora da Transação

1 Nome Jane Doe 25/03/2015 10:00:12Z

1 CPF 11111111111 25/03/2015 10:00:12Z

1 Telefone 11 5555 5555 25/03/2015 10:00:12Z

1 Nome Jane Doe 12/04/2015 15:02:27Z

1 Nome Jane Mary Doe 12/04/2015 15:02:27Z

Qual era o nome do cliente cujo nome hoje é Jane Mary Doe no dia 01/04/2015 ?

Múltiplos bancos

(d/query {:find [?as-of-nome] :in [$current-db $as-of-db] :where [[$current-db ?pessoa :pessoa/nome "Jane Mary Doe"] [$old-db ?pessoa :pessoa/nome ?as-of-nome]]} (d/db connection) (d/as-of #inst "2015-04-01T00:00:00Z"))

Banco orientado a fatos

Fatos não são “apagados” ou alterados: escrevemos novos valores como novas “versões" de fatos antigos

Pode-se buscar no banco com uma data específica, com fatos inseridos a partir de uma certa data, ou em todo o histórico

Pode-se utilizar mais de um banco em uma query;

Arquitetura

Imagem retirada de http://docs.datomic.com/architecture.html

Serviço de "storage"

Peers

Processo que manipula o banco usando a biblioteca “Datomic Peer"

API para Clojure e Java

Cada Peer possui um cache com o serviço de Storage

Qualquer processo pode ser um Peer • Web Server • Aplicação GUI • Aplicação de linha de comando

Mas eu não uso uma linguagem JVM-Hosted, e agora?

REST API

Um PEER pode ser iniciado como um serviço HTTP standalone.

Transactor

Responsável por toda escrita no banco de dados

Notifica todos os PEERS sobre novos fatos.

E quando o Datomic não é uma boa escolha ?

ACID

Atômico

Transação

Ou faz tudo, ou aborta

Consistente

Validação de tipos e NULL

Transações só são vistas por completo

Isolamento

Uma escrita por vez

Durável

Só dá o OK depois de escrever no storage

ACID

Funções com regras de negócio

Funções a nível de transação.

Escopo limitado / Banco filtrado

Excision - Apagar dados de maneira definitiva

Conclusão

Dados são importantes

Auditoria de informação

Bancos históricos

Facilidade de deploy

OBRIGADO!

Estamos contratando!

http://bit.ly/trabalhe-na-nubank

Recommended