43
Modelos Ricos Um outro motivo para usar NoSQL Luciano Ramalho @luciano BIREME/OPAS/OMS Academia Python/Globalcode

Brnosql luciano ramalho-modelosricos

Embed Size (px)

Citation preview

Page 1: Brnosql luciano ramalho-modelosricos

Modelos RicosUm outro motivo para usar NoSQL

Luciano Ramalho@luciano

BIREME/OPAS/OMSAcademia Python/Globalcode

Page 2: Brnosql luciano ramalho-modelosricos
Page 3: Brnosql luciano ramalho-modelosricos
Page 4: Brnosql luciano ramalho-modelosricos
Page 5: Brnosql luciano ramalho-modelosricos
Page 6: Brnosql luciano ramalho-modelosricos
Page 7: Brnosql luciano ramalho-modelosricos

Modelo de dados LILACS

Visãoparcial!

Page 8: Brnosql luciano ramalho-modelosricos

Parte de um registro ISIS

Page 9: Brnosql luciano ramalho-modelosricos

Parte de um registro ISIS

Page 10: Brnosql luciano ramalho-modelosricos

Um contexto de usoISIS ainda é largamente utilizado em bibliotecas,museus, arquivos públicos, escritórios de advocacia

BIREME/OPAS/OMS: convênio entre a Escola Paulistade Medicina (Unifesp), Organização Panamericana daSaúde e Ministério da Saúde do Brasil, com a missãode organizar, indexar e disseminar a produçãocientífica da América Latina e do Caribe

BIREME usa ISIS há 25 anos, SOLR/Lucene há 5 anose CouchDB há alguns meses

Page 11: Brnosql luciano ramalho-modelosricos

A missão da nossa equipe

Renovar os métodos, práticas e as ferramentas dedesenvolvimento

Práticas ágeis

Ferramentas e métodos de trabalho Open Source

Primeiro passo: de PHP sem framework para Pythoncom Django

Page 12: Brnosql luciano ramalho-modelosricos

Projeto pilotoOpenTrials

sistema de registro de ensaios clínicos

testes de medicamentos e procedimentos comseres humanos

Registro Brasileiro de Ensaios Clínicos

Financiado pelo Ministério da Saúde e OPAS

Operado pela Fiocruz com suporte da BIREME

Page 13: Brnosql luciano ramalho-modelosricos

www.ensaiosclinicos.gov.br

Page 14: Brnosql luciano ramalho-modelosricos
Page 15: Brnosql luciano ramalho-modelosricos
Page 16: Brnosql luciano ramalho-modelosricos
Page 17: Brnosql luciano ramalho-modelosricos
Page 18: Brnosql luciano ramalho-modelosricos
Page 19: Brnosql luciano ramalho-modelosricos
Page 20: Brnosql luciano ramalho-modelosricos
Page 21: Brnosql luciano ramalho-modelosricos
Page 22: Brnosql luciano ramalho-modelosricos
Page 23: Brnosql luciano ramalho-modelosricos
Page 24: Brnosql luciano ramalho-modelosricos
Page 25: Brnosql luciano ramalho-modelosricos
Page 26: Brnosql luciano ramalho-modelosricos
Page 27: Brnosql luciano ramalho-modelosricos
Page 28: Brnosql luciano ramalho-modelosricos

Retrospectiva

No projeto piloto com Python e Django, optamos pornão inovar no banco de dados, usamos MySQL, que jáera conhecido da instituição

O ReBEC está em produção desde 2010

Ganhamos um ótimo contra-exemplo: a aplicaçãoOpentTrials ficaria muito mais simples usando ummodelos de dados não normalizado

Page 29: Brnosql luciano ramalho-modelosricos
Page 30: Brnosql luciano ramalho-modelosricos

Onde a normalizaçãoatrapalhou

Traduções: para alguns campos, precisamos ter otexto em n línguas

Mas nunca vamos querer acessar estes campos forado contexto do resto do registro principal, eles são defato parte integrante e inseparável dele

Não queremos que eles possam ser atualizadosindendentemente do registro principal

Page 31: Brnosql luciano ramalho-modelosricos

Onde a normalizaçãoatrapalhou 2

Vários campos repetitivos viraram tabelas auxiliares

Versionamento

Quando um registro (ou registro auxiliar) éatualizado, o registro inteiro (e seus registrosauxliares) precisam ser revalidados pelos revisores(para verificar inconsistências) e re-publicados

Mas o histórico não pode ser perdido!

Page 32: Brnosql luciano ramalho-modelosricos

Onde a normalizaçãoatrapalhou 3

Auditoria: precisamos saber sempre que qualquerdado de um registro (ou registros auxiliares) foi alterado

Jamais um registro de uma tabela auxiliar pode seratualizado independente do registro principal

Ex: o contato científico que foi registradooriginalmente nunca poderá ser esquecido

A descrição da metodologia de intervenção é comoum contrato do pesquisador com a sociedade

Page 33: Brnosql luciano ramalho-modelosricos

Como resolvemos?Criamos uma app chamada django-fossil (no Github)

O django-fossil cria um fósil de cada registro publicado

Um fóssil é um registro desnormalizado,“petrificado”, imutável

Usa como chave primária uma assinatura digital(hash) do conteúdo

Tem uma chave estrangeira que aponta para aversão anterior

Solução inspirada noCouchDB e no GIT!

Page 34: Brnosql luciano ramalho-modelosricos

Isto é um fóssil!

Page 35: Brnosql luciano ramalho-modelosricos

Lição aprendida

Persistênciapoliglota

Page 36: Brnosql luciano ramalho-modelosricos

Persistência poliglota

Usar um BD relacional para aproveitar o seuconhecimento e ferramental existente

Integrar um BD NoSQL apropriado assim que omodelo relacional deixa de ser parte da solução ecomeça a ser parte do problema

Page 37: Brnosql luciano ramalho-modelosricos

Referências: elas existem!

A palavra-chave é: semistructured (ou semi-structured)

Page 38: Brnosql luciano ramalho-modelosricos
Page 39: Brnosql luciano ramalho-modelosricos
Page 40: Brnosql luciano ramalho-modelosricos

Document databases

Bases de dados documentais

ISIS é um exemplo antigo dessa categoria

Modelo de dados semiestruturado, parecido comJSON (mais simples que XML)

O esquema é armazenado junto com cada registro

Exemplos modernos e Open Source:

CouchDB e MongoDB

Page 41: Brnosql luciano ramalho-modelosricos
Page 42: Brnosql luciano ramalho-modelosricos

Para o OpenTrials/ReBECA melhor solução é o CouchDB

Mas o MongoDB também seria apropriado, comtodas as chaves de durabilidade ligadas

Motivo fundamental: MVCC (multi-version concurrencycontrol), garante que a aplicação não conseguesobrescrever acidentalmente um registro

Para fazer update, é obrigatório informar o hash daversão anterior, e assim provar que você não estáfazendo uma atualização com dados vencidos sem saber

Page 43: Brnosql luciano ramalho-modelosricos

http://python.globalcode.com.br

Minicurso gratuito em 1 de novembro, 19h00:OO sem Sotaque em Python