Modelos Ricos
Um outro motivo para usar NoSQL




                                     Luciano Ramalho
                                             @luciano
                                  BIREME/OPAS/OMS
                           Academia Python/Globalcode
Modelo de dados LILACS


Visão
parcial!
Parte de um registro ISIS
Parte de um registro ISIS
Um contexto de uso
ISIS ainda é largamente utilizado em bibliotecas,
museus, arquivos públicos, escritórios de advocacia
BIREME/OPAS/OMS: convênio entre a Escola Paulista
de Medicina (Unifesp), Organização Panamericana da
Saúde e Ministério da Saúde do Brasil, com a missão
de organizar, indexar e disseminar a produção
científica da América Latina e do Caribe
BIREME usa ISIS há 25 anos, SOLR/Lucene há 5 anos
e CouchDB há alguns meses
A missão da nossa equipe

Renovar os métodos, práticas e as ferramentas de
desenvolvimento
Práticas ágeis
Ferramentas e métodos de trabalho Open Source
Primeiro passo: de PHP sem framework para Python
com Django
Projeto piloto
 OpenTrials
   sistema de registro de ensaios clínicos
     testes de medicamentos e procedimentos com
     seres humanos
 Registro Brasileiro de Ensaios Clínicos
   Financiado pelo Ministério da Saúde e OPAS
   Operado pela Fiocruz com suporte da BIREME
www.ensaiosclinicos.gov.br
Retrospectiva

No projeto piloto com Python e Django, optamos por
nã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ção
OpentTrials ficaria muito mais simples usando um
modelos de dados não normalizado
Onde a normalização
atrapalhou
Traduções: para alguns campos, precisamos ter o
texto em n línguas
Mas nunca vamos querer acessar estes campos fora
do contexto do resto do registro principal, eles são de
fato parte integrante e inseparável dele
Não queremos que eles possam ser atualizados
indendentemente do registro principal
Onde a normalização
atrapalhou 2
Vários campos repetitivos viraram tabelas auxiliares
Versionamento
  Quando um registro (ou registro auxiliar) é atualizado,
  o registro inteiro (e seus registros auxliares) precisam
  ser revalidados pelos revisores (para verificar
  inconsistências) e re-publicados
  Mas o histórico não pode ser perdido!
Onde a normalização
atrapalhou 3
Auditoria: precisamos saber sempre que qualquer
dado de um registro (ou registros auxiliares) foi alterado
Jamais um registro de uma tabela auxiliar pode ser
atualizado independente do registro principal
  Ex: o contato científico que foi registrado
  originalmente nunca poderá ser esquecido
  A descrição da metodologia de intervenção é como
  um contrato do pesquisador com a sociedade
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 a
  versão anterior
                                 Solução inspirada no
                                 CouchDB e no GIT!
Isto é um fóssil!
Lição aprendida


Persistência
   poliglota
Persistência poliglota

 Usar um BD relacional para aproveitar o seu
 conhecimento e ferramental existente
 Integrar um BD NoSQL apropriado assim que o
 modelo relacional deixa de ser parte da solução e
 começa a ser parte do problema
Referências: elas existem!




A palavra-chave é: semistructured (ou semi-structured)
Document databases
Bases de dados documentais
  ISIS é um exemplo antigo dessa categoria
Modelo de dados semiestruturado, parecido com
JSON (mais simples que XML)
O esquema é armazenado junto com cada registro
Exemplos modernos e Open Source:
  CouchDB e MongoDB
Para o OpenTrials/ReBEC
A melhor solução é o CouchDB
  Mas o MongoDB também seria apropriado, com
  todas as chaves de durabilidade ligadas
Motivo fundamental: MVCC (multi-version concurrency
control), garante que a aplicação não consegue
sobrescrever acidentalmente um registro
  Para fazer update, é obrigatório informar o hash da
  versão anterior, e assim provar que você não está
  fazendo uma atualização com dados vencidos
                                        sem saber
Minicurso gratuito em 1 de novembro, 19h00:
        OO sem Sotaque em Python




    http://python.globalcode.com.br

