SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ähnlich wie Brnosql luciano ramalho-modelosricos

SQLite: um motor de bases de dados relacional open source
SQLite: um motor de bases de dados relacional open sourceSQLite: um motor de bases de dados relacional open source
SQLite: um motor de bases de dados relacional open sourceLuis Borges Gouveia
 
Tecnologias para bibliotecas
Tecnologias para bibliotecasTecnologias para bibliotecas
Tecnologias para bibliotecasAnderson Santana
 
Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...
Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...
Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...josekarvalho
 
O digital, a sustentabilidade e a viagem do open source ao open data
O digital, a sustentabilidade e a viagem do open source ao open dataO digital, a sustentabilidade e a viagem do open source ao open data
O digital, a sustentabilidade e a viagem do open source ao open dataLuis Borges Gouveia
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011Evaldo Junior
 
PHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraPHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraKleber Silva
 
Sistemas de informação Open Source: reflexões críticas e casos de uso
Sistemas de informação Open Source: reflexões críticas e casos de usoSistemas de informação Open Source: reflexões críticas e casos de uso
Sistemas de informação Open Source: reflexões críticas e casos de usoPedro Príncipe
 
Git e a importância de versionar um projeto
 Git e a importância de versionar um projeto Git e a importância de versionar um projeto
Git e a importância de versionar um projetoGuilherme Farias
 
Web Semântica: Conceitos e Tecnologias
Web Semântica: Conceitos e TecnologiasWeb Semântica: Conceitos e Tecnologias
Web Semântica: Conceitos e Tecnologiassergiocrespo
 
Arquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudarArquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudarBetter Developer
 

Ähnlich wie Brnosql luciano ramalho-modelosricos (20)

Pesquisa Reproduzivel
Pesquisa ReproduzivelPesquisa Reproduzivel
Pesquisa Reproduzivel
 
Gestão de dados de investigação da recolha até ao depósito: Uma abordagem bas...
Gestão de dados de investigação da recolha até ao depósito: Uma abordagem bas...Gestão de dados de investigação da recolha até ao depósito: Uma abordagem bas...
Gestão de dados de investigação da recolha até ao depósito: Uma abordagem bas...
 
SQLite: um motor de bases de dados relacional open source
SQLite: um motor de bases de dados relacional open sourceSQLite: um motor de bases de dados relacional open source
SQLite: um motor de bases de dados relacional open source
 
Oficina 5 confoa 2013 - Boas práticas para a construção de repositórios ins...
Oficina 5   confoa 2013 - Boas práticas para a construção de repositórios ins...Oficina 5   confoa 2013 - Boas práticas para a construção de repositórios ins...
Oficina 5 confoa 2013 - Boas práticas para a construção de repositórios ins...
 
Tecnologias para bibliotecas
Tecnologias para bibliotecasTecnologias para bibliotecas
Tecnologias para bibliotecas
 
Repositorios
RepositoriosRepositorios
Repositorios
 
Repositorios
RepositoriosRepositorios
Repositorios
 
Workshop - Repositórios Integrados
Workshop - Repositórios IntegradosWorkshop - Repositórios Integrados
Workshop - Repositórios Integrados
 
Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...
Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...
Interoperabilidade, Normas, Diretrizes e Qualidade dos Repositórios - José ca...
 
O digital, a sustentabilidade e a viagem do open source ao open data
O digital, a sustentabilidade e a viagem do open source ao open dataO digital, a sustentabilidade e a viagem do open source ao open data
O digital, a sustentabilidade e a viagem do open source ao open data
 
A visibilidade no Google Scholar dos repositórios digitais de Acesso Aberto b...
A visibilidade no Google Scholar dos repositórios digitais de Acesso Aberto b...A visibilidade no Google Scholar dos repositórios digitais de Acesso Aberto b...
A visibilidade no Google Scholar dos repositórios digitais de Acesso Aberto b...
 
Big Data, JVM e Redes Sociais
Big Data, JVM e Redes SociaisBig Data, JVM e Redes Sociais
Big Data, JVM e Redes Sociais
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
 
PHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e SeguraPHP 5 de Forma Correta e Segura
PHP 5 de Forma Correta e Segura
 
