93
Datomic Lidando com dados de maneira versionada

Datomic - Lidando com dados de maneira versionada

Embed Size (px)

Citation preview

Page 1: Datomic - Lidando com dados de maneira versionada

DatomicLidando com dados de maneira versionada

Page 2: Datomic - Lidando com dados de maneira versionada

Rodrigo Flores

@rlmflores

[email protected]

Page 3: Datomic - Lidando com dados de maneira versionada

Luiz Hespanha

@luiz_hespanha

[email protected]

Page 4: Datomic - Lidando com dados de maneira versionada

Datomic

Arquitetura

ACID

Funções

Page 5: Datomic - Lidando com dados de maneira versionada
Page 6: Datomic - Lidando com dados de maneira versionada

Dados em uma estrutura financeira

Page 7: Datomic - Lidando com dados de maneira versionada

Datomic

Page 8: Datomic - Lidando com dados de maneira versionada

Banco Orientado a Fatos

Page 9: Datomic - Lidando com dados de maneira versionada

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

Page 10: Datomic - Lidando com dados de maneira versionada

Modelo Entidade-Atributo-Valor (EAV)

Page 11: Datomic - Lidando com dados de maneira versionada

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

Page 12: Datomic - Lidando com dados de maneira versionada

Modelo EAVT - Datomic

Page 13: Datomic - Lidando com dados de maneira versionada

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

Page 14: Datomic - Lidando com dados de maneira versionada

Fatos podem deixar de ser fatos

Page 15: Datomic - Lidando com dados de maneira versionada

ID Atributo Valor Transação

1 Telefone Fixo 11 5555 5555 12

1 Telefone Fixo 11 5555 5555 55

Page 16: Datomic - Lidando com dados de maneira versionada

É possível sobrescrever um fato

Page 17: Datomic - Lidando com dados de maneira versionada

ID Atributo Valor Transação

1 Nome Jane Doe 25

1 Nome Jane Doe 98

1 Nome Jane Mary Doe 98

Page 18: Datomic - Lidando com dados de maneira versionada

Mas isso é uma sobrescrita

Page 19: Datomic - Lidando com dados de maneira versionada

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

Page 20: Datomic - Lidando com dados de maneira versionada

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

Page 21: Datomic - Lidando com dados de maneira versionada

ID Atributo Valor

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

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

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

Page 22: Datomic - Lidando com dados de maneira versionada

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

Page 23: Datomic - Lidando com dados de maneira versionada

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

Page 24: Datomic - Lidando com dados de maneira versionada

Arquivos em um controle de versão

Arquivos em uma pasta

vs

Page 25: Datomic - Lidando com dados de maneira versionada

Queries

Page 26: Datomic - Lidando com dados de maneira versionada

Programação Lógica

Page 27: Datomic - Lidando com dados de maneira versionada

[[?entidade :atributo1 ?valor1]]

Page 28: Datomic - Lidando com dados de maneira versionada

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

Page 29: Datomic - Lidando com dados de maneira versionada

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

Page 30: Datomic - Lidando com dados de maneira versionada

Schema

Page 31: Datomic - Lidando com dados de maneira versionada

Todo atributo tem um tipo

Page 32: Datomic - Lidando com dados de maneira versionada

Integer String

Long Boolean

Double UUID

Big Int Ref

Big Dec Instant

Float

Page 33: Datomic - Lidando com dados de maneira versionada

Sempre não nulo

Não há obrigatoriedade de campo

Page 34: Datomic - Lidando com dados de maneira versionada

Viajando no tempo

Page 35: Datomic - Lidando com dados de maneira versionada

Default

Page 36: Datomic - Lidando com dados de maneira versionada

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

Page 37: Datomic - Lidando com dados de maneira versionada
Page 38: Datomic - Lidando com dados de maneira versionada

As Of

Page 39: Datomic - Lidando com dados de maneira versionada

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

Page 40: Datomic - Lidando com dados de maneira versionada

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

Page 41: Datomic - Lidando com dados de maneira versionada

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

Page 42: Datomic - Lidando com dados de maneira versionada

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