Modelos ricos

  • 1.
    Modelos Ricos Um outromotivo para usar NoSQL Luciano Ramalho @luciano BIREME/OPAS/OMS Academia Python/Globalcode
  • 7.
    Modelo de dadosLILACS Visão parcial!
  • 8.
    Parte de umregistro ISIS
  • 9.
    Parte de umregistro ISIS
  • 10.
    Um contexto deuso ISIS ainda é largamente utilizado em bibliotecas, museus, arquivos públicos, escritórios de advocacia BIREME/OPAS/OMS: convênio entre a Escola Paulista de Medicina (Unifesp), Organização Panamericana da Saúde e Ministério da Saúde do Brasil, com a missão de organizar, indexar e disseminar a produção científica da América Latina e do Caribe BIREME usa ISIS há 25 anos, SOLR/Lucene há 5 anos e CouchDB há alguns meses
  • 11.
    A missão danossa equipe Renovar os métodos, práticas e as ferramentas de desenvolvimento Práticas ágeis Ferramentas e métodos de trabalho Open Source Primeiro passo: de PHP sem framework para Python com Django
  • 12.
    Projeto piloto OpenTrials sistema de registro de ensaios clínicos testes de medicamentos e procedimentos com seres humanos Registro Brasileiro de Ensaios Clínicos Financiado pelo Ministério da Saúde e OPAS Operado pela Fiocruz com suporte da BIREME
  • 13.
  • 28.
    Retrospectiva No projeto pilotocom Python e Django, optamos por nã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ção OpentTrials ficaria muito mais simples usando um modelos de dados não normalizado
  • 30.
    Onde a normalização atrapalhou Traduções:para alguns campos, precisamos ter o texto em n línguas Mas nunca vamos querer acessar estes campos fora do contexto do resto do registro principal, eles são de fato parte integrante e inseparável dele Não queremos que eles possam ser atualizados indendentemente do registro principal
  • 31.
    Onde a normalização atrapalhou2 Vários campos repetitivos viraram tabelas auxiliares Versionamento Quando um registro (ou registro auxiliar) é atualizado, o registro inteiro (e seus registros auxliares) precisam ser revalidados pelos revisores (para verificar inconsistências) e re-publicados Mas o histórico não pode ser perdido!
  • 32.
    Onde a normalização atrapalhou3 Auditoria: precisamos saber sempre que qualquer dado de um registro (ou registros auxiliares) foi alterado Jamais um registro de uma tabela auxiliar pode ser atualizado independente do registro principal Ex: o contato científico que foi registrado originalmente nunca poderá ser esquecido A descrição da metodologia de intervenção é como um contrato do pesquisador com a sociedade
  • 33.
    Como resolvemos? Criamos umaapp 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 a versão anterior Solução inspirada no CouchDB e no GIT!
  • 34.
    Isto é umfóssil!
  • 35.
  • 36.
    Persistência poliglota Usarum BD relacional para aproveitar o seu conhecimento e ferramental existente Integrar um BD NoSQL apropriado assim que o modelo relacional deixa de ser parte da solução e começa a ser parte do problema
  • 37.
    Referências: elas existem! Apalavra-chave é: semistructured (ou semi-structured)
  • 40.
    Document databases Bases dedados documentais ISIS é um exemplo antigo dessa categoria Modelo de dados semiestruturado, parecido com JSON (mais simples que XML) O esquema é armazenado junto com cada registro Exemplos modernos e Open Source: CouchDB e MongoDB
  • 42.
    Para o OpenTrials/ReBEC Amelhor solução é o CouchDB Mas o MongoDB também seria apropriado, com todas as chaves de durabilidade ligadas Motivo fundamental: MVCC (multi-version concurrency control), garante que a aplicação não consegue sobrescrever acidentalmente um registro Para fazer update, é obrigatório informar o hash da versão anterior, e assim provar que você não está fazendo uma atualização com dados vencidos sem saber
  • 43.
    Minicurso gratuito em1 de novembro, 19h00: OO sem Sotaque em Python http://python.globalcode.com.br