DatomicLidando com dados de maneira versionada
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