Diretrizes OpenAire para repositorios
Diretrizes OpenAire para repositorios Diretrizes OpenAire para repositorios
Diretrizes OpenAire para repositorios
 
Sistemas de informação Open Source: reflexões críticas e casos de uso
Sistemas de informação Open Source: reflexões críticas e casos de usoSistemas de informação Open Source: reflexões críticas e casos de uso
Sistemas de informação Open Source: reflexões críticas e casos de uso
 
Git e a importância de versionar um projeto
 Git e a importância de versionar um projeto Git e a importância de versionar um projeto
Git e a importância de versionar um projeto
 
Web Semântica: Conceitos e Tecnologias
Web Semântica: Conceitos e TecnologiasWeb Semântica: Conceitos e Tecnologias
Web Semântica: Conceitos e Tecnologias
 
Arquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudarArquitetura em camadas em python e quanto isso pode ajudar
Arquitetura em camadas em python e quanto isso pode ajudar
 
Banco de dados_orientado_a_objetos
Banco de dados_orientado_a_objetosBanco de dados_orientado_a_objetos
Banco de dados_orientado_a_objetos
 

Mehr von Jean Lopes

Python - Guia de bolso
Python - Guia de bolsoPython - Guia de bolso
Python - Guia de bolsoJean Lopes
 
K19 k03-sql-e-modelo-relacional
K19 k03-sql-e-modelo-relacionalK19 k03-sql-e-modelo-relacional
K19 k03-sql-e-modelo-relacionalJean Lopes
 
Computacao grafica python v2
Computacao grafica python v2Computacao grafica python v2
Computacao grafica python v2Jean Lopes
 
Cientista da computacao usando python
Cientista da computacao usando pythonCientista da computacao usando python
Cientista da computacao usando pythonJean Lopes
 
Aprendendo python
Aprendendo pythonAprendendo python
Aprendendo pythonJean Lopes
 
What is node_js
What is node_jsWhat is node_js
What is node_jsJean Lopes
 
Guia de referência rápida css
Guia de referência rápida cssGuia de referência rápida css
Guia de referência rápida cssJean Lopes
 
Jquery 38book-pt-br
Jquery 38book-pt-brJquery 38book-pt-br
Jquery 38book-pt-brJean Lopes
 

Mehr von Jean Lopes (9)

Python - Guia de bolso
Python - Guia de bolsoPython - Guia de bolso
Python - Guia de bolso
 
K19 k03-sql-e-modelo-relacional
K19 k03-sql-e-modelo-relacionalK19 k03-sql-e-modelo-relacional
K19 k03-sql-e-modelo-relacional
 
Computacao grafica python v2
Computacao grafica python v2Computacao grafica python v2
Computacao grafica python v2
 
Cientista da computacao usando python
Cientista da computacao usando pythonCientista da computacao usando python
Cientista da computacao usando python
 
Aprendendo python
Aprendendo pythonAprendendo python
Aprendendo python
 
What is node_js
What is node_jsWhat is node_js
What is node_js
 
Guia de referência rápida css
Guia de referência rápida cssGuia de referência rápida css
Guia de referência rápida css
 
Jquery 38book-pt-br
Jquery 38book-pt-brJquery 38book-pt-br
Jquery 38book-pt-br
 
Flask docs
Flask docsFlask docs
Flask docs
 

Brnosql luciano ramalho-modelosricos

  • 1. Modelos Ricos Um outro motivo para usar NoSQL Luciano Ramalho @luciano BIREME/OPAS/OMS Academia Python/Globalcode
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7. Modelo de dados LILACS Visão parcial!
  • 8. Parte de um registro ISIS
  • 9. Parte de um registro ISIS
  • 10. 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
  • 11. 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
  • 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
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28. 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
  • 29.
  • 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 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!
  • 32. 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
  • 33. 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!
  • 34. Isto é um fóssil!
  • 36. 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
  • 37. Referências: elas existem! A palavra-chave é: semistructured (ou semi-structured)
  • 38.
  • 39.
  • 40. 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
  • 41.
  • 42. 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
  • 43. Minicurso gratuito em 1 de novembro, 19h00: OO sem Sotaque em Python http://python.globalcode.com.br