Page 43: Datomic - Lidando com dados de maneira versionada

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

Page 44: Datomic - Lidando com dados de maneira versionada

Since

Page 45: Datomic - Lidando com dados de maneira versionada

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

Page 46: Datomic - Lidando com dados de maneira versionada

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

Page 47: Datomic - Lidando com dados de maneira versionada

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

Page 48: Datomic - Lidando com dados de maneira versionada

History

Page 49: Datomic - Lidando com dados de maneira versionada

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

Page 50: Datomic - Lidando com dados de maneira versionada

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

Page 51: Datomic - Lidando com dados de maneira versionada

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

Page 52: Datomic - Lidando com dados de maneira versionada

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

Page 53: Datomic - Lidando com dados de maneira versionada

Múltiplos bancos

Page 54: Datomic - Lidando com dados de maneira versionada

(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"))

Page 55: Datomic - Lidando com dados de maneira versionada

Banco orientado a fatos

Page 56: Datomic - Lidando com dados de maneira versionada

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

Page 57: Datomic - Lidando com dados de maneira versionada

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

Page 58: Datomic - Lidando com dados de maneira versionada

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

Page 59: Datomic - Lidando com dados de maneira versionada

Arquitetura

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

Page 60: Datomic - Lidando com dados de maneira versionada

Serviço de "storage"

Page 61: Datomic - Lidando com dados de maneira versionada

Peers

Page 62: Datomic - Lidando com dados de maneira versionada

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

Page 63: Datomic - Lidando com dados de maneira versionada

API para Clojure e Java

Page 64: Datomic - Lidando com dados de maneira versionada

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

Page 65: Datomic - Lidando com dados de maneira versionada

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

Page 66: Datomic - Lidando com dados de maneira versionada

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

Page 67: Datomic - Lidando com dados de maneira versionada

REST API

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

Page 68: Datomic - Lidando com dados de maneira versionada

Transactor

Page 69: Datomic - Lidando com dados de maneira versionada

Responsável por toda escrita no banco de dados

Page 70: Datomic - Lidando com dados de maneira versionada

Notifica todos os PEERS sobre novos fatos.

Page 71: Datomic - Lidando com dados de maneira versionada

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

Page 72: Datomic - Lidando com dados de maneira versionada

ACID

Page 73: Datomic - Lidando com dados de maneira versionada

Atômico

Page 74: Datomic - Lidando com dados de maneira versionada

Transação

Page 75: Datomic - Lidando com dados de maneira versionada

Ou faz tudo, ou aborta

Page 76: Datomic - Lidando com dados de maneira versionada

Consistente

Page 77: Datomic - Lidando com dados de maneira versionada

Validação de tipos e NULL

Page 78: Datomic - Lidando com dados de maneira versionada

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

Page 79: Datomic - Lidando com dados de maneira versionada

Isolamento

Page 80: Datomic - Lidando com dados de maneira versionada

Uma escrita por vez

Page 81: Datomic - Lidando com dados de maneira versionada

Durável

Page 82: Datomic - Lidando com dados de maneira versionada

Só dá o OK depois de escrever no storage

Page 83: Datomic - Lidando com dados de maneira versionada

ACID

Page 84: Datomic - Lidando com dados de maneira versionada

Funções com regras de negócio

Page 85: Datomic - Lidando com dados de maneira versionada

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

Page 86: Datomic - Lidando com dados de maneira versionada

Escopo limitado / Banco filtrado

Page 87: Datomic - Lidando com dados de maneira versionada

Excision - Apagar dados de maneira definitiva

Page 88: Datomic - Lidando com dados de maneira versionada

Conclusão

Page 89: Datomic - Lidando com dados de maneira versionada

Dados são importantes

Page 90: Datomic - Lidando com dados de maneira versionada

Auditoria de informação

Page 91: Datomic - Lidando com dados de maneira versionada

Bancos históricos

Page 92: Datomic - Lidando com dados de maneira versionada

Facilidade de deploy

Page 93: Datomic - Lidando com dados de maneira versionada

OBRIGADO!

Estamos contratando!

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