U NIVERSIDADE F EDERAL DE G OIÁS I NSTITUTO DE I NFORMÁTICA B EATRIZ P ROTO M ARTINS Persistência de dados clínicos baseados no openEHR: uma abordagem orientada por recursos limitados Goiânia 2016 B EATRIZ P ROTO M ARTINS Persistência de dados clínicos baseados no openEHR: uma abordagem orientada por recursos limitados Dissertação apresentada ao Programa de Pós–Graduação do Instituto de Informática da Universidade Federal de Goiás, como requisito parcial para obtenção do título de Mestre em Ciência da Computação. Área de concentração: Ciência da Computação. Orientador: Prof. Plínio de Sá Leitão Júnior Co-Orientador: Prof. Fábio Nogueira de Lucena Goiânia 2016 Ficha de identificação da obra elaborada pelo autor, através do Programa de Geração Automática do Sistema de Bibliotecas da UFG. Proto Martins, Beatriz Persistência de dados clínicos baseados no openEHR: uma abordagem orientada por recursos limitados [manuscrito] / Beatriz Proto Martins. - 2016. CVI, 106 f.: il. Orientador: Prof. Dr. Plínio de Sá Leitão Júnior; co-orientador Dr. Fábio Nogueira de Lucena. Dissertação (Mestrado) - Universidade Federal de Goiás, Instituto de Informática (INF), Programa de Pós-Graduação em Ciência da Computação, Goiânia, 2016. Bibliografia. Apêndice. Inclui lista de figuras, lista de tabelas. 1. Armazenamento e Recuperação de Informação. 2. Registro Eletrônico de Saúde. 3. Sistemas de Informação em Saúde. 4. Modelagem Multinível. I. de Sá Leitão Júnior, Plínio, orient. II. Título. CDU 004 Todos os direitos reservados. É proibida a reprodução total ou parcial do trabalho sem autorização da universidade, do autor e do orientador(a). Beatriz Proto Martins Graduou–se em Ciência da Computação pela UFG - Universidade Federal de Goiás. Durante sua graduação foi estagiária em Suporte Técnico, monitora de Banco de Dados e publicou vários artigos na área de Teste de Software. Atualmente é Desenvolvedora de Software com foco na geração de relatórios baseados em consultas SQL. Agradecimentos Ao meu orientador, Plínio, e meu co-orientador, Fábio, por toda dedicação e suporte. À Coordenação de Aperfeiçoamento de Pessoal de Nível Superior (CAPES) pela bolsa de estudos concedida. Resumo Martins, Beatriz Proto. Persistência de dados clínicos baseados no openEHR: uma abordagem orientada por recursos limitados. Goiânia, 2016. 106p. Dissertação de Mestrado. Instituto de Informática, Universidade Federal de Goiás. Motivação: Registros Eletrônicos em Saúde contém dados clínicos e estão presentes em Sistemas de Informação em Saúde. Neste cenário, a especificação do openEHR define a estrutura dos registros para permitir que os sistemas sejam interoperáveis, isto é, tenham um entendimento comum sobre os dados trocados. Os registros compreendem dados modelados conforme conceitos de domínio em saúde, chamados arquétipos (nível de conhecimento). Um arquétipo, por sua vez, é composto por um subconjunto de entidades fixas do Modelo de Referência (nível de informação). Devido ao detalhamento necessário, a estrutura definida pode ser altamente granular. Deste modo, a persistência dos registros com o mesmo formato empregado durante a troca pode ser prejudicada em termos de desempenho, principalmente em dispositivos com considerável limitação de recursos. Método: Este trabalho apresenta uma estratégia que serve de referência para o armazenamento e recuperação de dados clínicos baseados no openEHR. Tendo em vista a limitação de recursos, serviços em saúde podem persistir seus registros em um formato otimizado em relação ao formato empregado para troca. Para isso, cada serviço deve aplicar uma estratégia de empacotamento e desempacotamento de dados que efetue a conversão entre ambos os formatos. Resultados: A estratégia de persistência apresentada emprega regras de mapeamento entre o grafo de objetos do Modelo de Referência e um vetor de dados serializados. As regras englobam desde tipos de dados primitivos, como um inteiro, até tipos complexos, como um hashmap composto por objetos de tipos e tamanhos variáveis. Conclusões: A estratégia foi projetada considerando a redução de espaço ocupado em memória, mas sem inviabilizar o tempo de processamento. Estudos devem ser realizados com a implementação e experimentação da estratégia. Palavras–chave Armazenamento e Recuperação de Informação, Registro Eletrônico de Saúde, Sistemas de Informação em Saúde, Modelagem Multinível Abstract Martins, Beatriz Proto. Persistence of clinical data based on openEHR: an approach oriented by limited resources. Goiânia, 2016. 106p. MSc. Dissertation. Instituto de Informática, Universidade Federal de Goiás. Motivation: Electronic Health Records contain clinical data and are found in Health Information Systems. In this scenario, openEHR specification defines the record structure to allow systems to be interoperable, that is, to have a common understanding over exchanged data. A record comprises data modeled according to health domain concepts, called archetypes (knowledge level). An archetype, in turn, is composed by a subset of fixed entities from the Reference Model (information level). Due to the required detailing, the defined structure can be highly granular. Thus, the persistence of records, with the same format used during data exchange, can be hampered in terms of performance, especially in devices with a considerable resource limitation. Method: This work presents a strategy that serves as reference for the storage and retrieval of clinical data based on openEHR. Considering resources limitation, health services can persist their records in an optimized format, different from the format used for exchange. In this way, each service must implement a strategy for packing and unpacking that makes the conversions between both formats. Results: The persistence strategy presented in this work employs mapping rules between the objects graph of the Reference Model and a serialized data array. The rules range from primitive data types, such as an integer, to complex types, such as a hashmap consisting of objects with variable types and sizes. Conclusions: The strategy was designed considering the reduction of memory space occupied, but without turning the processing time unfeasible. Studies should be carried out for the strategy implementation and its experimentation. Keywords Information Storage and Retrieval, Electronic Health Records, Health Information Systems, Multilevel Modeling Sumário Lista de Figuras 11 Lista de Tabelas 12 Lista de Algoritmos 14 1 15 15 16 17 17 18 Introdução 1.1 1.2 1.3 1.4 1.5 2 Fundamentação teórica 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3 Contexto Problema Justificativa Objetivos Organização do trabalho RESs e a abordagem multinível Padrões internacionais Contexto brasileiro Plataforma openEHR Limitação de recursos Serialização e desserialização de dados Considerações Finais Revisão Bibliográfica 3.1 3.2 3.3 3.4 Formulação da questão 3.1.1 Problema 3.1.2 Questões 3.1.3 Intervenção, palavras-chave e sinônimos 3.1.4 Outros tópicos Seleção de fontes Seleção de estudos 3.3.1 Critérios de seleção 3.3.2 Procedimentos para seleção de estudos 3.3.3 Seleção de estudos iniciais Extração de informação 3.4.1 Definição de critérios para inclusão de informação 3.4.2 Formulários de extração de dados 3.4.3 Extração de resultados em tabelas 3.4.4 Critério CI-1 (requisitos) 3.4.5 Critério CI-2 (mapeamento) 19 19 21 22 22 24 26 27 28 28 28 28 29 29 30 31 31 31 32 33 33 33 37 38 38 3.5 3.6 3.7 4 4.2 4.3 4.4 3.4.8 Critério CI-5 (avaliação) Sumarização dos resultados 3.5.1 Cálculos estatísticos 3.5.2 Análise sensitiva 3.5.3 Plotagem Respostas às questões de pesquisa Considerações Finais Visão Geral 4.1.1 Requisitos para a persistência de dados 4.1.2 Estratégia de persistência Especificação da estratégia 4.2.1 Formato da estrutura de persistência 4.2.2 Estrutura geral para a codificação de um registro clínico 4.2.3 Mapeamento das classes do MR Regras de mapeamento das estruturas de dados 4.3.1 Identificadores de tipo de classe 4.3.2 Separação entre atributos de tamanho fixo e variável 4.3.3 Área de metadados 4.3.4 Codificação da cardinalidade de coleções e Strings 4.3.5 Concatenação de atributos Considerações finais Algoritmos de persistência 5.1 5.2 5.3 5.4 5.5 5.6 6 Critério CI-3 (implementações) Critério CI-4 (benchmarks) Mapeamento de Dados Clínicos para Persistência 4.1 5 3.4.6 3.4.7 Funções auxiliares Serialização de dados Desserialização de dados Desempenho dos algoritmos de persistência Estratégia de persistência exemplificada Considerações finais Conclusão 6.1 6.2 Comparação com trabalhos correlatos Trabalhos futuros 43 44 48 48 48 49 50 50 51 52 52 52 53 54 54 54 55 56 56 57 58 58 59 59 61 61 62 67 70 72 73 75 75 77 Referências Bibliográficas 78 A Artigos incluídos 84 B Mapeamento das classes do MR 87 Lista de Figuras 2.1 Exemplo de modelo multinível em que as camadas de nível mais baixo podem ser utilizadas por camadas de nível superior. Meta-arquitetura de arquétipos[8] Parte do pacote de tipos de dados do MR (restrito a quantidades)[45]. Estrutura de um RES[28]. Formato BSON para serialização de dados[41]. 20 23 24 25 26 Quantidades de estudos que abordam cada critério de inclusão na segunda fase de seleção de um total de 22 estudos (considerando interseções). 50 4.1 Classes do MR mapeadas para o esquema de dados desenvolvido. 56 5.1 Exemplo de execução do algoritmo de serialização, com uma raiz composta por uma String de tamanho 2. Pacote rm.data_types.text versão 1.0.3[45]. Exemplo da estratégia de persistência aplicada ao pacote data_types.text do MR com a raiz e um objeto que a compõe. Exemplo da estratégia de persistência aplicada sobre um objeto composto por atributos de tamanho fixo e variável. 2.2 2.3 2.4 2.5 3.1 5.2 5.3 5.4 65 72 73 74 Lista de Tabelas 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.1 String de busca aplicada nas fontes bibliográficas. String de busca aplicada na fonte Google Scholar. Critérios para inclusão de estudos. Critérios para exclusão de estudos. Resultados da primeira fase de seleção de estudos. Resultados da primeira fase de seleção de estudos da fonte Google Scholar Formulário para extração de informações estruturadas relacionadas à persistência de dados no desenvolvimento de sistemas em saúde multiníveis (CI-1). Formulário para extração de informações estruturadas relacionadas ao mapeamento de modelos conceituais em saúde multiníveis para modelos de dados lógicos ou físicos (CI-2). Formulário para extração de informações estruturadas relacionadas à descrição da camada ou serviço de persistência de dados em SISs com modelagem multinível (CI-3). Formulário para extração de informações estruturadas relacionadas à descrição de benchmarks para SISs com modelagem multinível (CI-4). Formulário para extração de informações estruturadas relacionadas à avaliação da camada ou serviço de persistência de dados presentes em SISs com modelagem multinível (CI-5). Exemplos de preenchimento do formulário da primeira fase de seleção. Estudos que apresentam requisitos diretamente relacionados à persistência de dados para o desenvolvimento de sistemas em saúde multiníveis (CI-1). Estudos que descrevem o mapeamento de modelos conceituais em saúde multiníveis para modelos de dados lógicos ou físicos (CI-2). Estudos que descrevem a camada ou serviço de persistência de dados em SISs com modelagem multinível (CI-3). Estudos que descrevem benchmarks para SISs com modelagem multinível (CI-4). Estudos que avaliam a camada ou serviço de persistência de dados presentes em SISs com modelagem multinível (CI-5). Quantidades de estudos por CI/CE na segunda fase de seleção de estudos. Quantidade de estudos por CI/CE na segunda fase de seleção da fonte Google Scholar Exemplo de codificação de trecho do vetor: tipo p do objeto, um booleano b e uma lista L com t elementos. 30 31 31 31 32 33 34 35 35 36 36 37 39 40 41 45 46 49 49 57 4.2 Exemplo de codificação de trecho do vetor: tipo p do objeto, cardinalidade n da lista L, tipo t de cada elemento da lista, um inteiro i e uma lista L com n elementos. 4.3 Codificação de tamanho de atributos de tamanho variável. 58 59 6.1 Adição da contribuição do trabalho atual à Tabela 3.14. 76 A.1 Artigos incluídos na revisão sistemática 84 B.1 Planilha com o mapeamento das classes do MR 87 Lista de Algoritmos 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 serializaObjeto(o) grupo(p) serializaPrimitivo(a) vetorTamanho(t) serializaColecao(C) desserializaObjeto(V, j) desserializaPrimitivo(V, j, p) recuperaTamanho(V, j) desserializaColecao(V, j, p) 62 63 64 65 66 67 68 69 70 CAPÍTULO 1 Introdução Na Seção 1.1 é descrito o contexto deste trabalho relativo aos sistemas e registros em saúde, cujos dados são modelados conforme o openEHR. Em seguida, na Seção 1.2 é relatado o problema desta pesquisa, o qual se baseia na complexidade existente para se armazenar e recuperar dados. Na Seção 1.3 são apresentadas as justificativas para se desenvolver uma estratégia de persistência otimizada, relacionando-a com as estratégias de trabalhos correlatos. Por fim, na Seção 1.4 são citados os objetivos com respeito á estratégia de persistência. 1.1 Contexto A cada mês cerca de mil serviços em saúde são cadastrados no Ministério da Saúde do Brasil (em junho de 2015 haviam 275 mil cadastros, já em novembro de 2016 foram registrados 297 mil serviços) [13]. Cada estabelecimento pode possuir um Sistema de Informação em Saúde (SIS) diferente e armazenar uma grande quantidade de Registros Eletrônicos em Saúde (RESs) contendo dados de pacientes. Durante o mês de setembro de 2016, por exemplo, foram registrados cerca de 860 mil procedimentos hospitalares de internação [53] no Sistema Único de Saúde (SUS). Geralmente, os conceitos de domínio em saúde são codificados diretamente nos modelos de bancos de dados, isso faz com que haja uma alta complexidade para que os sistemas sejam alterados e estendidos. Percebe-se, também, uma dificuldade notável em definir um vasto número de entidades e em possibilitar a interoperabilidade entre os sistemas em saúde [7]. Para proporcionar interoperabilidade aos sistemas e, consequentemente, permitir a troca de RESs entre diferentes SISs, ou mesmo para possibilitar a extração de informação, é preciso conhecer a sintaxe e a semântica dos dados armazenados. Isto pode ser alcançado através da padronização da definição dos dados. Deste modo a temperatura corpórea de um paciente, por exemplo, pode ser facilmente identificada em meio a um conjunto de dados, por qualquer outro SIS que conheça o padrão empregado. 1.2 Problema 16 Através da norma CEN/ISO EN13606:2008, o Comitê Europeu recomenda meios para que seja alcançada a interoperabilidade semântica na comunicação de sistemas em saúde. Isso deve ser feito através de uma arquitetura de informação estável e rigorosa e um repositório de dados centralizado. A CEN/ISO EN13606 descreve uma arquitetura de Modelo Dual para registros clínicos que separa o conhecimento clínico da informação que o representa. Esta arquitetura favorece a interoperabilidade de SISs e a redução da complexidade para alterar e estender tais sistemas[19]. A plataforma openEHR é mundialmente conhecida e abordada em diversas pesquisas, tais como em Freire et al. (2016)[24], Wang et al. (2015)[55], Sundvall et al. (2013)[52] e Muirhead (2009)[42]. O openEHR é responsável por fornecer uma ampla especificação [26] que orienta a definição de RESs, além de inspirar a definição da norma CEN/ISO EN13606:2008. Esta especificação inclui a modelagem multinível dos dados, mais especificamente a modelagem de dois níveis, onde há a separação entre informação e conhecimento, conforme ressaltado. Nesta abordagem dual, os dados são modelados conforme entidades que representam o conhecimento, chamadas “arquétipos”. Os arquétipos são definidos a partir dos conceitos presentes no MR, o qual compreende um conjunto de entidades genéricas de informação[8]. Assim, o valor da temperatura corpórea, dada como exemplo, é representado pela estrutura de dados correspondente ao arquétipo de temperatura, presente na base de arquétipos de referência. O arquétipo de temperatura, por sua vez, pode abranger um tipo de dado de quantidade do MR para acomodar o valor da temperatura. 1.2 Problema A persistência dos dados (armazenamento e recuperação) modelados conforme o openEHR é realizada a partir do mapeamento da estrutura utilizada para troca. Entretanto, o mapeamento objeto-relacional é altamente granular e pode gerar prejuízos para o desempenho da persistência. A interoperabilidade, por outro lado, não requer que os sistemas utilizem o mesmo formato de definição para realizar a persistência dos dados. Portanto, cada sistema pode ter uma estratégia diferente para realizar o armazenamento e recuperação de dados. O problema pertinente a esta pesquisa está focado no aspecto crítico das operações de sistemas em saúde, em que a persistência de dados é um dos elementos de impacto. Assim, é necessário explorar uma estratégia de persistência que considere critérios de eficiência e eficácia e sirva de referência para a implementação de sistemas em saúde baseados no openEHR. 1.3 Justificativa 1.3 17 Justificativa Para que os sistemas sejam interoperáveis, é preciso que haja uma padronização na comunicação e na definição dos RESs. Por isso, a maioria dos trabalhos relacionados ao tema abordam os aspectos semânticos dos dados clínicos, tais como integração de arquétipos com mapeamento de terminologias[18][47] e troca de mensagens estruturadas [39][31]. Por outro lado, a persistência de dados impacta diretamente no desempenho das funcionalidades do SIS que requisitam acesso aos RESs. A complexidade da persistência de dados modelados conforme o openEHR é influenciada pelas classes do MR e por suas associações, similar a qualquer sistema orientado a objetos. Assim, os principais desafios centram-se em realizar o mapeamento objeto-relacional e, ao mesmo tempo, assegurar que o desempenho, dentre outros requisitos não funcionais, seja satisfeito. Além disso, deve-se reduzir o longo tempo de acesso ao disco, causado pela granularidade elevada do modelo[5]. Apesar de não haver uma implementação de referência para a persistência em si, o openEHR recomenda o uso da estratégia Node+Path[6] para a realização da persistência de dados. Nesta estratégia é armazenado o caminho de cada objeto binário grande (blob) e o respectivo conteúdo do nó em uma tabela de duas colunas. Contudo, o custo de memória, a velocidade de parsing e comparação de cada caminho pode ocasionar um gargalo na recuperação dos dados, já que são armazenados todos os caminhos dos objetos. Algumas soluções exploram o desenvolvimento da camada de persistência com critérios de desempenho[29][54][35], mas não consideram as especificidades do openEHR para projetar uma camada de persistência otimizada. Já Wang et al. (2015)[55] realiza o mapeamento objeto-relacional de arquétipos, todavia essa solução requer que os arquétipos sejam previamente conhecidos. Outros estudos realizam o mapeamento de classes do MR para tabelas de bancos de dados com o uso, por exemplo, da ferramenta Hibernate[21][12][50], sem a orientação para critérios de desempenho. 1.4 Objetivos Ao longo desta dissertação, espera-se alcançar os seguintes objetivos gerais e específicos, relacionados ao projeto, desenvolvimento e avaliação de uma camada de persistência para sistemas baseados na modelagem multinível: 1. Definir formatos de estruturas para persistência de dados baseados nas especificações do openEHR. 1.1. Detalhar a especificação sintática utilizada na formatação dos dados; 1.5 Organização do trabalho 18 1.2. Definir regras de mapeamento de tipos de dados básicos e complexos baseados no MR para um modelo lógico de persistência. 2. Desenvolver uma estratégia de persistência para ser empregada como referência por camadas de persistência. 2.1. Definir um esquema de dados de referência, baseado na especificação do openEHR e orientado pela limitação de espaço em memória; 2.2. Descrever algoritmos para a serialização e desserialização de dados que empregue o esquema proposto. 1.5 Organização do trabalho O restante deste trabalho está organizado do seguinte modo: no Capítulo 2 é dada a fundamentação teórica relativa aos registros em saúde baseados no openEHR e às motivações deste trabalho sobre a atual limitação de recursos e a persistência de dados. Em sequência, no Capítulo 3 é realizada a revisão sistemática do estado da arte referente à persistência de dados modelados conforme o openEHR. No Capítulo 4, são exploradas as regras de mapeamento do modelo de objetos para o modelo lógico, de acordo com o objetivo 1. Já no Capítulo 5 é abordada a prova de conceito das regras de mapeamento através do desenvolvimento da estratégia de serialização e desserialização, conforme o objetivo 2. Por último, no Capítulo 6 são dadas as conclusões sobre os objetivos alcançados e expectativas de trabalhos futuros. CAPÍTULO 2 Fundamentação teórica Neste capítulo é apresentada, na Seção 2.1, a abordagem multinível empregada pelo openEHR na modelagem de dados clínicos e sua relação com normas internacionais, na Seção 2.2, e nacionais, na Seção 2.3. A plataforma openEHR é abordada na Seção 2.4. Já na Seção 2.5 é feita uma investigação sobre a limitação de infraestruturas físicas. Por fim, na Seção 2.6 são explorados alguns mecanismos para persistência que empregam a serialização de dados. A revisão sobre a persistência aplicada a dados clínicos baseados no openEHR será abordada no Capítulo 3. 2.1 RESs e a abordagem multinível Os Registros Eletrônicos em Saúde (ou RESs) são responsáveis por armazenar dados clínicos de pacientes. Conforme o relatório da IOM[17], um sistema RES (S-RES) é definido como um conjunto de componentes que possibilita que registros de pacientes sejam criados, usados, armazenados e recuperados. O sistema é localizado num ambiente que inclui pessoas, dados, regras e procedimentos, dispositivos de armazenamento e de processamento e meios de suporte e de comunicação. Normalmente os dados de um paciente são espalhados por vários RESs. Porém, é crucial o compartilhamento de RESs de forma segura, isto é, com uma comunicação que respeite a privacidade de cada paciente. Além disso, o compartilhamento deve ser significativo, isto é, os sistemas devem ter um entendimento comum do conteúdo trocado (interoperabilidade semântica) [38]. Em muitos SISs, os conceitos de domínio são codificados diretamente nos modelos de bancos de dados (BD)[7]. O conhecimento clínico pode definir, por exemplo, um conceito relacionado a temperatura corpórea com um único valor em graus Celsius. Um desenvolvedor pode, então, determinar que esse valor seja armazenado em uma coluna de uma tabela no BD em um intervalo de poucas dezenas de unidades. Caso o usuário requisite, posteriormente, que a temperatura seja armazenada em graus Kelvin (valores em centenas de unidades) pode ser necessário alterar o esquema da tabela, o tipo 2.1 RESs e a abordagem multinível 20 Figura 2.1: Exemplo de modelo multinível em que as camadas de nível mais baixo podem ser utilizadas por camadas de nível superior. do dado e as tabelas que o referenciam. Além disso, a interoperabilidade é limitada aos sistemas que seguem esse mesmo modelo de dados [43]. Uma solução para os problemas anteriores é fazer a separação das diferentes visões sobre os dados dos SISs. A abordagem de dois níveis (multinível) propõe a separação entre informação e conhecimento[7]. Assim, torna-se possível, por exemplo, alterar um conceito de domínio relacionado a temperatura corpórea sem requerer alterações no esquema do BD e dos dados dos pacientes no nível de informação. Isso também possibilita que um conceito único e bem definido de temperatura corpórea possa ser compartilhado entre vários sistemas em saúde. Um exemplo de um modelo multinível com 6 camadas é ilustrado na Figura 2.1. A camada do Modelo de Informação, no nível mais baixo, contém elementos com o mínimo de semântica que podem ser mapeados para um banco de dados. O Modelo de Arquétipos abrange os conceitos clínicos e pode ser agregado para formar um Modelo de Template[25]. A partir de arquétipos e templates, no Modelo de Consultas, são definidas consultas mapeadas para serviços de recuperação. Com base em arquétipos e consultas, podem ser definidas regras para gerar relatórios. Já no Modelo de Mensagem, a informação é estruturada e pode ser mapeada em formatos de troca, como no caso do HL7 e da ISO/EN13606. No Modelo de Interface do Usuário, na última camada, são definidas diretrizes de como a informação é organizada e apresentada[25]. 2.2 Padrões internacionais 2.2 21 Padrões internacionais Por ser um tema com relevância internacional, a ISO/TC 2151 estabelece um Comitê Técnico de informática em saúde que trabalha na padronização da Tecnologia de Comunicação e Informação em Saúde para possibilitar a compatibilidade e interoperabilidade entre sistemas independentes. A padronização facilita a troca e uso de dados, de informação e de conhecimento de modo consistente e coerente. O comitê trata de assuntos relacionados aos RES através de grupos de trabalho que abordam desde estruturas de dados até requisitos de negócios. As definições e diretrizes do comitê são publicadas por meio de padrões ISO. Para a definição, delimitação de escopo e apresentação de contexto do RES, foi elaborada a ISO/TR 20514[30]. Conforme essa ISO, um RES é um “repositório de informação relacionado ao status de saúde de um sujeito sob cuidados, em formulário processável computacionalmente”. No caso de RES para cuidado integrado, o formulário deve ser armazenado e transmitido de forma segura e acessível para múltiplos usuários. O modelo de informação deve ser predefinido e independente dos sistemas. Já a ISO 18308 estabelece os requisitos arquiteturais de um RES para garantir sua validade e confiabilidade, dando suporte a boas práticas clínicas. A arquitetura é vista como um conjunto de componentes estruturais genéricos definidos de acordo com um modelo de informação e sobre a qual constroem-se os RESs. Outra ISO de grande importância do Comitê Técnico 215 é a ISO EN13606 [19] elaborada, originalmente, pelo Comitê Europeu, com o objetivo de alcançar a interoperabilidade semântica na comunicação de RES. Para isso, recomenda-se o uso de uma arquitetura de informação estável e rigorosa e um repositório de dados centralizado. O padrão propõe uma arquitetura de Modelo Dual com a informação estruturada em um Modelo de Referência (MR), contendo as entidades básicas para representar qualquer informação de um RES, e o conhecimento baseado em arquétipos. De modo mais preciso, os arquétipos são definições formais de conceitos clínicos com significado semântico na forma de combinações de entidades do MR[8]. A interoperabilidade pode ser definida como a propriedade de sistemas e organizações serem capazes de cooperar. Na interoperabilidade sintática os sistemas têm a possibilidade de se comunicar e trocar dados. Para isso são especificados, por exemplo, formatos de dados e protocolos de comunicação utilizando padrões como o XML ou SQL. Já na interoperabilidade semântica a informação trocada é automaticamente interpretada utilizando um modelo de referência comum e as requisições não são ambíguas [19]. Neste sentido, a plataforma ResearchEHR é um exemplo de tecnologia que provê acesso e in1 International Organization for Standardization / Technical Comitee 215. Disponível em: <http://www.iso.org/iso/iso_technical_committee?commid=54960> 2.3 Contexto brasileiro 22 tegração de dados, normalização de estruturas existentes e modelagem semântica através de arquétipos [38]. A ISO especifica, ainda, o Modelo de Arquétipos, construído através de uma combinação de entidades do MR. O MR, por sua vez, é um modelo orientado a objetos que representa a informação para a construção de RES, especificando estruturas de dados e informações de contexto. Ele é composto por[19][7]: • um conjunto de tipos primitivos; • seis tipos de entidades principais: folder, composition, section, entry, cluster e element; • classes auxiliares e, opcionalmente; • classes de descrição de dados demográficos e de comunicação. 2.3 Contexto brasileiro Com a publicação da Portaria no 2073 de 2011[16], passa a ser regulamentado, no Brasil, o uso de padrões de interoperabilidade e de informação em saúde entre os sistemas privados, de saúde suplementar e de informação do SUS. Para a definição da estrutura do RES, a portaria exige o uso do Modelo de Referência do openEHR. Já para a interoperabilidade de modelos de conhecimento, incluindo arquétipos, a portaria define o uso do padrão ISO 13606-2. Adicionalmente, a Portaria GM no 589 institui a Política Nacional de Informação e Informática em Saúde (PNIIS)[15]. A PNIIS apresenta princípios e diretrizes para nortear uma organização institucional a fim de melhorar o acesso e qualidade do SUS, a transparência e segurança de informação e o suporte para tomada de decisão. São recomendadas estratégias como o desenvolvimento de sistemas interoperáveis e o uso de RESs. O Ministério da Saúde apresenta, também, um documento propondo uma visão de e-Saúde vigente até 2020 e descreve mecanismos para executar o Plano Nacional de Saúde e do SUS. Um de seus pilares são os Padrões e Interoperabilidade, para os quais são apresentadas nove ações estratégicas e resultados esperados. Nesse sentido, é dada suma importância à implantação de sistemas RES[14]. 2.4 Plataforma openEHR A organização openEHR foi a responsável pela criação da abordagem de dois níveis, normatizada pela ISO EN13606, e por aplicar estas teorias em uma plataforma homônima. Nesta abordagem os dados são modelados em conformidade a um conjunto de 2.4 Plataforma openEHR 23 Figura 2.2: Meta-arquitetura de arquétipos[8] conceitos pré-estabelecidos, os quais são formados por entidades padronizadas. Estes conceitos são os chamados arquétipos e definem o segundo nível do modelo multinível[7]. Os arquétipos são expressados por meio da linguagem ADL (Archetype Definition Language) e recuperados a partir de consultas escritas em AQL (Archetype Query Language)[8]. Já o conjunto de entidades básicas que constitui cada arquétipo é o já citado Modelo de Referência e retrata o primeiro nível da abordagem multinível. O MR segue o método orientado a objetos e, portanto, representa um conjunto de classes com relacionamentos. Os arquétipos, por sua vez, combinam elementos do MR para refletir conceitos com conteúdo semântico. Assim, dados modelados conforme um arquétipo compreendem instâncias de entidades do MR. A Figura 2.2 mostra a meta-arquitetura do openEHR[8] e a separação entre as atividades desempenhadas pelo usuário e pelo especialista do domínio. O especialista cria um arquétipo com a linguagem ADL ao aplicar restrições no MR. O usuário, por sua vez, cria uma informação em conformidade semântica ao arquétipo. Consequentemente, essas informações são mantidas por instâncias de classes do MR. O MR é dividido em pacotes reusáveis de baixo nível que fornecem identificadores, tipos de dados e estruturas de dados para pacotes de domínio em alto nível, como o pacote de integração[8]. Um exemplo de parte de um pacote de baixo nível é mostrado na Figura 2.3. Os dados clínicos são armazenados em instâncias das classes folhas como, por exemplo, em DV_QUANTITY e DV_TIME. Para cada classe folha há uma determinada classe raiz conhecida que, quando instanciada, gera um grafo de objetos. São exemplos de raízes as classes ELEMENT, OBSERVATION e SECTION. O RES, por sua vez, segue a estrutura representada na Figura 2.4, cujos objetos são instâncias de classes do pacote EHR, englobado pelo MR do openEHR. Uma lista 2.5 Limitação de recursos 24 Figura 2.3: Parte do pacote de tipos de dados do MR (restrito a quantidades)[45]. de contribuições (do tipo CONTRIBUTION) referencia um conjunto de versões de um mesmo RES. O objeto EHR contém o identificador do RES (do tipo HIER_OBJECT_ID) e referências (do tipo OBJECT_REF) para os demais objetos presentes na Figura. Estes objetos são versionados e contém informações de acesso (classe EHR_ACESS do MR), status e controle (EHR_STATUS), além de um diretório (DIRECTORY) de pastas (FOLDERs) para organizar as composições (COMPOSITIONs) que contém todo o conteúdo clínico e administrativo do RES[28]. 2.5 Limitação de recursos Durante as últimas décadas do século passado, houve um aumento, aparentemente exponencial, da capacidade de processamento e de memória em computadores pessoais, mainframes e em estações de trabalho. Por este motivo, os projetos de software não mais se orientavam pela limitação de recursos computacionais[44]. Entretanto, no início deste século, houveram indícios do surgimento de um mercado iminente constituído por centenas de milhões de dispositivos móveis. Tais dispositivos são limitados pelo tamanho físico e armazenamento de energia, o que implica 2.5 Limitação de recursos 25 Figura 2.4: Estrutura de um RES[28]. em memória limitada[44]. Em 2014, haviam cerca de 7,22 bilhões de celulares ativos, ultrapassando a quantidade de seres humanos e com uma taxa de crescimento cinco vezes maior do que o crescimento populacional[10]. Além de dispositivos móveis, servidores Web e de banco de dados requerem capacidade de processamento e espaço suficiente para atender milhares de usuários simultâneos em suas aplicações. A capacidade de memória gera dificuldades, até mesmo, em computadores tradicionais, devido às demandas de multimídia, principalmente de vídeo[44]. Soluções relacionadas ao armazenamento de dados clínicos normalmente utilizam índices altamente otimizados. Por isso, as maiores preocupações se voltam para o tempo de inserção e espaço de armazenamento do que para o tempo de consulta[42]. Freire et al. (2016) utiliza a base de dados brasileira do Sistema de Informação do Câncer do Colo do Útero. Esta base contém registros de mais de 1,6 milhões de pacientes[24]. Além disso, a quantidade de informações de cada paciente pode requerer um espaço de alguns gigabytes de memória. Logo, uma alternativa é realizar a compressão dos dados[51]. Neste contexto, a estratégia de persistência de dados baseados no openEHR deve ser orientada pela limitação de recursos, uma vez que um SIS pode conter milhares de RESs de pacientes. Tais registros, podem conter, além de texto, conteúdos de multimídia e podem ser acessados através de aplicações tradicionais, Web ou através de aplicativos móveis. 2.6 Serialização e desserialização de dados 26 Figura 2.5: Formato BSON para serialização de dados[41]. 2.6 Serialização e desserialização de dados A camada de persistência de um sistema é responsável por fornecer uma interface abstrata com funcionalidades para armazenar e recuperar objetos através de chaves específicas, consultar instâncias de um determinado tipo, gerenciar sessões e transações. A diferença entre a persistência de dados modelados conforme o openEHR e a dos demais dados, é que no primeiro caso a modelagem se baseia no MR, um conjunto de classes menor e mais genérico do que outros modelos[8] e que, para tanto, pode ser otimizado pelo uso de estratégias específicas. A persistência de um grafo de objetos pode ser realizada através da serialização e desserialização dos dados. Durante a serialização, é feita a decomposição de estruturas complexas em uma sequência de partes primitivas, o estado e o modelo do objeto são armazenados de modo a permitir o acesso serial. Na desserialização é feito o caminho inverso com a recriação do objeto a partir da leitura do estado e do esquema[9]. No caso de dados baseados no openEHR, a serialização é aplicada sobre um grafo de objetos do MR. O estado de um objeto é composto pelos dados clínicos propriamente ditos, já o modelo do objeto faz referência às estruturas especificadas das classes do MR. A serialização dos dados segue um formato predefinido, os padrões XML, JSON e BSON (JSON binário) são alguns exemplos de formatos de armazenamento de documentos. Diferentemente dos outros formatos, o BSON é uma representação binária de um documento JSON, formado por pares atributo-valor de tipos básicos que constituem objetos complexos. Conforme a Figura 2.5[41], o BSON contém informações que facilitam o parsing dos dados de entrada, como, por exemplo, prefixos de tamanho, de tipo e delimitadores. As operações de recuperação e armazenamento da camada de persistência devem estar de acordo com o formato do objeto BSON [57]. 2.7 Considerações Finais 27 Outro exemplo de mecanismo para serialização de dados é o framework Protocol Buffers. Este mecanismo gera um código-fonte que permite a escrita e leitura de dados estruturados de/para diversos tipos de streams de dados. Assim como o BSON, também são utilizados pares nome-valor. Comparado ao XML, por exemplo, o Protocol Buffers é mais simples, menor, dezenas de vezes mais rápido e gera menos ambiguidade [49]. Isto ocorre devido ao fato do framework otimizar a persistência no nível de bytes por meio da codificação. Por fim, o framework FlatBuffers é um buffer binário para a persistência de objetos aninhados, como, por exemplo, vetores e tabelas. Para percorrer o buffer, são armazenados tamanhos de deslocamentos que funcionam como ponteiros. Ao contrário dos outros formatos, o FlatBuffers direciona-se para dispositivos móveis com restrição de memória e em aplicações, como jogos, que exigem um alto desempenho de processamento [20]. 2.7 Considerações Finais A estratégia de persistência desenvolvida neste trabalho realiza o mapeamento do grafo de objetos do MR para um vetor binário. Para generalizar a explicação, é afirmado que o grafo de objetos possui uma raiz de tipo indefinido e que, a partir de sua indicação, todo o restante da estrutura passa a ser conhecida. Contudo, a persistência do RES deve conter, obrigatoriamente os objetos ilustrados na Figura 2.4. A estratégia deve considerar, principalmente, a limitação de recursos computacionais de memória, discutida na Seção 2.5. A estrutura de dados para persistência deve ser baseada nos formatos apresentados na Seção 2.6. CAPÍTULO 3 Revisão Bibliográfica Este capítulo detalha a revisão sistemática relacionada à persistência de dados clínicos modelados com base no openEHR, conforme o protocolo definido em Mian et al. (2005)[40]. A revisão contribui para o aprofundamento do estado da arte e descobrimento de lacunas presentes no tema abordado. A Seção 3.1 apresenta a contextualização do tema e a elaboração de questões para serem respondidas no final desta revisão. As bases bibliográficas são selecionadas na Seção 3.2 juntamente com a String de busca. Os estudos selecionados das bases, com seus respectivos critérios de seleção, são apresentados na Seção 3.3. Já a Seção 3.4 relata a extração de informações relevantes dos estudos em formulários (não estruturados), tabelas (estruturadas) e agrupadas por critério de inclusão. A sumarização dos resultados em estatísticas é feita na Seção 3.5. Por fim, a Seção 3.6 relata as respostas para as questões de pesquisa. 3.1 3.1.1 Formulação da questão Problema Para que um RES modelado conforme as especificações do openEHR seja armazenado e recuperado, é necessário persistir instâncias do MR. Neste sentido, são demandadas estratégias específicas que atendam aos requisitos de qualidade para se persistir um grande volume de dados e metadados. Consequentemente, um problema decorrente do uso desta abordagem é encontrar estratégias, modelos e estruturas de dados que abranjam a persistência de RESs. 3.1.2 Questões A revisão sistemática deve responder às questões principal e secundárias: • Questão principal: Que estratégias de persistência de dados têm sido empregadas em sistemas de informação em saúde baseados na modelagem multinível? 3.1 Formulação da questão 29 • Questão secundária 1: Que critérios de avaliação têm sido empregados na persistência de dados em sistemas de informação em saúde baseados na modelagem multinível? • Questão secundária 2: Que benchmarks (compostos por, por exemplo, arquétipos, dados clínicos reais com modelagem multinível, consultas e seus resultados, etc.) têm sido empregados na avaliação de sistemas de informação em saúde baseados na modelagem multinível? 3.1.3 Intervenção, palavras-chave e sinônimos Nesta revisão deve ser observado o detalhamento dos trabalhos em relação à persistência dos dados clínicos. A busca pelos estudos de interesse deve englobar as seguintes palavras-chave, com seus respectivos sinônimos: • Persistência, armazenamento e recuperação; • Registro eletrônico em saúde, registro eletrônico médico, registro eletrônico do paciente; • Modelagem, metodologia ou abordagem multinível; • Modelo de dois níveis, modelo dual; • MR, modelo de informação; • Arquétipo, conceitos clínicos; • Modelo de dados lógico ou físico, esquema de banco de dados; • openEHR. 3.1.4 Outros tópicos Quanto ao efeito causado pela revisão, espera-se encontrar estudos com estratégias de persistência de dados que exponham detalhes acerca das estruturas de dados e dos benchmarks utilizados. Também espera-se encontrar estratégias de serialização dos dados para o armazenamento das informações ou transferência entre diferentes sistemas. Para medir o efeito, contabiliza-se em uma tabela inicial e em uma tabela final a quantidade de estudos abrangendo cada critério de inclusão e de exclusão. Durante as buscas dos estudos, a string deve ser formulada de modo a permitir a recuperação dos artigos de controle, são eles: Wang et al. (2015)[55], Freire et al. (2016)[24], Sundvall et al. (2013)[52], Frade et al. (2013)[22], Velte et al. (2012)[54]. A população em análise desta revisão são os dados clínicos baseados no openEHR. Este estudo pode ser aplicado no desenvolvimento de sistemas da área de informática médica devido à apresentação de alternativas que consideram a perspectiva da persistência de dados clínicos. 3.2 Seleção de fontes 30 Tabela 3.1: String de busca aplicada nas fontes bibliográficas. ((storage OR persistence OR “database model” OR “database schema”) AND (openEHR OR 13606) OR (electronic PRE/0 (health OR medical OR patient) PRE/0 record)) AND NOT (owl) 3.2 Seleção de fontes As fontes bibliográficas escolhidas são bases científicas da área de Ciência da Computação, na Língua Inglesa e Portuguesa, disponibilizadas pelo portal da CAPES1 . A string de busca aplicada na seleção de estudos das fontes cobrem artigos científicos e monografias de 2006 a 2016. A string avançada de busca possui variações sintáticas por fonte, mas, basicamente, com o mesmo significado semântico da string representada na Tabela 3.1. Esta expressão abrange a persistência de RES modelados conforme o openEHR. Estudos focados nos aspectos semânticos dos dados, como no caso do desenvolvimento de sistemas pervasivos e de suporte à decisão, devem ser excluídos, portanto supõe-se que referências à tecnologias, como no caso da linguagem OWL, são feitas apenas em estudos que aprofundam tópicos da Inteligência Artificial. Na seleção das fontes considera-se o uso comum na àrea de informática médica. As fontes selecionadas são as seguintes: • • • • • • IEEE Xplore2 ; SpringerLink3 ; ScienceDirect4 ; PMC PubMed Central5 ; PubMed6 ; Scopus7 . Adicionalmente, esta revisão considera a fonte Google Scholar8 . Por ser uma base que indexa um grande volume de trabalhos (em grande parte sem caráter científico), aplica-se uma string de busca mais restrita sobre esta fonte, conforme a Tabela 3.2. Esta string restringe a revisão ao padrão do openEHR e é mais excludente em trabalhos relacionados à semântica dos dados. 1 Disponível em: <http://www.periodicos.capes.gov.br/> em: http://ieeexplore.ieee.org/ 3 Disponível em: http://link.springer.com/ 4 Disponível em: http://www.sciencedirect.com/ 5 Disponível em: http://www.ncbi.nlm.nih.gov/pmc/ 6 Disponível em: http://www.ncbi.nlm.nih.gov/pubmed/ 7 Disponível em: https://www.scopus.com/ 8 Disponível em: http://scholar.google.com/ 2 Disponível 3.3 Seleção de estudos 31 Tabela 3.2: String de busca aplicada na fonte Google Scholar. (((storage OR persistence OR “database model” OR “database schema”) openehr) ehr) -“owl” -“data mining” -“multi agent” -vocabularies -“knowledge management” Tabela 3.3: Critérios para inclusão de estudos. CI-1 Estudos que apresentam requisitos diretamente relacionados à persistência de dados, para o desenvolvimento de sistemas em saúde baseados no openEHR. CI-2 Estudos que descrevem o mapeamento de modelos conceituais em saúde baseados no openEHR para modelos de dados lógicos ou físicos. CI-3 Estudos que descrevem a camada ou serviço de persistência de dados em SISs baseados no openEHR. CI-4 Estudos que descrevem benchmarks para SISs baseados no openEHR. CI-5 Estudos que avaliam a camada ou serviço de persistência de dados presentes em SISs baseados no openEHR. Tabela 3.4: Critérios para exclusão de estudos. CE-1 CE-2 CE-3 CE-4 CE-5 3.3 Estudos que não exploram as questões de pesquisa e, consequentemente, não são cobertos pelos critérios de inclusão. Duplicações de estudos, isto é, estudos recuperados de outras fontes nesta revisão. Estudos com contribuições totalmente abrangidas por outras publicações, recuperadas nesta revisão. Estudos inacessíveis ou não disponíveis integralmente. Estudos que fogem do escopo com respeito ao seu propósito. Seleção de estudos A revisão bibliográfica engloba todos os tipos de estudos científicos, tais como qualitativos, quantitativos e de caracterização. 3.3.1 Critérios de seleção Os critérios de inclusão dos estudos são apresentados na Tabela 3.3 e os critérios de exclusão na Tabela 3.4 3.3.2 Procedimentos para seleção de estudos Os artigos devem ser importados para a ferramenta Mendeley9 , onde são criadas pastas para cada um dos critérios de inclusão e exclusão. Na primeira fase de seleção são lidos o título, resumo e palavras-chave de cada trabalho. Os artigos são copiados para as pastas correspondentes aos seus critérios de inclusão ou exclusão. Nos casos de resumos 9 Disponível em: https://www.mendeley.com/ 3.3 Seleção de estudos 32 Tabela 3.5: Resultados da primeira fase de seleção de estudos. IEEE PMC CI-1 0 2 CI-2 1 1 CI-3 8 3 CI-4 0 0 CI-5 1 1 Incluídos 10 7 CE-1 40 96 CE-2 0 0 CE-3 0 0 CE-4 0 0 CE-5 1 0 Excluídos 41 96 Total de 51 103 estudos PubMed ScienceDirect Scopus 0 0 0 2 1 3 6 3 6 1 0 0 0 1 0 9 5 9 76 140 301 5 4 28 0 0 2 0 0 4 3 2 6 84 146 341 93 151 350 Springer TOTAL 1 3 1 9 1 27 0 1 2 5 5 45 80 733 6 43 0 2 0 4 1 13 87 795 92 840 superficiais ou inconsistentes ou nos casos de trabalhos sem resumos, as palavras-chave da string de busca são pesquisadas no corpo do texto e são lidas as frases onde se encontram a fim de classificar o artigo de acordo com suas reais contribuições para esta pesquisa. Em virtude de não haver uma seção específica nos trabalhos científicos para identificar os critérios de exclusão, principalmente no caso do critério “CE-5”, os artigos incluídos passam por uma segunda fase de seleção. Esta fase de exclusão é simultânea à fase de extração de dados, já que um critério de exclusão é atendido se, e somente se, não houverem dados relevantes para extração. 3.3.3 Seleção de estudos iniciais As quantidades de estudos classificados por critério de inclusão e exclusão (com base na leitura dos resumos) são apresentadas na Tabela 3.5, com exceção dos estudos da fonte Google Scholar, mostradas na Tabela 3.6. Para evitar interseções nos cálculos, ambas as tabelas classificam um determinado estudo de acordo com seu critério primário, isto é, o tópico de maior abrangência do estudo. Assim um estudo se enquadra primariamente em apenas um critério, apesar de poder abordar outros critérios secundariamente. Subtraindo-se as repetições recuperadas de estudos, foram lidos 1042 resumos durante a primeira fase de seleção. No total houve uma taxa de inclusão de aproximadamente 5,3%. Deste valor, cerca de 65% corresponde a estudos que tratam primariamente do critério CI-3. Por outro lado, dentre os estudos excluídos, mais de 86% se enquadra no critério CE-1. 3.4 Extração de informação 33 Tabela 3.6: Resultados da primeira fase de seleção de estudos da fonte Google Scholar CI CI-1 0 CE CE-1 228 CI-2 2 CE-2 90 CI-3 13 CE-3 0 CI-4 0 CE-4 0 CI-5 2 CE-5 0 Incluídos 17 Excluídos 318 Total de estudos 335 3.4 Extração de informação 3.4.1 Definição de critérios para inclusão de informação As informações dos estudos devem ser extraídas caso abordem os seguintes pontos: • • • • • • 3.4.2 Definição de requisitos para a execução da persistência; Descrição em alto nível do modelo de dados mapeado; Técnica de persistência aplicada; Métricas de avaliação da persistência; Resultados da avaliação de diferentes técnicas ou modelos de persistência; Descrição do benchmark utilizado na avaliação do sistema. Formulários de extração de dados Durante a segunda fase de seleção de estudos deve-se preencher um formulário para cada artigo incluído na primeira fase com informações de autores, ano, critério de inclusão ou de exclusão. Paralelamente, deve-se resumir cada estudo com informações não-estruturadas sobre seu respectivo objetivo e suas contribuições, relacionadas a persistência de dados clínicos multiníveis, ou motivo para exclusão do estudo. Além disso, devem ser preenchidos formulários com informações estruturadas (convertidos em tabelas) apontando tópicos específicos abordados pelos estudos pertinentes aos critérios de inclusão. Assim, um estudo é incluído na segunda fase de seleção caso apresente dados relevantes para extração. O formulário correspondente à Tabela 3.7 expõe características dos estudos que fornecem requisitos próprios ao desenvolvimento da camada de persistência em sistemas multiníveis. A coluna A1 aponta o critério de inclusão primário pelo qual o estudo foi considerado nesta revisão, portanto valores “CI-1” denotam artigos que tratam primariamente de requisitos de persistência, já os demais artigos abordam este tópico de maneira secundária. 3.4 Extração de informação 34 Tabela 3.7: Formulário para extração de informações estruturadas relacionadas à persistência de dados no desenvolvimento de sistemas em saúde multiníveis (CI-1). CI (A1) Requisitos funcionais (A2) Desempenho (A3) Espaço (A4) Outros RNFs (A5) O projeto dos mecanismos de persistência deve considerar os requisitos funcionais indispensáveis ao sistema. Estes requisitos descrevem as funcionalidades oferecidas pelos sistemas, que são fortemente ligadas ao armazenamento e recuperação dos dados, como é o caso do serviço de criação, leitura, atualização e exclusão (CRUD) de dados. Assim, a coluna A2 da Tabela 3.7 retrata os requisitos funcionais encontrados nos estudos. O projeto da camada de persistência também deve considerar o comportamento esperado pelos usuários em relação à execução do serviço de persistência. Neste sentido, a coluna A3 da Tabela 3.7 apresenta requisitos não-funcionais de desempenho. Estes requisitos exprimem a eficiência no tempo de resposta para a manipulação de dados, mais especificamente, para a execução das operações de CRUD. É importante que no projeto do serviço de persistência dos estudos sejam consideradas as restrições impostas pelos usuários e pelo sistema sobre o uso de recursos computacionais. Assim, a coluna A4 da Tabela 3.7 expõe os requisitos não-funcionais de espaço relacionados à apropriação de memória. Devido a necessidade de prover sistemas em saúde interoperáveis, o desenvolvimento dos serviços de persistência desses sistemas deve atender a critérios variáveis e fazer uso de tecnologias heterogêneas. Nesse sentido, os estudos da Tabela 3.7 definem outros requisitos não-funcionais na coluna A3, como os de adaptabilidade, portabilidade e compatibilidade. As propriedades dos estudos que exploram o mapeamento de modelos conceituais para esquemas de dados para persistência são mostradas na Tabela 3.8, de modo que estudos com o critério de inclusão “CI-2” na coluna B1 abordam este assunto com mais intensidade. Na abordagem multínivel, o esquema de dados deve ser gerado de acordo com o modelo conceitual de informação ou de conhecimento. Por exemplo, em um sistema baseado no openEHR a camada de persistência pode utilizar um esquema de banco de dados definido a partir do modelo conceitual do MR ou dos arquétipos. Por isto, a coluna B2 da Tabela 3.8 aponta o modelo conceitual base do esquema de dados. Além de definir o modelo conceitual, é preciso escolher o modelo de dados lógico ou físico, de acordo com o nível de abstração necessário, para a representação do esquema para persistência de dados. O modelo de dados utilizado pelo estudo selecionado é citado na coluna B3 da Tabela 3.8. Uma vez que os modelos de informação e de conhecimento dos sistemas multiní- 3.4 Extração de informação 35 Tabela 3.8: Formulário para extração de informações estruturadas relacionadas ao mapeamento de modelos conceituais em saúde multiníveis para modelos de dados lógicos ou físicos (CI-2). CI Modelo (B1) conceitual (B2) Modelo lógico ou físico (B3) Tipos de dados básicos (B4) AssociaçãoHerança Coleção Mapeamentos e agre- (B6) (B7) específicos gação (B8) (B5) Tabela 3.9: Formulário para extração de informações estruturadas relacionadas à descrição da camada ou serviço de persistência de dados em SISs com modelagem multinível (CI-3). CI Nome BD - Padrão de Definição (C1) ou quan- SGBD referência de esquema tidade (C3) (C4) RES (C5) (C2) Consulta RES (C6) Organização dos arquivos (C7) veis são representados por grafos de entidades seguindo a abordagem orientada a objetos (OO), é preciso que essas estruturas de dados e seus relacionamentos sejam mapeados para o esquema de dados desejado. Assim, a coluna B4 e B7 da Tabela 3.8 relata, respectivamente, as decisões de mapeamento de tipos de dados básicos e de coleções. A coluna B5 descreve o mapeamento do relacionamento de associação e agregação, já o relacionamento de herança é descrito na coluna B6. Mapeamentos específicos do modelo conceitual são definidos na coluna B8. A Tabela 3.9 realça as propriedades dos serviços de persistência de dados multiníveis apresentados pelos estudos. A coluna C1 corresponde ao critério de inclusão do artigo, assim, estudos com o critério “CI-3” abrangem a descrição do serviço de persistência com mais profundidade. Esta tabela expõe nas respectivas colunas: • C2: o nome do sistema ou a quantidade de sistemas em análise, em caso de revisão bibliográfica; • C3: os tipos de bancos de dados e respectivos Sistemas Gerenciadores de Bancos de Dados (SGBD) ou interfaces para gerenciamento de dados utilizados; • C5: os padrões de especificação da modelagem dos dados; • C6: os mecanismos de definição do esquema de dados; • C7: os mecanismos de consulta dos dados; • C8: os formatos de organização dos arquivos no BD (tabela, documento, etc). A Tabela 3.10 detalha os elementos dos benchmarks utilizados na avaliação da camada de persistência. Os artigos que melhor descrevem seus benchmarks apresentam o critério de inclusão “CI-4” no atributo D1. Já a coluna D2 informa o nome/local do repositório de conceitos (geralmente de arquétipos). 3.4 Extração de informação 36 Tabela 3.10: Formulário para extração de informações estruturadas relacionadas à descrição de benchmarks para SISs com modelagem multinível (CI-4). CI Repositório BDs (D1) de con- de ceitos de um domínio nível (D2) (D3) BDs com esquemas dependentes do domínio (D4) BDs com esquemas independentes do domínio (D5) Quantidade Quantidade de RESs de con(D6) sultas (D7) Tabela 3.11: Formulário para extração de informações estruturadas relacionadas à avaliação da camada ou serviço de persistência de dados presentes em SISs com modelagem multinível (CI-5). CI Tamanho (E1) das bases (E2) Tempo para consultas de indivíduos (E3) Tempo para consultas de populações (E4) Tempo para armazenamento ou padrão de uso (E5) Análise dos resultados (E6) As bases de dados apresentadas em um mesmo estudo na Tabela 3.10 expressam as mesmas informações, apesar de suas sintaxes variarem conforme as restrições impostas pelos seus respectivos BDs. Os BDs utilizados com modelagem de um nível (convencional) são citados em D3. BDs cujos esquemas seguem o modelo do nível de conhecimento são apresentados em D4 e BDs contendo esquemas conforme o nível de informação em D5, ambos do modelo multinível. A quantidade de RESs que constituem as bases de dados é exibida em D6. Já a coluna D7 cita a quantidade de consultas com semânticas diferentes executadas sobre estas bases. A Tabela 3.11 descreve as propriedades de estudos que avaliam a camada de persistência de dados baseados na modelagem multinível. Para isso, o estudo avalia o serviço de persistência sob a aplicação de diferentes entradas e em diferentes contextos. A avaliação é tratada primariamente nos estudos com o valor “CI-5” no atributo E1 relativo ao critério de inclusão. Mais especificamente, a Tabela 3.11 apresenta os resultados das operações aplicadas sobre os dados e suas análises. A coluna E2 expõe o tamanho do espaço em memória ocupado por cada base de dados. A camada de persistência deve tratar, basicamente, de dois tipos de consultas: baseada em indivíduo (registro único) e em população (multi-registro). Para uma consulta baseada em indivíduo deve-se informar o identificador único de um registro. Este é o caso, por exemplo, da recuperação de dados de um paciente específico. Para uma consulta baseada em população deve-se informar a condição de seleção dos dados. Este é o caso, por exemplo, da recuperação dos identificadores de pacientes com uma temperatura corpórea em uma determinada faixa de valores. Neste sentido, a coluna E3 relata o tempo 3.4 Extração de informação 37 Tabela 3.12: Exemplos de preenchimento do formulário da primeira fase de seleção. Autores (ano) [CI/CE] Chen e Klein (2007) [12] [CE-5] Descrição Implementa as especificações do openEHR utilizando a linguagem Java. Para isso, os tipos de dados do openEHR são mapeados para os tipos de dados nativos da linguagem. Também são implementados os tipos de dados de alto nível e consultas baseadas em caminho para encontrar nós folhas em uma grande árvore de objetos. Deste modo sistemas RES podem se basear completamente nos componentes do MR. Entretanto, o estudo não fornece mais detalhes a respeito da estratégia de persistência empregada. médio de resposta para consultas baseadas em indivíduos e E4 para consultas baseadas em populações. A camada de persistência pode ser otimizada após o reconhecimento de padrões de uso desse serviço. Os padrões podem ser detectados em alto nível, por exemplo, relativos à frequência de consultas feitas pelos usuários, sejam elas baseadas em populações ou em indivíduos. Por outro lado, os padrões também podem ser detectados em baixo-nível, por exemplo, considerando a frequência de armazenamento de instâncias de determinadas classes do MR. Estas estatísticas de frequência de uso de elementos diretamente relacionados ao serviço de persistência e o tempo médio gasto no armazenamento dos dados não são comumente informados e, portanto, são detalhados na mesma coluna E5 da Tabela 3.11. Por fim, a coluna E6 da Tabela 3.11 resume as análises feitas pelos estudos sobre os resultados das avaliações do serviço de persistência com diferentes entradas e/ou comparado a trabalhos correlatos. 3.4.3 Extração de resultados em tabelas Com base nos formulários da Subseção 3.4.2 são apresentadas justificativas para a inclusão ou exclusão de estudos na primeira fase da seleção e a extração de informações dos estudos incluídos na segunda fase de seleção. A Tabela 3.12 exemplifica o preenchimento do formulário relativo à primeira fase para um estudo excluído da revisão. O restante deste formulário, com o resumo de todos os estudos incluídos, são apresentados no Apêndice A. Durante a segunda fase de seleção, os estudos são considerados como incluídos caso apresentem informações relevantes para o preenchimento dos formulários da 3.4 Extração de informação 38 Subseção 3.4.2, relativas às informações estruturadas dos critérios de inclusão. Estes formulários são convertidos nas Tabelas 3.13, 3.14, 3.15, 3.16 e 3.17. Uma desvantagem da Tabela 3.17 é que não é possível fazer comparações precisas entre os estudos, já que eles não utilizam as mesmas bases de dados. Entretanto, é possível extrair indícios de comparação sobre seus desempenhos a partir da realização de inferências e cálculos proporcionais. Estudos posteriores deverão comprovar estas suposições. 3.4.4 Critério CI-1 (requisitos) Em relação ao critério CI-1, os estudos recomendam que o modelo de BD escolhido seja flexível, facilitando a adição e remoção de entidades e atributos[55][54][29], possivelmente livre de esquema[37], e que ofereça suporte a diferentes tecnologias e formatos de armazenamento[52][35]. Além disso, deve-se assegurar o acesso transparente a múltiplos BDs por meio de drivers[35] ou ao BD único através de abstrações para gerenciar os RESs[54][52][29]. Isso inclui não exigir do usuário conhecimento da estrutura do BD (usando o mapeamento objeto-relacional[29][37]) e das sintaxes[37] na realização de consultas, além de não exigir o mapeamento, serialização e validação dos RESs[42]. Os estudos esperam que o sistema seja eficiente no acesso (leitura/escrita) de um grande volume de RESs[29] e aplicável em um ambiente real[55][52][42]. As operações devem centrar-se no paciente com consultas mais rápidas do que inserções[54]. Nesse sentido, a camada de persistência deve permitir a execução de consultas complexas[37]. Isso pode ser alcançado através de caching no servidor e/ou no cliente[52] e através de índices[52][37] que otimizam a consulta[37]. Além do desempenho, o espaço é outro requisito relevante. O sistema deve propiciar escalabilidade horizontal e/ou vertical sobre o volume de dados[52][35][42]. A escalabilidade pode ser alcançada através do suporte a múltiplos sistemas de armazenamento[35] ou pelo uso de sharding[52] (divisão do BD). O uso de índices[37] e de armazenamento de caching em disco[52] também são úteis. 3.4.5 Critério CI-2 (mapeamento) Duas estratégias detalham o mapeamento de instâncias do modelo de BD conceitual para o modelo de BD lógico pelo critério CI-2, são elas: mapeamento do HL7 RIM (MR do HL7/CDA) para o modelo relacional com a aplicação do modelo EntidadeAtributo-Valor-Otimizado (OEAV) sobre a classe Observation[48] e mapeamento de arquétipos para o modelo relacional[55]. As estratégias desenvolvidas evitam a perda de desempenho e de espaço na camada de persistência. No caso dos arquétipos, diferentes versões de um mesmo arquétipo 3.4 Extração de informação 39 Tabela 3.13: Estudos que apresentam requisitos diretamente relacionados à persistência de dados para o desenvolvimento de sistemas em saúde multiníveis (CI-1). A1 [29] CI-1 A2 - [54] CI-3 Oferecer CRUD RES. [35] CI-3 Oferecer CRUD, (de)serializar e criar estruturas de dados. Mais rápido que soluções XML, Node+Path, EAV e ORM. Eficiente em ambiente real. Permitir inser- Eficiente para ção e consulta consultas comde RES. plexas através do uso de índices. [55] CI-4 [37] CI-3 [52] CI-3 [42] CI-5 A3 Eficiente no processamento de grande volume de RESs. Em operações de centradas no paciente, as consultas devem ser mais rápidas do que inserções. A4 Espaço com suporte para uma quantidade volumosa de registros. - A5 O modelo de dados deve ser geral, flexível, conveniente/transparente (usar abstrações). Escolher BD dinâmico. Gerenciar RES de modo transparente e remoto. Usar web services para CRUD de RES (camada de aplicação independente). Escalável Assegurar o acesso univertical e forme e transparente à horizontalmúltiplos BDs mente sobre o volume de dados BD deve ser adaptável às mudanças nos arquétipos e aos requisitos dos RES. Altamente escalável, favorecido pelo uso de índice. Adaptação às consultas, sem exigir do usuário conhecimento da estrutura do BD e de sintaxes. Permitir Alto desempenho Caching no Flexível dando suporte CRUD distri- em ambiente disco. Es- a diferentes tecnologias buído de RES real, utilizando calabilidade e formatos de armaze(sem deleção). índice e caching vertical ou namento. Sistema RES no servidor e/ou horizontal transparente e gerenciácliente. com uso de vel. sharding. Criar RES; Desempenho Escalar con- O BD deve ser transpersistir aceitável na forme as parente sem requerer COMPOprática sobre necessidades o mapeamento, serialiSITIONs; estruturas com- do sistema. zação e validação dos recuperar plexas de objetos. RESs. O BD deve suconteúdo de portar aplicações orienarquétipos. tadas a documentos. 3.4 Extração de informação 40 Tabela 3.14: Estudos que descrevem o mapeamento de modelos conceituais em saúde multiníveis para modelos de dados lógicos ou físicos (CI-2). CI (B1) Modelo conceitual (B2) Modelo lógico ou físico (B3) Tipos de dados básicos (B4) Associação e agregação (B5) Herança (B6) Coleção (B7) Mapeamentos específicos (B8) [48] CI-2 HL7 RIM [55] CI-4 Arquétipos EAV-Otimizado (OEAV) sobre a Modelo de BD Relacional classe Observation e relacional nas demais Tipos padrões de BD Coluna de tipo básico SQL FK em 1:1 e 1:N; Tabela separada em N:N e agregação Uma tabela por classe (com identificação) e uma coluna por atributo. - Incorpora coluna em 1:1; Usa FK em 1:N Template mapeia os campos do arquétipo especializado para o do generalizado Tabela com FK para id. do arquétipo e coluna de tipo básico Campo AV contém um código Tabela contém as versões do Atributo concatenado ao Va- nova e antigas do arquétipo lor são organizadas em uma única tabela[55]. No caso do HL7 RIM, uma variável AtributoValor de tipo inteiro armazena a representação binária concatenada do atributo e do valor da classe Observation no modelo OEAV[48]. Os tipos de dados básicos do modelo conceitual, com no máximo uma ocorrência, são mapeados para os tipos padrões de BD[55][48]. A classe DvBoolean com seu atributo value, por exemplo, é mapeada para uma coluna SQL de tipo INTEGER[55]. A chave primária em cada tabela relacional corresponde ao item de identificação do arquétipo instanciado ou a um valor gerado[55] (chave substituta). No caso da tabela OEAV, a chave é baseada na identificação do paciente[48]. O mapeamento de itens de dados em arquétipos sem limites de ocorrências e de tipos de dados de coleção no HL7 RIM geram tabelas com duas colunas: uma coluna com uma chave estrangeira (FK) referenciando o arquétipo, ou classe ao qual o item pertence, e outra coluna com os dados propriamente ditos[55][48]. Para isso é necessário criar uma tabela para cada atributo do tipo coleção[48]. Associações entre tabelas representando arquétipos ou classes do HL7 RIM, do tipo um-para-muitos (i.e. atual-para-alvo) são mapeadas como FK na tabela alvo para a tabela atual[55] ou vice-versa[48]. Em associações um-para-um, a tabela alvo é concatenada na tabela atual[55] ou utiliza-se uma FK[48]. No relacionamento muitos- 3.4 Extração de informação 41 Tabela 3.15: Estudos que descrevem a camada ou serviço de persistência de dados em SISs com modelagem multinível (CI-3). C1 [29] CI-1 C2 - [55] CI-4 - [1] CI-3 [21] CI-3 [43] CI-3 [36] CI-3 [34] CI-5 [46] CI-3 [32] CI-3 C3 Relacional SQL Server Relacional SQL Server GastrOS Relacional - MS Access e SQLite Relacional - MySQL com InnoDB Relacional - Interface ODBC iCabiNET Relacional - MySQL XML nativo Oracle XML DB eHealthCom XML BaseX XML eXistdb [54] CI-3 - [52] CI-3 LiU EEE C4 HL7 modificado C5 - C6 .NET LINQ openEHR SQL SQL C7 Tabelas geradas por uma ferramenta ORM: Entity, Role e Act Tabela denormalizada por arquétipo Tabela relacional com MR serializado em XML openEHR - - openEHR modificado - Tabela por classe do MR gerada pelo Hibernate EN13606 ADL - Tabela por classe do MR EN13606 ADL - - HL7/CDA - SQL e Documento XML XQuery por encontro em diretório hierárquico openEHR Documento XML por RES openEHR ADL Documentos XML comXForms eRESs XML na- openEHR ADL AQL, Documento XML tivo - BaXPath/ por paciente seX XQuery XML - openEHR ADL AQL Documento XML BaseX, (XQuery por RES eXistdb interno) 3.4 Extração de informação [24] CI-4 [4] CI-3 42 - NoSQL openEHR Couchbase; XML BaseX, eXistdb, Berkeley DB XML yourEHRMNoSQL openEHR/ ADL AQL - Mon- EN13606 goDB [37] CI-3 - [33] CI-5 - [3] CHISTAR Nãorelacional - HBase CI-3 [35] CI-3 PyEHR [22] CI-3 16 [23] CI-3 - [42] CI-5 - NoSQL openEHR ADL AQBE - MongoDB NoSQL - HL7/CDA SQL Server Estende API o ope- Java nEHR e o HL7 openEHR ADL API Java ou HQL Múltiplos - Multidriver Relacional, openEHR XML, OO com SQL Server, MySQL e outros Relacional openEHR PostgreSQL AQL OO - openEHR Db4o, Intersystem Caché QbE, Native Queries e SODA Documentos XML e JSON por paciente Documento JSON com coluna por caminho de arquétipo Documento JSON por arquétipo Tabela de pares chave-valor generalizados com conceito individual por linha Tabelas com pares chave/valor conforme tipos de dados do MR - SQL, AQL, XQuery, SQL+XPath e outros - Duas tabelas, uma contendo XML serializado do paciente. Objeto Caché Proxy ou Db4o por RES 3.4 Extração de informação 43 para-muitos cria-se uma nova tabela com FKs para as duas tabelas associadas. Em relação à herança, o mapeamento fica a cargo de templates que associam os campos de arquétipos especializados a um subconjunto de campos correspondentes nos arquétipos generalizados[55]. Para instâncias HL7 RIM, cria-se uma tabela por classe, de modo a não armazenar atributos herdados[48]. Uma forma de otimizar a persistência é através do uso de índices. Para tanto, os estudos recomendam o uso de índices nos itens de dados de consulta[55] e de identificação[55][48], este último relacionado à Entidade OEAV da classe Observation. Ambas as estratégias[55][48] fazem a conversão dos modelos de BDs com técnicas de mapeamento amplamente conhecidas na área de Banco de Dados, como no caso do tratamento de herança e associação de entidades. Isto significa que os estudos aplicam estratégias comuns, em sua maioria, no cenário específico de dados em saúde. Além disso, o BD relacional baseado em arquétipos[55] pode ser inflexível, já que exige que todos os conceitos sejam previamente conhecidos. 3.4.6 Critério CI-3 (implementações) Com exceção de um artigo de revisão[22], os estudos que descrevem a camada ou serviço de persistência de dados multinível pelo critério CI-3, abordam um único sistema ou arquitetura. Para tanto, esta revisão relata as tecnologias usadas na persistência e o formato de organização dos arquivos no BD. Dentre os estudos são descritos os sistemas GastrOS[22][1], iCabiNET[36], eHealthCom[46], LiU EEE[22][52], yourEHRM[4], CHISTAR[3] e pyEHR[35]. Os estudos utilizam os seguintes BDs e Sistemas Gerenciadores de Bancos de Dados (SGBDs): BDs relacionais com os SGBDs SQL Server[55][22][29], MS Acess[1], SQLite[22][1], MySQL[22][36][21], PostgreSQL[23] ou fornecem uma interface ODBC[43]; BDs XML com os SGBDs Oracle XML DB[22][34], BaseX[24][54][22][52][46], eXistdb[24][22][52][32] e Berkeley DB XML[24]; BDs NoSQL com os SGBDs CouchBase[24], MondoDB[37][4] e SQL Server[33]; BD nãorelacional com o SGBD HBase[3]; BD orientado a objetos com os SGBDs Db4o e Intersystem Caché[42] e; BDs múltiplos[35], isto é, diferentes tipos de BDs oferecidos pelo serviço, desde que os sistemas que usem estes BDs implementem a interface multi-driver fornecida. Os estudos empregam os seguintes padrões de definição multinível da estrutura dos dados para persistência: openEHR[24][55][54][22][52][35][37][1][46][4][32][42][23], EN13606[36][4][43], HL7/CDA[34][33], HL7 modificado[29][3] e openEHR modificado[3][21]. Com base nestes padrões, os estudos utilizam os seguintes mecanismos para consulta dos esquemas de dados: AQL[54][22][52][35][4], SQL[55][22][34], 3.4 Extração de informação 44 XQuery[22][52][34], .NET LINQ[29], AQBE[37], HQL[3], API Java[3], QbE, Native Queries e SODA[42]. Os estudos do critério CI-3 geralmente descrevem, de forma sucinta, a estrutura do modelo de BD utilizado para persistência. Alguns BDs de SISs multiníveis são formados por tabelas relacionais, em que cada tabela representa um arquétipo[55] ou uma classe do MR[43][29][21]. Essas tabelas são geradas pelo mapeamento manual[55] e implementadas com o apoio de ferramentas que auxiliam no mapeamento objetorelacional[29][21], por exemplo, pelo Hibernate[21][11][50][56]. Também é possível serializar objetos do MR[1] ou o próprio RES[23] de/para o formato XML e persisti-los em tabelas relacionais. Na maioria dos casos o BD é composto por documentos XML, seja por paciente[24][54] ou por RES[52][46][32] ou, ainda, por visita em um diretório hierárquico[34]. BDs NoSQL são constituídos por tabelas de pares chave-valor generalizados[33] (contendo conceito por linha) ou por documentos JSON. Estes documentos JSON são gerados por paciente[24] ou por arquétipo, contendo uma coluna para cada caminho do arquétipo[37][22]. No caso do BD não-relacional, são armazenadas tabelas com pares chave-valor conforme os tipos de dados do MR[3]. O BD OO pode persistir um objeto Caché Proxy ou Db4o para cada RES[42]. 3.4.7 Critério CI-4 (benchmarks) Os benchmarks dos estudos do critério CI-4 são formados por bases de dados conforme o modelo de um nível (convencional), das quais, cinco, no total, são relacionais[24][55] e uma é estruturada textualmente[33]. Em relação aos dados modelados com a abordagem multinível, os benchmarks são compostos por bases relacionais[24][55][21], XML[24][54][46][33], NoSQL[24][37][33], Node+Path[55], XML-relacional e OO[42]. Para os BDs baseados na modelagem multinível, foram utilizados os modelos de conceitos presentes nos repositórios CKM[24][55][37][21][46], NHS[21] e repositórios próprios não divulgados[24][55][33][2][42], incluindo um repositório de SynOD (Dicionário de Objetos Synapses)[2] e um com conceitos extraídos do BD empregado na avaliação[33]. Em alguns casos[24][55][37], apenas parte do repositório é importado para o benchmark. As bases de dados dos benchmarks são compostas por RESs, com as seguintes quantidades máximas por estudo: 120[21], 2.400[42], 3.226[2], 30 mil[55][54][46], 50 mil[33] e 4,2 milhões[24]. Destes registros apenas um conjunto é sintético[46] (gerado com base em amostras). Em média, são disponibilizadas 7 consultas por estudo[24][55][54][37][33]. Apesar de serem fornecidos benchmarks com dados reais, a 3.4 Extração de informação 45 Tabela 3.16: Estudos que descrevem benchmarks para SISs com modelagem multinível (CI-4). D1 [54] CI-3 D2 - D3 - [21] CI-3 CKM e NHS 16 arquétipos do CKM e 1 criado. - [55] CI-4 [2] CI-5 [37] CI-3 [46] CI-3 SynOD (Dicionário de Objetos Synapses) 40 arquétipos do CKM CKM D4 XML nativo - D7 >4 Relacional D6 1 mil, 10 mil e 30 mil 120 Relacional Relacional (Mapeamento Relacional de Arquétipos - ARM) - Node+Path 30 mil 7 - 3.226 - - NoSQL - - 16 - - XML - - NoSQL, XML não nativo e nativo. NoSQL, XML e relacional 1 mil, 10 mil e 30 mil 1 mil, 5 mil, 10 mil e 50 mil 10 mil, 42 mil, 100 mil, 424 mil, 1 mi, 4,2 mi 2.400 8 [33] CI-5 Conceitos extraídos do BD avaliado Textual (formatado) [24] CI-4 19 arquétipos do CKM ou criados 4 relaci- onais [42] CI-5 9 arquétipos criados - - D5 - XMLrelacional e OO - 5 4 3.4 Extração de informação 46 Tabela 3.17: Estudos que avaliam a camada ou serviço de persistência de dados presentes em SISs com modelagem multinível (CI-5). E1 [54] CI-2 E2 - E3 0,65 ms E4 Mil: 20 ms; 10 mil: 176 ms; 30 mil: 523 ms [55] CI-3 Relacional: 1,6 GB; ARM: 2,9 GB; Node+Path: 43,87 GB EAV = 1,26*OEAV Relacional: 272 ms; ARM: 243 ms; Node+Path: 165.246 ms EAV = 15,15*OEAV Relacional: 6.082 ms; ARM: 379 ms; Node+Path: 10.708 ms EAV = 56,3*OEAV [43] CI-3 - - - - [2] CI-5 - - - - [34] CI-5 - - 10,2 ms Tempo de inserção: 15,08 ms [46] CI-3 - 1 mil: 4 ms; 10 mil: 5 ms; 30 mil: 5 ms 1 mil: 126 ms; 10 mil: 232 ms; 30 mil: 594 ms [Inserir RES] 1 mil: 34 ms; 10 mil: 36 ms; 30 mil: 49 ms [48] CI-4 E5 Tempo de inserção aumenta com o volume, para 30 mil: 423 ms - E6 Eficaz para consulta baseada em indivíduos. Consulta agilizada pelos índices e caching de dados em arquétipos descendentes Eficiente para buscas, dados esparsos e de alta dimensão; Consome menos espaço que EAV Não opera em um cenário real Dados seguem hierarquias; alocação explícita de memória gera desperdício Índices com Árvore B e XPath melhoram consultas baseadas em indivíduo e população, respectivamente Persistência de RES é eficiente, ao contrário de consulta baseada em população e inserção de Compositions 3.4 Extração de informação 47 [33] CI-5 Textual: 120 MB - [24] CI-4 [100 mil] Relacional: 0,15 GB; XML: 2,8 GB (BaseX), 7,6 GB (eXistdb), 8,9 GB (Berkeley); NoSQL: 0,48 GB [100 RES] OO: 105MB (Caché), 108MB (Db4o); XMLRelacional: 90MB (SQL Server FI), 102MB (SQL Server XML) - [42] CI-5 [Recuperar COMPOSITION por UID] OO: 500 ms (Db4o); XMLRelacional: 10 ms (SQL Server FI), 240 ms (SQL Server XML) [50 mil RESs] Chavevalor generalizado: 1.414 ms; XML não nativo: 4.722 ms; XML nativo: 8.407 ms [100 mil] Relacional: 30 ms; XML: 13 s (BaseX), 97 s (eXistdb), 270 s (Berkeley); NoSQL: 18 ms - - - [Inserir RES] OO: 3 s (Caché), 0,7 s (Db4o); XMLRelacional: 0,25 s (SQL Server FI e SQL Server XML) Chave-valor generalizado é mais rápida, mas tamanho tem crescimento exponencial, já o do XML é mínimo. Ambos têm esquema flexível. Couchbase é mais eficiente do que SGBDs XML e MySQL em consultas agregadas, mas requer a indexação de cada consulta Com exceção das consultas baseadas em conteúdo em que o Caché é mais rápido, o SQL Server é melhor. Já o desempenho do Db4o não é aceitável 3.5 Sumarização dos resultados 48 quantidade de registros é pequena, exceto em um estudo[24], se comparada à de sistemas reais. 3.4.8 Critério CI-5 (avaliação) De acordo com os estudos do critério CI-5, o modelo relacional[24][55][42] é o modelo de BD baseado na abordagem multinível que menos consome espaço, quando comparado ao Node+Path, ARM (Archetype Relational Mapping) [55], NoSQL, XML[24] e OO[42]. Consultas baseadas em indivíduos são mais rápidas no BD Node+Path do que nas soluções relacional e ARM[55]. A solução OO do Intersystem Caché, comparado ao XML-relacional do SQL Server com Fast Infosets, se sobressai em consultas baseadas em conteúdo[42]. Por outro lado, não são recomendadas consultas baseadas em população em BDs XML[24][33]. Consultas baseadas em indivíduos são mais rápidas do que consultas baseadas em população[55][54][46] e do que inserções de Compositions em RESs[46]. Além disso, as consultas podem ser agilizadas pelo uso de índices[24][55][34] e caching[55]. A solução chave-valor generalizada é rápida, mas tem um tamanho significativo[33]. Adicionalmente, a alocação de coleções deve ser dinâmica para evitar desperdício de memória[2]. Com relação à eficiência dos modelos de dados, o OEAV é mais eficiente do que o EAV[48]. Por outro lado, uma das soluções relacionais apresentadas não consegue operar em cenário real[43], assim como a solução OO com o SGBD Db40[42]. 3.5 3.5.1 Sumarização dos resultados Cálculos estatísticos As Tabelas 3.18 e 3.19 mostram as quantidades de estudos classificados por critério de inclusão e exclusão na segunda fase de seleção. Para todas as fontes, com exceção da Google Scholar, houve uma redução de cerca de 55% dos estudos incluídos em relação a primeira fase de seleção. A exclusão dos estudos se deu, principalmente, pelo fato dos autores relatarem determinadas contribuições nos resumos dos artigos relacionadas a persistência de dados clínicos baseados na modelagem multinível, mas ao longo dos trabalhos estes tópicos não são abordados ou o são superficialmente. Para a fonte Google Scholar, a redução dos artigos incluídos na segunda fase (conforme a Tabela 3.19) em relação a primeira fase é de cerca de 88%. Isto ocorre porque a fonte indexa trabalhos de caráter não científico em que não é verificado a comprovação do que é apresentado no resumo em relação ao que é relatado no restante do texto. Outro fator é que a fonte indexa teses e dissertações que agrupam vários artigos previamente abordados por outras fontes. 3.5 Sumarização dos resultados 49 Tabela 3.18: Quantidades de estudos por CI/CE na segunda fase de seleção de estudos. IEEE PMC PubMed Science CI-1 1 0 0 0 CI-2 0 0 0 0 CI-3 5 2 2 1 CI-4 0 1 1 0 CI-5 0 1 0 1 Incluídos 6 4 3 2 CE-1 42 96 78 142 CE-2 0 0 5 4 CE-3 0 0 1 0 CE-4 0 0 0 0 CE-5 3 3 6 3 Excluídos 45 99 90 149 Total 51 103 93 151 Scopus Springer TOTAL 0 0 1 1 0 1 3 0 13 0 0 2 1 0 3 5 0 20 302 82 742 28 6 43 2 0 3 4 0 4 9 4 28 345 92 820 350 92 840 Tabela 3.19: Quantidade de estudos por CI/CE na segunda fase de seleção da fonte Google Scholar CI CI-1 0 CE CE-1 231 CI-2 0 CE-2 76 CI-3 1 CE-3 7 CI-4 0 CE-4 5 CI-5 1 CE-5 14 Incluídos 2 Excluídos 333 Total de estudos 335 Apesar do resultado ruim, a fonte Google Scholar teria um grande número de artigos incluídos (16 dos 22 estudos incluídos na segunda fase) caso fosse analisada antes das demais fontes. O mesmo ocorre com a fonte Scopus, na qual seriam indexados 15 dos 22 estudos incluídos na segunda fase. Por outro lado, a fonte SpringerLink seria responsável por indexar 2 artigos dos 22 estudos. 3.5.2 Análise sensitiva Com exceção da fonte Google Scholar, a inclusão dos estudos considera a persistência em sistemas baseados na modelagem multinível, apesar de sistemas baseados no openEHR serem suficientes, isso dá margem para a busca de trabalhos correlatos que sejam diferenciados apenas por questões tecnológicas. Além disso, várias strings de busca foram testadas de modo a abranger diferentes palavras-chave e os artigos de controle. A robustez da revisão sistemática também pode ser verificada durante a primeira fase de seleção, principalmente entre os artigos excluídos. Nos casos de dúvidas para incluir ou excluir um estudo, as palavras-chave foram pesquisadas no corpo do texto para 3.6 Respostas às questões de pesquisa 50 Figura 3.1: Quantidades de estudos que abordam cada critério de inclusão na segunda fase de seleção de um total de 22 estudos (considerando interseções). encontrar menções sobre a persistência de dados clínicos modelados com a abordagem multinível. 3.5.3 Plotagem Independentemente de fontes de indexação, a segunda fase de seleção resultou em 22 estudos incluídos. Cada estudo pode abordar um número variado de critérios de inclusão. Neste sentido, a Figura 3.1 expõe as quantidades de estudos que abordam cada critério de inclusão de modo primário ou secundário. A maior parte dos estudos trata de aspectos relacionados à implementação do serviço de persistência, mas apenas dois[55][48] se aprofundam em questões envolvendo o mapeamento do modelo conceitual para um esquema de BD. 3.6 Respostas às questões de pesquisa Os requisitos dos artigos para o desenvolvimento da camada de persistência centram-se em critérios de flexibilidade e adaptabilidade do modelo de BD e de desempenho na manipulação dos dados. Esses requisitos devem ser atingidos considerando a redução do tempo de resposta para consultas. Ambas as estratégias de mapeamento do modelo de BD[55][48] fazem uso de estratégias amplamente conhecidas na área de Banco de Dados. Isto significa que são 3.7 Considerações Finais 51 aplicadas estratégias comuns, em sua maioria, no cenário específico de dados em saúde. Além disso, um BD relacional baseado em arquétipos[55] proporciona inflexibilidade, já que exige que todos os conceitos sejam previamente conhecidos. Em relação às tecnologias empregadas no desenvolvimento da camada de persistência, percebe-se o uso frequente de dados baseados no openEHR. A persistência dos dados ocorre nos tradicionais BDs relacionais ou em BDs XML, já que os dados são hierárquicos. Contudo, formatos livres de esquemas podem ser vantajosos na persistência de dados em saúde. A escolha da organização dos arquivos (por exemplo, por paciente ou por conceito) depende dos requisitos de cada sistema (por exemplo, requisitos direcionados para consultas baseadas em indivíduo ou em população). Apesar de serem fornecidos benchmarks com dados reais, a quantidade de registros é pequena, exceto em um estudo[24], quando comparada ao volume de dados presente em sistemas reais. Em resposta à questão de pesquisa principal, foram encontradas estratégias de persistência que realizam o mapeamento do MR e do modelo de arquétipos para BDs amplamente conhecidos. Para isto, utilizam-se técnicas de mapeamento comuns e não técnicas otimizadas que contemplem as especificidades do modelo multinível. Em resposta à questão secundária 1, os estudos requerem, geralmente, o uso de um BD que seja flexível na definição do esquema e eficiente em desempenho e espaço. As soluções dos estudos mostram-se mais vantajosas para consultas baseadas em indivíduo do que para qualquer outra operação sobre o BD. Para a questão secundária 2, um dos benchmarks encontrados apresenta um volume de dados significativamente superior aos demais. Todavia, os estudos não apresentam o desenvolvimento sistemático e detalhado dos benchmarks. 3.7 Considerações Finais Ao longo deste trabalho deve-se desenvolver uma estratégia para persistência de dados modelados conforme o openEHR que atenda aos requisitos de qualidade (requisitos não funcionais) identificados pelo critério CI-1, considerando, principalmente, o consumo de espaço em memória. A estratégia deve considerar as especificidades do modelo multinível no mapeamento do MR para uma estrutura de dados otimizada em relação as propostas dos trabalhos do critério CI-2. CAPÍTULO 4 Mapeamento de Dados Clínicos para Persistência Este capítulo especifica a estratégia de persistência de dados clínicos baseados no openEHR. A Seção 4.1 apresenta uma visão geral da estratégia de acordo com os requisitos necessários para seu desenvolvimento. Já na Seção 4.2, este trabalho especifica a estratégia quanto ao seu formato, contendo estruturas mapeadas a partir do MR. As regras aplicadas durantes este mapeamento são conceituadas na Seção 4.3 4.1 Visão Geral Conforme o objetivo desta pesquisa, este trabalho deve apresentar uma estratégia para realizar a persistência de dados clínicos a partir das classes do MR, incluindo seus tipos de dados básicos e complexos, para estabelecer estruturas que os comportam. A estratégia proposta potencialmente servirá de referência para o desenvolvimento de sistemas clínicos, uma vez que contempla as especificidades do MR do openEHR. A solução apresentada considera a redução do custo de memória, justificada pelo atual uso intenso de sistemas móveis e embarcados, mas de modo a não inviabilizar o tempo de resposta do sistema. 4.1.1 Requisitos para a persistência de dados Conforme os requisitos de qualidade encontrados durante a Revisão Sistemática do Capítulo 3, o desenvolvimento da camada de persistência de dados baseados no openEHR deve permitir que o SIS seja escalável horizontal e verticalmente. Neste sentido, o mapeamento do modelo de dados deve considerar o uso de estruturas otimizadas, ao contrário das propostas existentes que mapeiam uma classe para cada conceito do MR [29][42][46]. Idealmente, uma proposta para a persistência de dados clínicos deve promover o processamento de um grande volume de RESs[29], e ser mais rápida do que as soluções 4.1 Visão Geral 53 encontradas, como XML, Node+Path, EAV e ORM[55]. Na direção destes desafios, este trabalho prioriza o desenvolvimento de uma estratégia de persistência de dados baseados no openEHR que considera a limitação de recursos computacionais, especialmente o uso de memória. Outros pressupostos são considerados para a estratégia introduzida nesta pesquisa: • preservação da arquitetura de múltiplos níveis, em que há camadas distintas para o modelo de conhecimento (domínio da saúde) e o modelo de informação; • priorização do modelo de informação, tal que as estruturas de persistência sejam independentes dos conceitos clínicos definidos no modelo de conhecimento; • promoção da reutilização de estruturas de persistência, as quais são compartilhadas por qualquer RESs; • redução do número de classes do MR que serão propriamente persistidas, com escopo delimitado a classes concretas do MR. 4.1.2 Estratégia de persistência O armazenamento de dados baseados no openEHR ocorre sobre uma instância do grafo do MR, cuja estrutura é conhecida pelo SIS. Para se realizar a persistência deste grafo, deve-se requisitar o armazenamento dos valores que compõem seus objetos. Em outro momento, a recuperação retorna os valores dos campos dos objetos para uma nova instanciação do grafo. Na estratégia proposta, a persistência propriamente dita ocorre sobre as classes concretas do MR, e para cada uma dessas classes, devem ser implementados métodos específicos que realizam o armazenamento e a recuperação de dados. Por exemplo, para que o armazenamento de dados mantidos em uma instância da classe COMPOSITION seja efetivada, recorre-se ao método que armazena especificamente uma instância de COMPOSITION, não sendo uma abordagem que considera objetos genéricos. As classes do MR do openEHR formam uma hierarquia que baseia a persistência de dados. Assim, para armazenar dados clínicos em conformidades às especificações do openEHR, é necessário que sejam apontadas as classes concretas que participam da definição de um registro clínico. Já para realizar a recuperação de uma instância do grafo, é preciso apontar os tipos das classes que admitem mais de uma alternativa. Demais classes de tipo não-folha possuem classes descendentes conhecidas a partir da especificação do próprio MR. Por exemplo, conforme observado na Figura 2.3, DV_QUANTITY é uma classe do tipo folha que possui três atributos[45]: magnitude, precision e units. Para se armazenar dados clínicos baseados nessa classe, é necessário gravar os valores de seus três atributos 4.2 Especificação da estratégia 54 e os valores de atributos de suas classes ancestrais até a raiz, incluindo classes de associação e agregação, a saber: DV_AMOUNT, DV_QUANTIFIED, DV_ORDERED, etc, até atingir uma classe raiz, como é o caso de COMPOSITION. O armazenamento de cada objeto dá-se pelo empilhamento dos valores dos atributos da classe folha (base da pilha), caminhando pela hierarquia de classes até atingir a classe raiz (topo da pilha). Ao se atingir a raiz, a representação final dos dados clínicos é construída pela concatenação de valores a partir do desempilhamento dos dados, de modo que a recuperação ocorra de forma sequencial no espaço de memória final. 4.2 Especificação da estratégia A estratégia desenvolvida faz o mapeamento entre objetos do MR e codificações binárias, através da serialização e desserialização dos dados. Portanto, é necessário especificar o formato utilizado no armazenamento, a sequência geral de codificação e sequência específica (com detalhes das classes do MR). 4.2.1 Formato da estrutura de persistência Para realizar o armazenamento propriamente dito dos dados clínicos baseados na especificação do MR do openEHR, uma estrutura do tipo vetor é utilizada, tal que possa conter os valores dos atributos de uma classe do tipo concreta e os valores dos atributos de suas classes ancestrais. O vetor é codificado por uma sequência de bytes, resultando em um vetor binário. A persistência de dados é realizada sobre um grafo de objetos que representa instâncias de um subconjunto de classes do MR do openEHR. Assim, o vetor gerado é composto por n vetores, onde cada vetor i se refere à serialização de um objeto do grafo com uma quantidade reduzida de metadados (quando comparado a trabalhos correlatos [29][42][46]), isto é, objetos com tamanho reduzido. O MR contém mais de 150 classes. Para que uma estrutura de dados do tipo vetor suporte a persistência de dados modelados conforme essas classes, é preciso que seja realizado o mapeamento de cada uma das mais de 150 classes com seus atributos e seus relacionamentos para a estrutura desejada. Para isto, deve ser considerado o tratamento de tipos de dados simples e complexos, como listas de tamanho variável, mídias com tamanho superior à memória principal e classes recursivas. 4.2.2 Estrutura geral para a codificação de um registro clínico Para que a codificação do registro clínico através de um vetor de bytes ocorra de forma determinística, devem ser previamente conhecidos: 4.2 Especificação da estratégia • • • • • 55 a hierarquia das classes do MR; os atributos pertinentes a cada classe definida no MR; o formato aplicado a cada tipo de dados básico; os valores dos identificadores das classes concretas; e o formato adotado para a ocorrência de coleção de dados. Um registro clínico é codificado conforme a sequência que estrutura o vetor: 1. identificador de classe (concreta); 2. dados de tamanho fixo; 3. dados de tamanho variável, estrutura recursiva composta por: (a) dados de tamanho fixo; (b) dados de tamanho variável. A estrutura recursiva ocorre quando o tipo de um atributo refere-se a uma classe do modelo de referência, a qual terá seus dados de tamanho fixo e variável. Ou seja, é estabelecida o aninhamento de classes na definição dos seus tipos de atributos. Dados de tamanho fixo referem-se a tipos de dados primitivos do openEHR, tais como Integer, char e Boolean. Dados de tamanho variável são representados por coleções, tais como List e Hashmap (denotado por Hash pelo openEHR). Uma String é um tipo primitivo, mas pode ser classificada como uma coleção de caracteres neste contexto. 4.2.3 Mapeamento das classes do MR O esquema de dados gerado a partir do MR é representado em uma planilha. Este esquema é exemplificado através da Figura 4.1 e apresentado integralmente no Apêndice B. Para cada classe do MR são citados: a constante que identifica a classe; o nome da classe; o tamanho, em bytes, de cada atributo e do total da classe com base na estratégia de persistência definida; os nomes dos atributos da classe; e, por fim, observações relacionadas ao tipo do atributo ou classe. Por exemplo, para a persistência de um objeto do tipo DV_QUANTITY é necessário armazenar os atributos das classes ascendentes, indicado em “dvAmountDvQuantity”. Este atributo utiliza 1 byte para armazenar o tipo da classe e requer um espaço para armazenar 3 Strings, 3 objetos, uma lista e 11 bytes de tipos primitivos, incluindo o tipo da classe. Em seguida são armazenados os atributos “precision” e “magnitude” de tipos “Integer” e “Float”, respectivamente. Por fim, armazena-se o tamanho da String “units”, seguido de seu valor propriamente dito, totalizando 4 Strings, 3 objetos, uma lista e outros 19 bytes. Mais explicações sobre a estratégia empregada na planilha do Apêndice B são dadas no restante deste capítulo. 4.3 Regras de mapeamento das estruturas de dados 56 Figura 4.1: Classes do MR mapeadas para o esquema de dados desenvolvido. Listas e objetos requerem mais espaço do que strings e demais tipos primitivos, portanto uma classe como OBSERVATION composta por, pelo menos, 39 listas consome, em média, mais espaço do que as outras classes do MR. 4.3 Regras de mapeamento das estruturas de dados Para a realização do mapeamento é dada atenção aos membros de objetos de tipos variáveis (relativos a classes polimórficas) e membros de tamanhos variáveis. Além disso, propõe-se a separação lógica do objeto entre áreas de metadados, de membros com tamanho fixo e de membros com tamanho variável. 4.3.1 Identificadores de tipo de classe Apesar do MR não ser uma árvore, o modelo possui classes que funcionam como raízes. A partir destes pontos de início, pode-se compor todo o restante da estrutura necessária para representar um registro clínico. São exemplos de raízes as classes COMPOSITION, ELEMENT, ROLE e SECTION. A construção do vetor ocorre para objetos de classes concretas, devendo-se, portanto, ser conhecida a estrutura hierárquica para tal classe, conforme definido pelo MR. No conteúdo do vetor, é necessário incluir o identificador do tipo de classe para a raiz da hierarquia do objeto pertinente ao registro clínico em questão, bem como 4.3 Regras de mapeamento das estruturas de dados 57 Tabela 4.1: Exemplo de codificação de trecho do vetor: tipo p do objeto, um booleano b e uma lista L com t elementos. p i n L0 ... Ln identificadores de classes descendentes cujas instâncias podem assumir diferentes tipos. Os identificadores de classe são constantes codificadas para ocupar o tamanho de um byte. Esses identificadores são definidos na coluna “Identificador” da Tabela B.1 e são utilizados para especificar ou reconhecer os objetos de tipo variável que compõem os dados a serem persistidos. O exemplo da Tabela 4.1 pode ser visto como um exemplo de serialização do grafo de objetos baseado no MR do openEHR. Para a ilustração do vetor é feita a abstração de parte do grafo, isto é, o objeto raiz é representado sem detalhar os objetos que o compõe. Desta forma, o exemplo representa um objeto raiz com tipo variável p. Para isto, p assume um valor de identificação relativo a uma das classes do MR, cujos identificadores são previamente definidos. De acordo com a hierarquia do modelo, todo o restante da estrutura do vetor passa a ser conhecida, desde que seja formada por objetos de tipo fixo. O mesmo raciocínio de identificação de tipo deve ser empregado na persistência de objetos que admitem a variação de tipo, por exemplo no caso da classe abstrata DATA_VALUE que possui vários tipos de classes especializadas e no caso da classe concreta DV_TEXT, que também pode assumir o tipo DV_CODED_TEXT. Os demais objetos, de tipo fixo, não necessitam de identificadores de classe para a codificação do registro clínico (vetor), pois suas classes são previamente conhecidas a partir da especificação do MR. 4.3.2 Separação entre atributos de tamanho fixo e variável Algumas decisões de projeto foram tomadas para realizar a persistência dos dados baseados no openEHR. Conforme ressaltado anteriormente, para projetar a camada de persistência é preciso mapear as classes do MR para um modelo de dados lógico estruturado em um vetor. As classes concretas de tipo e tamanho fixo são trivialmente persistidas no vetor, por outro lado classes de tamanho variável ou com membros (atributos) de tipo variável seguem uma estrutura mais elaborada. Para cada objeto, com seus respectivos membros, é feita a separação entre área com elementos de tamanho fixo no início do vetor e área com elementos de tamanho variável no final. Como exemplo, considere a Tabela 4.1. O vetor é iniciado com o identificador de tipo p do objeto, ocupando 1 byte. Posteriormente, são persistidos os membros de tipos primitivos, este é o caso do inteiro i que ocupa 4 bytes. Para conjuntos de objetos (coleções), guarda-se a cardinalidade n em um espaço de 1 a 5 bytes. Em 4.3 Regras de mapeamento das estruturas de dados 58 Tabela 4.2: Exemplo de codificação de trecho do vetor: tipo p do objeto, cardinalidade n da lista L, tipo t de cada elemento da lista, um inteiro i e uma lista L com n elementos. p n t0 ... tn i L0 ... Ln seguida são persistidos todos os objetos da coleção, como, por exemplo, uma lista composta por L0 . . Ln . 4.3.3 Área de metadados No caso de objetos formados por mais de uma String, as cardinalidades desses membros podem ser armazenadas em uma área anterior a de tamanho variável, denominada área de metadados. Assim, a soma dos tamanhos das Strings pode indicar o próximo ponto de leitura, possibilitando um “salto” maior no vetor. Caso a prioridade seja a redução do tempo de processamento, é possível armazenar o tamanho dos objetos e referências de listas, e aplicar o mesmo raciocínio de “saltos” mais longos. A Tabela 4.2 representa um exemplo deste formato. De acordo com uma ordem predefinida, o vetor inicia-se pelo tipo do objeto, seguido pelo tamanho da lista que compõe um de seus membros. Como os elementos desta lista são de tipos variáveis, seguese o tipo de cada elemento, para somente então armazenar o conteúdo da área de tamanho fixo e de tamanho variável. Para estratégias guiadas por consultas baseadas em população, isto é, recuperação de objetos com um determinado tipo, recomenda-se armazenar os identificadores de objetos de tipo variável na área de metadados. Deste modo este tipo de consulta é realizada sem a necessidade de consultar dados de tipos indesejáveis. 4.3.4 Codificação da cardinalidade de coleções e Strings Ainda sobre o conteúdo da Tabela 4.1, nota-se que n é a cardinalidade da coleção. O openEHR estabelece a especificação de tipos básicos que define o o uso do tipo inteiro com capacidade de armazenamento de 32 bits equivalente a 4 bytes [27]. Tendo em vista o requisito inicial de redução do custo de memória, a codificação de um inteiro pode variar de acordo com o tamanho efetivo da coleção. Para se evitar o desperdício do tamanho da coleção em 4 bytes, pode-se utilizar um tamanho com 1, 2, 3 ou 5 bytes. Nesta abordagem são utilizados 2 bits para indicar o tamanho do inteiro. Consequentemente, são necessários 5 bytes para armazenar 31 ou 32 bits de informação. Por exemplo, para uma coleção de tamanho 50, são usados, por padrão, 4 bytes. Já na abordagem proposta é necessário 1 byte. Destes 8 bits, 2 bits 4.4 Considerações finais 59 Tabela 4.3: Codificação de tamanho de atributos de tamanho variável. No. de bytes 1 2 3 5 No. mínimo de elementos 0 26 214 222 No. máximo de elementos 26 − 1 214 − 1 222 − 1 232 − 1 indicam a quantidade 1 referente ao comprimento do tamanho da coleção. Os demais 6 bits representam o tamanho 50 da coleção. O conteúdo da Tabela 4.3 denota a codificação usada para tamanhos de coleções: a primeira coluna representa o número de bytes usados para o valor do tamanho; as colunas segunda e terceira definem a faixa de pertinente ao número de bytes da codificação. Vale ressaltar que os dois bits iniciais do primeiro byte da codificação, definem o próprio número de bytes utilizados na codificação, a saber: • • • • 4.3.5 o valor binário “00” estabelece 1 (um) byte para a codificação de tamanho; o valor binário “01” estabelece 2 (dois) bytes para a codificação de tamanho; o valor binário “10” estabelece 3 (três) bytes para a codificação de tamanho; o valor binário “11” estabelece 5 (cinco) bytes para a codificação de tamanho. Concatenação de atributos O mapeamento utiliza o conceito de armazenamento “inline”, em que um ou mais atributos de uma classe referenciada são concatenados em apenas um campo da classe referenciadora. Com a concatenação física de n Strings, por exemplo, n tamanhos de Strings podem ser substituídos por apenas uma referência para um próximo membro. Estes casos devem ser especificados durante o mapeamento das classes do MR para o formato pretendido. Apesar dos membros serem separados logicamente, os objetos nesta estratégia são armazenados de forma inline, uma vez que os objetos são persistidos sequencialmente, conforme a especificação do MR. Neste caso, não é necessário o uso adicional de referências para avançar entre diferentes pontos do vetor, fazendo com que o acesso seja realizado de forma contínua. 4.4 Considerações finais A camada de persistência proposta serializa o grafo de objetos do MR em uma sequência de bytes. A serialização pode ser destinada para locais como arquivos e serviços 4.4 Considerações finais 60 web. Durante a recuperação carrega-se uma cópia do vetor na memória principal. Para a persistência de um grafo de objetos extenso, com conteúdo multimídia, por exemplo, deve-se utilizar a memória secundária. Neste caso apenas partes do grafo são carregadas em memória principal conforme a necessidade. CAPÍTULO 5 Algoritmos de persistência Este capítulo apresenta uma estratégia possível de persistência, baseada nas regras de mapeamento definidas no Capítulo 4. Na Seção 5.1 é feita uma descrição breve de funções assumidas para a persistência dos dados. Na Seção 5.2, são apresentados os algoritmos empregados para a realização da serialização, seguidos dos algoritmos de desserializacao na Seção 5.3. O impacto no custo de memória e de processamento, gerados pelos algoritmos, são analisados na Seção 5.4. Por fim, a Seção 5.5 relata um exemplo aplicado sobre um pacote do openEHR. 5.1 Funções auxiliares Em todos os algoritmos apresentados posteriormente, assume-se a disponibilização de funções trivialmente implementadas sobre o MR do openEHR. São elas: • Integer p ← tipo (RMObject objeto): retorna a constante previamente definida para o tipo do objeto; • byte[] V ← obtemValor(RMObject o): recupera o valor do atributo o, cujo tipo é conhecido, convertido em um vetor de bytes; • defineValor(RMObject o, byte[] V): atribui o conteúdo de v ao valor do atributo o, após a conversão do vetor para o tipo conhecido do membro; • byte[] W ← obtemBytes(byte[] V, int i, int j): obtém os bytes contidos no vetor V da posição i até a posição i + j − 1; • defineBytes(byte[] V, int i, byte[] W): atribui ao vetor V , da posição i até a posição i + |W | − 1, o vetor W ; • RMObject c ← chave(Hash h, Integer i): retorna o objeto chave do hashmap h na posição i; • RMObject c ← valor(Hash h, Integer i): retorna o objeto valor do hashmap h na posição i; • Integer s ← vetorBytesParaInteiro(byte[] V): retorna o inteiro convertido a partir do vetor de bytes V; 5.2 Serialização de dados 62 • Byte b ← (a >> b) | (c << d): retorna o byte a com b bits deslocados à direita, sobre o qual é aplicada a operação booleana “ou” com o byte c deslocado d bits à esquerda; • Integer s ← tamanhoFixo(Integer p): retorna o tamanho predefinido em bytes ocupado por um elemento de tipo p, conforme a especificação do openEHR. • List L ← L + RMObject o: adiciona o objeto o à lista L; • Hash S ← S + RMObject c + RMObject v: adiciona o par de objetos chave c e seu respectivo valor v ao hashmap S. 5.2 Serialização de dados O armazenamento de cada objeto do MR depende de um algoritmo específico, o qual é parametrizado com os objetos previstos na especificação. Por exemplo, para o armazenamento de um DV_PARAGRAPH deve ser implementado, especificamente, um algoritmo que exija um objeto composto pelos campos (membros) de um DV_PARAGRAPH. Algoritmo 5.1: serializaObjeto(o) Entrada: objeto o a ser serializado em uma sequência de bytes. Saída: Vetor de bytes contendo a serialização do objeto o. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Cria vetor V V [0] ← tipo(o) j←1 para todo a ∈ A(o) faça Cria vetor S se grupo(tipo(a)) = PRIMITIVO então S ← serializaPrimitivo(a) fim se grupo(tipo(a)) ∈ {COLECAO, COLECAO_PRIMITIVO} então S ← serializaColecao(a) fim se grupo(tipo(a)) = OBJETO então S ← serializaOb jeto(a) fim de f ineBytes(V, j, S) j ← j + |S| fim retorna V 5.2 Serialização de dados 63 Contudo, o Algoritmo 5.1 representa uma forma generalizada de se armazenar uma instância o de uma classe qualquer do MR. Assim, o algoritmo é responsável por armazenar o grafo completo de objetos caso seja parametrizado, inicialmente, com o objeto raiz do grafo. Isto é feito através do comando “byte[] vetorFinal ← serializaObjeto(RMObject raiz)”. No Algoritmo 5.1 o armazenamento do grafo de objetos exige a indicação de cada objeto do grafo. A instância da classe deve permitir a recuperação de seu tipo, em conformidade à planilha do Apêndice B, através de uma função como em “byte t ← tipo(objeto o)”. O tipo do objeto é, então, armazenado no primeiro byte do vetor de persistência, mostrado na linha 2 do algoritmo. Com o conhecimento do tipo do objeto, todos os seus membros (atributos), compostos por tipos primitivos, coleções e/ou objetos, podem ser posteriormente persistidos. Este algoritmo retorna um vetor de bytes que pode ser arquivado em memória secundária. Uma das funções empregadas pelo algoritmo 5.1 é denominada A(o), na linha 4. Tal função define, a partir do objeto o, a sequência de atributos A(o) = ha0 , a1 , . . ., an−1 i. Esta função é definida apenas para objetos que fazem parte do Modelo de Referência do openEHR. Em particular, essa função ainda está em conformidade com a sequência estabelecida na planilha em anexo, ou seja, a ordem dos membros é definida na planilha. Para cada membro do objeto de entrada, o Algoritmo 5.1 verifica o tipo do membro a partir da linha 6. Caso o tipo pertença ao grupo de primitivos, conforme o Algoritmo 5.2, a serialização do membro é efetuada na linha 7, caso contrário devem ser feitas outras chamadas às funções de serialização. Algoritmo 5.2: grupo(p) Entrada: o tipo de um atributo. Saída: o grupo que contém o tipo fornecido. 1 2 3 4 5 6 7 8 9 10 se p ∈ {BOOLEAN, INT EGER, REAL,CHAR, OCT ET, ST RING} então retorna PRIMITIVO fim se p ∈ {LIST < T >, SET < T >, ARRAY < T >, HASH < T,U >} então se T ∈ {BOOLEAN, INT EGER, REAL,CHAR, OCT ET, ST RING} então retorna COLECAO_PRIMITIVO fim retorna COLECAO fim retorna OBJETO 5.2 Serialização de dados 64 Para membros de tipos do grupo “primitivo”, é feita uma chamada pelo Algoritmo 5.3. Conforme a linha 2 deste algoritmo, se o membro é do tipo String, a cardinalidade da String, na linha 3, é transformada em um vetor de bytes na linha 4, seguindo as especificações da Subseção 4.3.4. Este tamanho é armazenado na linha 5 em um intervalo do vetor que varia da posição atual j até a posição acrescida do comprimento do tamanho de 1, 2, 3 ou 5 bytes. Algoritmo 5.3: serializaPrimitivo(a) Entrada: membro a a ser serializado em uma sequência de bytes. Saída: Vetor de bytes contendo a serialização do membro a. 1 2 3 4 5 6 7 8 9 Cria vetor V e inteiro t se tipo(a) = STRING então t ← |a| T ← vetorTamanho(t) de f ineBytes(V, 0, T ) fim /* Senão t ← tamanhoFixo(tipo(a)) */ de f ineBytes(V, |T |, obtemValor(a)) retorna V A transformação do tamanho da String em um vetor de bytes é feita na linha 4 pelo Algoritmo 5.4. Este algoritmo verifica o tamanho parametrizado, caso seja inferior a 6 bits de informação, o tamanho é armazenado em um byte na linha 3, de modo que os 2 bits iniciais permanecem zerados, conforme a Subseção 4.3.4. Para os demais tamanhos, os bytes necessários são ocupados e os dois primeiros bits são configurados de acordo com a quantidade de bytes utilizada. Para elementos primitivos diferentes de Strings, o Algoritmo 5.3 recupera o tamanho fixo do tipo, na linha 7, de acordo com a especificação do openEHR. Em seguida, na linha 9, o valor do membro primitivo é serializado em um intervalo do vetor que varia da posição atual j até o tamanho ocupado pelo membro. Ainda conforme o Algoritmo 5.1, caso o membro a seja do tipo coleção, primitiva ou não, executa-se o Algoritmo 5.5, senão é feita uma chamada recursiva ao próprio Algoritmo 5.1. O vetor S resultante é armazenado definitivamente no vetor de saída V , o qual é retornado pela função contendo a serialização completa do objeto. 5.2 Serialização de dados 65 Algoritmo 5.4: vetorTamanho(t) Entrada: inteiro t cujo valor será serializado em vetor de bytes. Saída: vetor de bytes V com o valor t serializado. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Cria vetor de bytes V se t < 26 então V [0] ← t senão se t < 214 então de f ineBytes(V, 0,t | (1 << 14)) senão se l < 222 então de f ineBytes(V, 0,t | (2 << 22)) senão de f ineBytes(V, 0,t | (3 << 30)) fim fim fim retorna V A Figura 5.1 exemplifica o modo de funcionamento do procedimento de persistência. O Algoritmo 5.1 armazena o tipo do objeto, seja ele ou não a raiz do grafo de objetos, na posição 0 do vetor V , exemplificado pelo valor 84 correspondente a um tipo predefinido. A variável j aponta para o final do vetor em cada iteração, portanto j é responsável pelo controle de posição para inserção no vetor. Para o armazenamento do tamanho t de um atributo de tamanho variável, t ocupa q bytes antes do conteúdo do atributo, isto é exemplificado pelo tamanho de valor 2 armazenado em 1 byte. Em seguida, o conteúdo do atributo é representado nos t bytes, exemplificado com os valores “z” e “y”. Figura 5.1: Exemplo de execução do algoritmo de serialização, com uma raiz composta por uma String de tamanho 2. Para efetuar a serialização de um membro constituído por uma coleção, o Algoritmo 5.5 armazena na variável n da linha 1 a cardinalidade da coleção. No caso 5.2 Serialização de dados 66 Algoritmo 5.5: serializaColecao(C) Entrada: a coleção C de objetos a ser serializada. Saída: o vetor de bytes V com a serialização da coleção C. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 n ← |C| Defina a sequência S = hc1 , c2 , . . . , cn i, onde ci ∈ C, para i = 1 . . . , n Cria vetor V j←0 se tipo(C) = HASH < K,U > então Cria listas K e L para h ← 1 até n passo h ← h + 1 faça K ← K + chave(ch ) L ← L + valor(ch ) fim W ← serializaColecao(K) de f ineBytes(V, j,W ) j ← j + |W | Z ← serializaColecao(L) de f ineBytes(V, j, Z) j ← j + |Z| senão T ← vetorTamanho(n) de f ineBytes(V, j, T ) j ← j + |T | para i ← 1 até n passo i ← i + 1 faça se grupo(tipo(C)) = COLECAO_PRIMITIVO então S ← serializaPrimitivo(ci ) senão S ← serializaOb jeto(ci ) fim de f ineBytes(V, j, S) j ← j + |S| fim fim retorna V uma coleção do tipo Hash<T,U>, composta por pares chave-valor, realizam-se as serializações recursivas, nas linhas 11 e 14, respectivamente, de uma lista com as chaves (obtidas 5.3 Desserialização de dados 67 na linha 8) e de uma lista com os respectivos valores (obtidos na linha 9). Para os demais tipos de coleção, armazena-se a cardinalidade de objetos n através do Algoritmo 5.4. Caso seja verificado, na linha 22, que a coleção é composta por elementos primitivos, então o Algoritmo 5.3 é executado para cada elemento da coleção. Caso contrário, o Algoritmo 5.1 serializa cada objeto em uma nova execução. 5.3 Desserialização de dados Para desserializar o vetor de t bytes V a partir da raiz, deve ser feita uma chamada ao Algoritmo 5.6 através do comando “(objeto raiz, inteiro t) ← desserializaObjeto(V, 0)”. Algoritmo 5.6: desserializaObjeto(V, j) Entrada: vetor de bytes V para ser desserializado; inteiro j com a posição de início da desserialização. Saída: objeto o contido no vetor V ; inteiro j com a próxima posição de desserialização (isto é, j − 1 é a última posição recuperada). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 t ← V [ j] defina S = ha1 , a2 , . . . , an i a sequência dos atributos do tipo t cria o conjunto M de membros de um objeto do tipo t para i ← 1 até n passo i ← i + 1 faça cria variável r com o tipo de classe “tipo(ai )” se grupo(tipo(ai )) = PRIMITIVO então (r, j) ← desserializaPrimitivo(V, j,tipo(ai )) fim se grupo(tipo(ai )) = COLECAO então (r, j) ← desserializaColecao(V, j,tipo(ai )) fim se grupo(tipo(ai )) = OBJETO então (r, j) ← desserializaOb jeto(V, j) fim j ← j + tamanho(r) M ← M∪r fim Cria objeto o do tipo t usando os membros M retorna o, j Na linha 1 do Algoritmo 5.6 recupera-se o tipo da classe do primeiro objeto serializado no vetor, presente no primeiro byte. Em posse do tipo, é possível definir a 5.3 Desserialização de dados 68 sequência de membros S do objeto, na linha 2, de acordo com a ordem dos atributos das classes relacionadas na planilha do Apêndice B. Ainda conforme o Algoritmo 5.6, se o membro é de tipo primitivo, é feita uma chamada ao Algoritmo 5.7. No caso de Strings no algoritmo chamado, recupera-se a cardinalidade, na linha 2, e a ela multiplica-se o tamanho de um caractere, na linha 3, para se obter o tamanho total. Para os demais tipos primitivos, este tamanho é fixado pela especificação do openEHR. Por fim, o valor do tipo primitivo é configurado, na linha 7, de acordo com o vetor na posição atual até o tamanho encontrado. Algoritmo 5.7: desserializaPrimitivo(V, j, p) Entrada: Vetor de bytes V ; inteiro j com a posição de início da desserialização; inteiro p com o tipo primitivo do elemento. Saída: Elemento r de tipo primitivo p; inteiro j com a próxima posição para desserialização de V. 1 2 3 4 5 6 7 8 9 cria inteiro c se p = STRING então (s, j) ← recuperaTamanho(V, j) s ← s ∗ tamanhoFixo(CHAR) senão s ← tamanhoFixo(tipo(ai )) fim de f ineValor(r, obtemBytes(V, j, s)) retorna r, j. A recuperação da cardinalidade de uma String, é realizada através do Algoritmo 5.8, onde são verificados os dois primeiros bits para determinar a quantidade n de bytes ocupada pelo tamanho, conforme explicado na Subseção 4.3.4. Assim, o algoritmo retorna o tamanho contido na porção inicial do vetor até a quantidade n. 5.3 Desserialização de dados 69 Algoritmo 5.8: recuperaTamanho(V, j) Entrada: Vetor de bytes V ; inteiro j com a posição de início da desserialização. Saída: Inteiro t correspondente ao tamanho do próximo membro; inteiro j com a próxima posição para desserialização de V. 1 2 3 4 5 6 7 8 9 10 cria inteiros q, t e vetor de bytes W. q ← (V [ j] >> 6) + 1 se q = 4 então q←5 fim W ← obtemBytes(V, 0, q) atribua 0 ao 1o e 2o bit de W t ← vetorByteParaInteiro(W ) j ← j+q retorna t, j Para a desserialização de coleções é feita uma chamada do Algoritmo 5.6, na linha 10, ao Algoritmo 5.9, parametrizando-o com uma referência para o vetor, a posição inicial de leitura e o tipo específico da coleção. Já para a desserialização de um membro cujo tipo é um objeto, é realizada, na linha 13, uma chamada recursiva ao próprio algoritmo com a referência do vetor. Para coleções do tipo hashmap, o Algoritmo 5.9 realiza uma chamada recursiva para cada lista que o compõe, isto é, para a lista de chave e para a lista de valores. Os pares de chaves e valores são, então, combinados na linha 8 para formar cada elemento do hashmap. Para as demais coleções, recupera-se a cardinalidade de elementos da coleção na linha 11. Assim, caso a coleção seja composta por elementos primitivos, é realizada uma chamada ao Algoritmo 5.7 para cada elemento. Senão, cada objeto é desserializado na linha 17 por uma nova chamada ao Algoritmo 5.6. 5.4 Desempenho dos algoritmos de persistência 70 Algoritmo 5.9: desserializaColecao(V, j, p) Entrada: Vetor de bytes V ; inteiro j com a posição de início da desserialização; inteiro p com o tipo da coleção. Saída: Coleção de elementos S; inteiro j com a próxima posição para desserialização de V. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cria inteiro c se p = HASH então cria LIST K, LIST L e HASH S (K, j) ← desserializaColecao(V, j, LIST )) (L, j) ← desserializaColecao(V, j, LIST )) c ← |K| para i ← 0 até c − 1 passo i ← i + 1 faça S ← S + Ki + Li fim senão (c, j) ← recuperaTamanho(V, j) para i ← 0 até c − 1 passo i ← i + 1 faça cria elemento o de tipo p se grupo(tipo(p)) = COLECAO_PRIMITIVO então (o, j) ← desserializaPrimitivo(V, j, p) senão (o, j) ← desserializaOb jeto(V, j) fim S ← S+o fim 20 21 22 fim retorna S, j. 5.4 Desempenho dos algoritmos de persistência O custo de memória e processamento do Algoritmo 5.1 cresce linearmente conforme a quantidade de objetos presentes no grafo. Isto ocorre devido ao fato do algoritmo armazenar cada objeto do grafo no vetor de saída, acrescido de metadados em um espaço constante. Assim, instâncias do DV_BOOLEAN do MR, por exemplo, exigem um espaço em memória suficiente para armazenar os valores booleanos e o tipo do objeto, opcionalmente em alguns casos. A estrutura da classe (ou modelo de objeto), em conformidade com a especi- 5.4 Desempenho dos algoritmos de persistência 71 ficação do openEHR, pode ser armazenada uma única vez para todos os registros. Esta estrutura deve indicar o tipo e tamanho do campo que compõe o objeto. Por outro lado, o mapeamento objeto-relacional puro resultaria em estruturas complexas com o armazenamento de referências e metadados repetidos. Sobre a estrutura gerada é possível aplicar técnicas conhecidas de compressão que reduzem o custo de espaço, mas que aumentam o custo de processamento. Para a recuperação de dados no Algoritmo 5.6, é necessário que se percorra o vetor do início ao fim de forma contínua, com possíveis “saltos” sobre tipos primitivos. Nestes casos, o tamanho ocupado é previamente definido pela especificação do openEHR ou pode ser obtido no vetor, no caso de Strings. A leitura do vetor correspondente ao RES indicado inicia-se pelo tipo da raiz. Com essa informação, passa-se a conhecer a estrutura do vetor, uma vez que a estrutura segue a especificação do MR do openEHR. O projeto da camada de persistência parte do pressuposto de que esta especificação, criada a partir da planilha explicada na Tabela B.1, encontra-se armazenada conforme a implementação empregada pela aplicação, a qual é responsável por instanciar o grafo correspondente ao RES. Tanto o armazenamento, quanto a recuperação do grafo, devem ser parametrizados com uma referência para o vetor serializado e um contador com o tamanho ocupado pelo vetor. Para se percorrer o vetor serializado, efetua-se a leitura do primeiro byte, responsável por apontar o tipo da raiz. Assim como a aplicação conhece previamente a estrutura do MR, também são conhecidos metadados do vetor, isto inclui a relação entre cada classe do MR e um byte identificador de tipo. Em posse do tipo da raiz, a aplicação consulta a especificação armazenada do MR para conhecer a organização dos atributos. Os algoritmos representados recursivamente podem ser transformados em versões iterativas. No pior caso, deve-se percorrer todo o vetor para encontrar um objeto específico. Desconsiderando o uso de métodos conhecidos de otimização, como por exemplo índices, este custo é o menor possível já que os objetos são armazenados de forma ordenada, isto é, sem o uso de referências. Além de aumentar o custo de memória, o emprego de referências implicaria em percorrer repetidamente um mesmo ponto do vetor. O armazenamento das cardinalidade das coleções e tamanhos de Strings em um espaço de 1 a 5 bytes reduzem o custo de armazenamento caso o tamanho da coleção seja inferior, em média, a 30 bits de informação. Adicionalmente, no caso de objetos compostos por outros objetos, a consulta pelos tipos das instâncias pode ser melhorada com o armazenamento do tipo no início do objeto. 5.5 Estratégia de persistência exemplificada 72 Figura 5.2: Pacote rm.data_types.text versão 1.0.3[45]. 5.5 Estratégia de persistência exemplificada O pacote data_types.text do MR, ilustrado na Figura 5.2 é um exemplo representativo do restante do modelo. Este pacote contém herança, atributos de tamanho fixo, como char, e de tamanho variável, como Strings e lista de tipo variável. Também contém atributos explicitamente inline, como é o caso do atributo de tipo DV_URI. Um exemplo hipotético da estratégia de persistência aplicada a uma instância do pacote data_types.text do MR é mostrado, inicialmente, na Figura 5.3. Neste exemplo, a classe DV_PARAGRAPH rotulada com o tipo 3 (conforme o identificador do Apêndice B) é definida como a raiz do vetor. De acordo com a Figura 5.2 um objeto do tipo DV_PARAGRAPH contém uma lista de DV_TEXT nomeada “items”. Assim, a Figura 5.3 contém uma coleção com apenas um elemento, mais especificamente do tipo DV_CODED_TEXT rotulado pelo identificador 6. Um objeto DV_CODED_TEXT apresenta, dentre outros atributos, a String “formatting” e o DV_URI “hyperlink”, que também se reduz a uma String quando tratado de modo inline. Ambas as Strings possuem metadados relacionados ao tamanho da cadeia de caracteres, portanto, a Figura 5.3 exemplifica os tamanhos ocupados por essas Strings com o valor 1 e seus respectivos conteúdos “F” e “H”. De acordo com a Figura 5.2, um DV_TEXT também é formado por uma lista de TERM_MAPPING chamada de “mappings”[45]. Assim, a Figura 5.4 retrata uma lista com um elemento. Tal TERM_MAPPING é composto por um caractere, isto é, um atributo de tamanho fixo, exemplificado com o valor “M”. Além disso, um 5.6 Considerações finais 73 Figura 5.3: Exemplo da estratégia de persistência aplicada ao pacote data_types.text do MR com a raiz e um objeto que a compõe. TERM_MAPPING é composto por uma lista de DV_CODED_TEXT nomeada “purpose” e por um CODE_PHRASE nomeado “target”, ambos atributos de tamanho variável e, portanto, armazenados no final do objeto. No exemplo “purpose” não possui quaisquer elementos. Por outro lado, o CODE_PHRASE “target” é composto por um “terminology_id” e um “code_string”, ambos suficientemente representados por Strings. Este objeto é armazenado de forma aninhada no objeto ao qual pertence. Assim, a separação no vetor entre elementos de tamanho fixo e variável deve ser aplicada tanto no objeto-pai quanto no objeto-filho que o compõe. Como o objeto-filho não é composto por outro objeto, no vetor são armazenadas as Strings relativas a seus atributos, com seus respectivos tamanhos e valores, exemplificados no vetor com um caractere para cada atributo e com valores “T”. Em uma visão geral, o armazenamento de um DV_PARAGRAPH depende do armazenamento de um DV_TEXT especializado pelo objeto DV_CODED_TEXT, o qual se resume a um DV_TEXT justaposto a um CODE_PHRASE. Tanto neste aninhamento de objetos, quanto nos demais, os atributos de tamanho fixo e metadados precedem os atributos de tamanho variável, o que inclui objetos que não sejam armazenados de forma estritamente “inline”, isto é, que sejam tratados como objetos com atributos e não, simplesmente, como atributos. 5.6 Considerações finais Para as estratégias apresentadas, assume-se que o conteúdo da planilha do Apêndice B é armazenado no diretório de registros ou mesmo na aplicação. Isso é possível 5.6 Considerações finais 74 Figura 5.4: Exemplo da estratégia de persistência aplicada sobre um objeto composto por atributos de tamanho fixo e variável. devido ao fato do MR ser um modelo estável. Contudo, caso haja alguma modificação realizada na especificação do openEHR, ela deve ser refletida no conteúdo da planilha. A fim de facilitar o entendimento da estratégia de persistência, o identificador de classes foi empregado em todos os objetos. A separação da área de metadados, por sua vez, só é possível em algoritmos iterativos, já que o dado deve ser separado do metadado. Todavia, para evitar o detalhamento de procedimentos relativos à implementação, foram utilizadas técnicas de recursividade. CAPÍTULO 6 Conclusão Neste trabalho foi especificado o formato de serialização do grafo de objetos do openEHR, aplicado sobre um vetor de bytes. Além disso, foi definida uma gama de conceitos empregada na geração de regras de mapeamento, que incluem desde o mapeamento de membros de objetos de tipos primitivos previamente conhecidos e ordenados, até estruturas complexas como coleções de objetos de tipos e tamanhos desconhecidos. O esquema de dados para persistência segue o esquema conceitual do MR. Contudo, cada classe folha foi convertida para um conjunto de atributos (unidos aos atributos das classes ascendentes). Tais atributos foram projetados para serem armazenados em um vetor de bytes considerando a redução de espaço ocupado, mas de modo a não inviabilizar o tempo de processamento. A estratégia de persistência foi descrita através de algoritmos recursivos de serialização e desserialização de dados. Estes algoritmos são reflexivos, isto é, os algoritmos de serialização validam os algoritmos de desserialização (e vice-versa) ao percorrer o caminho inverso apontado pelo outro. Assim a estratégia apresentada deve ser viável para ser executada em ambas as direções. Por fim, a estratégia de persistência foi exemplificada e discutida em relação a sua eficácia. A principal contribuição deste trabalho é o desenvolvimento de uma estratégia de persistência que considera as especificidades do MR do openEHR, isto é, um modelo explicitamente restrito, composto por estruturas predefinidas. Esta estratégia é recomendada para o armazenamento e recuperação de dados clínicos localizados em um ambiente com recursos de espaço e processamento limitados. 6.1 Comparação com trabalhos correlatos A comparação da estratégia apresentada com trabalhos relacionados pode ser realizada através da inclusão da contribuição deste estudo em formulários da Subseção 3.4.2, preenchidos na Subseção 3.4.3. A contribuição deste estudo centra-se no mapeamento do MR para um modelo de dados físico, portanto a comparação realizada na Tabela 3.14 é novamente realizada, com a adição deste trabalho, na Tabela 6.1. 6.1 Comparação com trabalhos correlatos 76 Tabela 6.1: Adição da contribuição do trabalho atual à Tabela 3.14. CI (B1) Modelo conceitual (B2) Modelo lógico ou físico (B3) [48] CI-2 HL7 RIM [55] CI-4 Arquétipos Trabalho atual CI-2 MR do openEHR EAV-Otimizado Modelo de BD Re- Modelo físico com ob(OEAV) sobre a lacional jetos serializados em classe Observation um vetor de bytes e relacional nas demais Tipos de da- Tipos padrões de BD Coluna de tipo bá- Strings com inclusão dos básicos sico SQL de tamanho e demais (B4) tipos primitivos com tamanho fixo Associação FK em 1:1 e 1:N; Incorpora coluna Objetos ordenados no e agregação Tabela separada em em 1:1; Usa FK em vetor de forma fixa e (B5) N:N e agregação 1:N sem uso de referências Herança Uma tabela por Template mapeia Membros do objeto (B6) classe (com identifi- os campos do generalizado incluídos cação) e uma coluna arquétipo especi- no objeto especialipor atributo. alizado para o do zado generalizado Coleção Tabela com FK para Objetos serializados (B7) id. do arquétipo e sequencialmente e coluna de tipo bá- precedidos da cardisico nalidade Mapeamentos Campo AV contém Tabela contém as Ordem de membros é específicos um código do Atri- versões nova e anti- fixa e tipos são arma(B8) buto concatenado ao gas do arquétipo zenados ou seguem esValor pecificação. De acordo com a primeira e quarta coluna da Tabela 6.1, uma instância de um subconjunto do MR do openEHR, isto é, o grafo de objetos (na linha do atributo B2), é serializado em um vetor de bytes (atributo B3), para que a persistência dos dados possa ser efetuada. Tipos primitivos são armazenados com tamanho fixo, conforme a especificação do openEHR, exceto para o caso de Strings, em que o tamanho da String é guardado previamente (atributo B5). Objetos, por sua vez, armazenam seus tipos através de identificadores constantes, já os membros dos objetos seguem a estrutura apresentada na planilha do Apêndice B e, deste modo, as associações são previamente conhecidas (atributo B6). No caso de heranças (linha do atributo B7 da Tabela 6.1), o armazenamento dos objetos generalizados não é realizado separadamente. Assim, apenas objetos folhas são armazenados contendo todos os atributos dos objetos ascendentes. Com relação a 6.2 Trabalhos futuros 77 coleções (atributo B8), a estratégia apresentada armazena a cardinalidade da coleção para ser utilizada durante a recuperação, o que possibilita a realização de “saltos” no vetor. A estratégia de persistência apresentada explora as especificidades do openEHR para reduzir os custos em espaço ocupado. Isto ocorre, principalmente, devido ao mapeamento das estruturas do MR na planilha do Apêndice B. Conforme mencionado no atributo B9 da Tabela 6.1, neste mapeamento são fixadas a ordem e tipos dos membros dos objetos, de acordo com a especificação do openEHR. 6.2 Trabalhos futuros Em relação as limitações encontradas durante o trabalho, a revisão sistemática foi utilizada como meio de se obter os requisitos para o desenvolvimento da estratégia de persistência. Portanto, não foi feito um estudo aprofundado dos requisitos do ponto de vista do usuário final e dos requisitos (de modo preciso e detalhado) relacionados ao tempo de processamento e espaço de memória disponibilizados pelos sistemas. Além disso, não houve tempo hábil para a implementação da camada de persistência, o que impossibilitou a realização de experimentações. Assim, como trabalho futuro, espera-se: • Explorar requisitos de usuário e de sistema para o desenvolvimento da camada; • Detalhar o projeto arquitetural interno da camada de persistência e de sua relação com outros serviços em um SIS, além de detalhar o fluxo de dados interno e externo à camada; • Apresentar funções matemáticas e provas formais do tempo de processamento e espaço de memória requeridos; • Implementar as funcionalidades de armazenamento e recuperação de dados em conformidade à estratégia apresentada; • Gerar e disponibilizar um benchmark de grande porte com dados clínicos baseados no openEHR e realizar experimentos sobre a estratégia apresentada, comparando-a com trabalhos correlatos encontrados durante a revisão sistemática. Referências Bibliográficas [1] ATALAG , K.; YANG , H. Y.; T EMPERO, E.; WARREN , J. Model driven development of clinical information systems using openehr. 2011. [2] AUSTIN , T.; K ALRA , D.; L EA , N.; PATTERSON , D.; I NGRAM , D. Analysis of clinical record data for anticoagulation management within an ehr system. Open Med Inform J, 3:54–64, 2009. [3] B AHGA , A.; M ADISETTI , V. K. A cloud-based approach for interoperable electronic health records (ehrs). IEEE Journal of Biomedical and Health Informatics, 17(5):894–906, 2013. [4] B ARCA , C. C.; L AGUNAR , C. M.; R ODRÍGUEZ , J. M.; Q UINTERO, A. M.; M ARTINS , I. R. M.; M ARTÍNEZ , I.; S ANGUINO, M. A.; L OBO, T. P. yourehrm: Standard-based management of your personal healthcare information. In: IEEE International Conference on Biomedical and Health Informatics (BHI), p. 89–92. IEEE, 2014. [5] B EALE , T. Persistence FAQs. Última modificação em: 04 de Maio de 2016. Último acesso em: 10 de Agosto de 2016. [6] B EALE , T. Node+Path Persistence. Última modificação em: 04 de Agosto de 2008. Último acesso em: 21 de Julho de 2016. [7] B EALE , T. Archetypes: constraint-based domain models for future-proof information systems. OOPSLA 2002 Workshop on Behavioural Semantics, p. 1–18, 2002. [8] B EALE , T.; H EARD, S. Architecture overview. openEHR Foundation, 2008. [9] B HATTI , N.; H ASSAN , W.; M C C LATCHEY, R.; M ARTIN , P.; KOVACS , Z.; L E G OFF , J.; S TOCKINGER , H.; W ILLERS , I.; L E , J.-M. Object serialization and deserialization using xml. Advances in Data Management, 2000. [10] B OREN , Z. There are officially more mobile devices than people in the world. Última modificação em: 07 Out. de 2014. Último acesso em: 22 Nov. de 2016. Referências Bibliográficas 79 [11] C HEN , R.; E NBERG , G.; K LEIN , G. O. Julius–a template based supplementary electronic health record system. BMC medical informatics and decision making, 7(1):1, 2007. [12] C HEN , R.; K LEIN , G.; OTHERS . The openehr java reference implementation project. Medinfo, 129:58–62, 2007. [13] CNES. Dados do setor. Mês de referência: Novembro de 2016. Último acesso em: 17 de Novembro de 2016. [14] DA S AÚDE , M. Estratégia e-saúde para o brasil. Secretária de Gestão Estratégica e Participativa, Departamento de Informática do SUS. [15] DA S AÚDE , M. Política nacional de informação e informática em saúde. Comitê de Informação e Informática em Saúde. [16] DA S AÚDE , M. Portaria no 2.073, de 31 de agosto de 2011. [17] D ICK , R.; S TEEN , E.; D ETMER , D. The computer-based patient record: An essential technology. Technical report, IOM, 1991. Atualizado em 1997. [18] D UFTSCHMID, G.; C HALOUPKA , J.; R INNER , C. Towards plug-and-play integration of archetypes into legacy electronic health record systems: the archimed experience. BMC medical informatics and decision making, 13(1):1, 2013. [19] EN13606-A SSOCIATION . The CEN/ISO EN13606 standard. Último acesso em: 21 de Julho de 2016. [20] F LAT B UFFERS . FlatBuffers white paper. Última modificação em: 20 de Janeiro de 2016. Último acesso em: 10 de Agosto de 2016. [21] F LEMMING , D.; PAUL , M.; H ÜBNER , U. Building a common ground on the clinical case: design, implementation and evaluation of an information model for a handover ehr. Stud Health Technol Inform. 2014;201:167-74. PubMed PMID: 24943540., 2014. [22] F RADE , S.; F REIRE , S. M.; S UNDVALL , E.; PATRIARCA -A LMEIDA , J. H.; C RUZ C ORREIA , R. Survey of openehr storage implementations. In: Proceedings of the 26th IEEE International Symposium on Computer-Based Medical Systems, p. 303–307. IEEE, 2013. [23] F REIRE , S. M.; S ZTAJNBERG , A.; C OPETTI , A.; L OQUES , O. Utilizando o modelo dual para a representação e persistência de contexto em aplicações ubíquas de telemonitoramento. In: VIII Workshop de Informática Médica. XXVIII Congresso da Sociedade Brasileira de Computação, p. 15–18, 2008. Referências Bibliográficas 80 [24] F REIRE , S. M.; T EODORO, D.; W EI -K LEINER , F.; S UNDVALL , E.; K ARLSSON , D.; L AMBRIX , P. Comparing the performance of nosql approaches for managing archetype-based electronic health record data. PloS one, 11(3):e0150069, 2016. [25] F UNDAÇÃO - OPEN EHR. Multi-level Modelling concepts. Última modificação em: 31 de Julho de 2014. Último acesso em: 26 de Novembro de 2016. [26] F UNDAÇÃO - OPEN EHR. Programa de Especificações. Último acesso em: 21 de Julho de 2016. [27] F UNDAÇÃO - OPEN EHR. openEHR Base Types specification. Último acesso em: 01 de Outubro de 2016. [28] F UNDAÇÃO - OPEN EHR. EHR Information Model. Último acesso em: 22 de Novembro de 2016. [29] H UMM , B. G.; WALSH , P. Flexible yet efficient management of electronic health records. In: 2015 International Conference on Computational Science and Computational Intelligence (CSCI), p. 771–775. IEEE, 2015. [30] ISO/TR-20514. Health informatics - electronic health record - definition, scope and context. 2005. [31] K IM , H. S.; T RAN , T.; C HO, H. A clinical document architecture (cda) to generate clinical documents within a hospital information system for e-healthcare services. In: The Sixth IEEE International Conference on Computer and Information Technology (CIT’06), p. 254–254. IEEE, 2006. [32] K ROPF, S.; C HALOPIN , C.; D ENECKE , K. Template and model driven development of standardized electronic health records. 216:30, 2015. [33] L EE , K. K.-Y.; TANG , W.-C.; C HOI , K.-S. Alternatives to relational database: comparison of nosql and xml approaches for clinical data storage. Computer methods and programs in biomedicine, 110(1):99–109, 2013. [34] L I , H.; D UAN , H.; L U, X.; H UANG , Z. A clinical document repository for cda documents. In: 2007 1st International Conference on Bioinformatics and Biomedical Engineering, p. 1084–1087. IEEE, 2007. [35] L IANAS , L.; F REXIA , F.; D ELUSSU, G.; A NEDDA , P.; Z ANETTI , G. pyehr: A scalable clinical data management toolkit for biomedical research projects. In: Healthcom, p. 370–374, 2014. Referências Bibliográficas 81 [36] L ÓPEZ -N ORES , M.; B LANCO -F ERNÁNDEZ , Y.; PAZOS -A RIAS , J. J.; G ARCÍA -D UQUE , J. The icabinet system: Harnessing electronic health record standards from domestic and mobile devices to support better medication adherence. Computer Standards & Interfaces, 34(1):109–116, 2012. [37] M ADAAN , A.; C HU, W.; DAIGO, Y.; B HALLA , S. Quasi-relational query language interface for persistent standardized ehrs: Using nosql databases. In: International Workshop on Databases in Networked Information Systems, p. 182–196. Springer, 2013. [38] M ALDONADO, J. A.; C OSTA , C. M.; M ONER , D.; M ENÁRGUEZ -TORTOSA , M.; B OSCÁ , D.; G IMÉNEZ , J. A. M.; F ERNÁNDEZ -B REIS , J. T.; R OBLES , M. Using the researchehr platform to facilitate the practical application of the ehr standards. Journal of biomedical informatics, 45(4):746–762, 2012. [39] M ENEZES , P. M.; C OOK , T. W.; C AVALINI , L. T. Convergence of health level seven version 2 messages to semantic web technologies for software-intensive systems in telemedicine trauma care. Healthcare informatics research, 22(1):22– 29, 2016. [40] M IAN , P.; C ONTE , T.; N ATALI , A.; B IOLCHINI , J.; T RAVASSOS , G. A systematic review process for software engineering. In: ESELAW 2005, 2005. [41] M OLINA , A. BSON Mad Science for fun and profit. Publicado em 26 de Outubro de 2013. Último acesso em: 18 de Dezembro de 2016. [42] M UIRHEAD, T. Object databases and object persistence for openehr, 2009. [43] M UÑOZ , A.; S OMOLINOS , R.; PASCUAL , M.; F RAGUA , J. A.; G ONZÁLEZ , M. A.; M ONTEAGUDO, J. L.; S ALVADOR , C. H. Proof-of-concept design and development of an en13606-based electronic health care record service. Journal of the American Medical Informatics Association, 14(1):118–129, 2007. [44] N OBLE , J.; W EIR , C. Small memory software: patterns for systems with limited memory. Addison-Wesley Longman Publishing Co., Inc., 2001. [45] OPEN EHR F OUNDATION , T. Data Types Information Model. Última modificação em: 15 de Novembro de 2015. Último acesso em: 21 de Julho de 2016. [46] O SÓRIO, E.; F ERREIRA , L.; A BREU, R.; S OUSA , F. Interoperability in ambient assisted living using openehr. In: e-Health Networking, Applications & Services (Healthcom), 2013 IEEE 15th International Conference on, p. 394–398. IEEE, 2013. Referências Bibliográficas 82 [47] PARAISO -M EDINA , S.; P EREZ -R EY, D.; B UCUR , A.; C LAERHOUT, B.; A LONSO C ALVO, R. Semantic normalization and query abstraction based on snomed-ct and hl7: supporting multicentric clinical trials. IEEE journal of biomedical and health informatics, 19(3):1061–1067, 2015. [48] PAUL , R.; S AYED M D L ATIFUL H OQUE , A. Search efficient representation of healthcare data based on the hl7 rim. Journal of Computers, 5(12):1810–1818, 2010. [49] P ROTOCOL -B UFFERS . Developer Guide. Última modificação em: 20 de Janeiro de 2016. Último acesso em: 10 de Agosto de 2016. [50] S ACHDEVA , S.; B HALLA , S. Visual query language for archetype-based electronic health records databases. Journal of information processing, 20(2):438–450, 2012. [51] S ANTOS , C.; P EDROSA , T.; C OSTA , C.; O LIVEIRA , J. L. On the use of openehr in a portable phr. In: 4th International Conference on Health Informatics. Institute for Systems and Technologies of Information, Control and Communication, 2011. [52] S UNDVALL , E.; N YSTRÖM , M.; K ARLSSON , D.; E NELING , M.; C HEN , R.; Ö RMAN , H. Applying representational state transfer (rest) architecture to archetype-based electronic health record systems. BMC medical informatics and decision making, 13(1):1, 2013. [53] TAB N ET. Procedimentos hospitalares do SUS - Por local de internação - Brasil. Fonte dos dados: Ministério da Saúde - Sistema de Informações Hospitalares do SUS (SIH/SUS). Mês de referência: Setembro de 2016. Último acesso em: 17 de Novembro de 2016. [54] V ELTE , L.; P EDROSA , T.; C OSTA , C.; O LIVEIRA , J. L. An openehr repository based on a native xml database. In: 5th International Conference on Health Informatics (HEALTHINF 2012). INSTICC–Institute for Systems and Technologies of Information, Control and Communication, 2012. [55] WANG , L.; M IN , L.; WANG , R.; L U, X.; D UAN , H. Archetype relational mappinga practical openehr persistence solution. BMC medical informatics and decision making, 15(1):1, 2015. [56] YANG , W.-Y.; L EE , L.-H.; G IEN , H.-L.; C HU, H.-Y.; C HOU, Y.-T.; L IOU, D.-M. The design of the hl7 rim-based sharing components for clinical information systems. International Journal of Social Sciences, 5(2), 2010. Referências Bibliográficas 83 [57] Z OLLMANN , J. Nosql databases. Retrieved from Software Engineering Research Group: http://www. webcitation. org/6hA9zoqRd, 2012. APÊNDICE A Artigos incluídos Uma breve descrição dos artigos incluídos, com as contribuições relacionadas ao tema deste trabalho, é dada na Tabela A.1 Tabela A.1: Artigos incluídos na revisão sistemática Frade et Faz um catálogo das características de sistemas que armazenam dados al. (2013) modelados em arquétipos conforme as especificações da plataforma [22] openEHR. O catálogo inclui detalhes do sistema como a quantidade de registros, modelo de banco de dados e linguagem de consulta. Wang et Projeta regras de mapeamento de arquétipos para um esquema de BD al. (2015) relacional, onde cada arquétipo corresponde a uma tabela. As regras [55] abordam desde o mapeamento de itens básicos até coleções de dados, passando por nomeações de tabelas. Velte et Apresenta um repositório XML baseado no openEHR. Para cada pacial. (2012) ente é armazenado um documento XML com todas as suas informações [54] a fim de simplificar os procedimentos de persistência. Barca et Projeta a arquitetura yourEHRM com foco na integração de diferentes al. (2014) padrões de interoperabilidade. A arquitetura contém uma camada que [4] armazena documentos JSON contendo pares NoSQL de caminho/valor. Portanto, as consultas AQL podem ser construídas para acessar dados com base em caminhos. Lianas et Projeta a arquitetura PyEHR contendo os módulos de Gerenciamento al. (2014) de Dados e Motor de Consultas. A arquitetura gera escalabilidade sobre [35] o volume de dados ao oferecer interfaces que podem ser implementadas por diferentes SGBDs. Paul e Apresenta o modelo de dados OEAV (EAV otimizado) aplicado sobre Hoque a classe Observation. Este estudo detalha o mapeamento do HL7 RIM (2010) para a representação física de dados. No OEAV cada Atributo é repre[48] sentado por um código que é concatenado ao Valor e são aplicados índices sobre a Entidade. Isso reduz o consumo de memória e torna a busca eficiente. Atalag et Apresenta o sistema GastrOS, onde os dados clínicos são serializados al. (2011) em XML e persistidos em um BD relacional no MS Acess e SQLite. [1] Apêndice A Muñoz et Desenvolve um servidor como prova de conceito do padrão EN13606 al. (2007) em que cada classe do MR é mapeada para uma tabela relacional. En[43] tretanto, o servidor apresenta um desempenho de persistência inviável quando aplicado em um cenário real Austin et Importa dados de um sistema legado do projeto Synapses para um MR al. (2009) genérico. A implementação do MR é avaliada através da revisão do [2] conteúdo de um servidor de RESs. A análise considera, principalmente, a porcentagem de uso de cada classe do MR. Humm Descreve os requisitos necessários para o desenvolvimento de um gee Walsh renciador de RESs. Também apresenta um modelo de dados baseado no (2015) HL7 RIM, mas restrito a um estudo de caso. A modelagem de conceitos [29] é feita em uma planilha e o gerenciador de RES é gerado automaticamente. Uma ferramenta ORM é utilizada para mapear as classes para tabelas de hierarquias. Bahga e Desenvolve a arquitetura CHISTAR implantada na nuvem. O sistema Madisetti estende arquétipos openEHR, adaptando o MR do openEHR e do HL7. (2013) Os registros são armazenados no BD HBase conforme os tipos de [3] dados do MR. Além disso, um motor de integração converte RESs de diferentes fontes para arquivos planos. Flemming Desenvolve um sistema para armazenar informações para serem utilizaet al. das durante as trocas de turnos. É apresentado um modelo de informa(2014) ção baseado no openEHR RIM. As classes são mapeadas para tabelas [21] através do Hibernate. Kropf et Apresenta um sistema em que os arquivos XML gerados pelo openEHR al. (2015) são inseridos em modelos do XForms. Assim, a interface gráfica e os [32] campos de entrada são conectados diretamente ao XML pelo XForms. Consequentemente, os dados podem ser persistidos em um BD XML utilizando o eXistdb e os RESs por uma interface REST. Li et al. Desenvolve um repositório para armazenar documentos CDA em um (2007) BD XML com alta performance e disponibilidade. O repositório é [34] organizado hierarquicamente e centrado no paciente, com separação de visitas e versões. Já que o desempenho das consultas decresce com o volume de dados, são utilizados índices baseados em árvore B e XPath. LópezDesenvolve o sistema iCabiNET baseado no padrão EN 13606, para Nores et dar suporte a medicações, interagindo com repositórios domésticos e al. (2012) móveis. O sistema fornece serviços baseados na tecnologia SOAP e [36] armazena os dados em um BD relacional através de uma interface JDBC do MySQL. O sistema também apresenta uma camada ADL que manipula instâncias de arquétipos do repositório CKM. Madaan Desenvolve um sistema cliente-servidor utilizando um BD NoSQL com et al. MongoDB. Além disso, apresenta o mecanismo de consulta AQBE (2013) (Consulta-Por-Exemplo baseada em Arquétipos) que abstrai a comple[37] xidade sintática das consultas. O sistema suporta índices de árvore B, mas não permite consultas baseadas em população. 85 Apêndice A Osorio et Evolui a plataforma eHealthCom, relacionada à assistência de idosos al. (2013) em casa, ao possibilitar o gerenciamento de RESs. A aplicação utiliza [46] um repositório openEHR, integrado à mensagens HL7, que insere composições nos registros em um BD XML. Sundvall Explora a arquitetura REST sobre sistemas críticos distribuidos baseaet al. dos no openEHR. São detalhados diversos tipos de tecnologias possí(2013) veis de serem usadas e seus impactos, além do método de consulta de [52] RES. O estudo também apresenta a plataforma LiU EEE (Linköping University Educational EHR Environment) para armazenar RESs em BDs XML focado na abordagem baseada em indivíduos. Freire et Converte 4 BDs relacionais convencionais, com mais de 4 milhões al. (2016) de RESs, em BDs NoSQL, XML e relacional conforme o padrão [24] openEHR. Sobre esses BDs são avaliados o tempo de resposta de 8 consultas baseadas em população. Além disso, o NoSQL é avaliado em um ambiente distribuído. Lee et al. O estudo gera um MC a partir de conceitos extraídos de um BD (2013) convencional e mapeia o BD para o formato HL7 CDA contendo dados [33] estruturados em árvore conforme o MC. O conteúdo do documento CDA gerado é persistido nos BDs de modo que, para cada conceito de cada RES, é inserida uma tupla em um BD NoSQL utilizando pares generalizados de chave-valor. O BD NoSQL é mais rápido, por outro lado os BDs XML nativo e não-nativo são escaláveis, flexíveis e extensíveis. Freire et Desenvolve um protótipo que persiste os dados em duas tabelas relacial. (2008) onais no PostgreSQL: uma com campos para o caminho do arquétipo, [23] o valor do atributo definido pelo caminho e o identificador único do registro com os dados; e outra com campos para o identificador único do paciente e o texto XML serializado dos dados do paciente. O trabalho afirma que o protótipo é viável sem apresentar demonstrações ou experimentos. Muirhead Realiza uma avaliação preliminar para encontrar problemas e oportuni(2011) dades na persistência de um modelo de objetos recursivo linear simples [42] com os SGBDs Db4o e Caché da Intersystem para BDs OO. Na avaliação final, um protótipo da camada de persistência, com ambos SGBDs, é comparada a uma solução em SQL Server que utiliza o padrão Fast Infoset e outra com uma base XML. 86 APÊNDICE B Mapeamento das classes do MR As classes do MR foram mapeadas para a estrutura da Tabela B.1. Com relação ao tamanho médio em bytes, S representa o tamanho ocupado pelos dados e meta-dados de uma String, L por uma lista e B por um objeto de tipo variável. As classes são separadas por subpacotes, os quais são combinados em pacotes versionados. Por exemplo, OBSERVATION, do subpacote “composition.entry” (pacote composition, versão 1.0.4) é identificada pelo tipo 76 e requer um tamanho total de 187 ∗ S + 38 ∗ B + 39 ∗ L + 185 bytes. Tabela B.1: Planilha com o mapeamento das classes do MR Id. Nome da classe Tamanho médio em bytes Nome e tipo dos campos (em ordem) Observação Pacote: data_types; versão: 1.0.3 DATA_VALUE 1 1 tipo Abstrata data_types.uri 1 DV_URI 1 S 1+S dataValue value_String Herança 2 DV_EHR_URI 1+S 1+S dvURI Herança data_types.text 3 DV_PARAGRAPH 1 L 1+L dataValue items_ListDvText Herança Polimórfico Apêndice B 4 DV_TEXT 88 1 S S L 1+S 2*S+2 2*S+2 7*S+L+6 dataValue formatting_String value_String mappings_ListTermMapping hyperlink_DvUri language_CodePhrase encoding_CodePhrase 5 CODE_PHRASE 1 S 1+S 2*S+2 tipo codeString_String terminologyId_TerminologyId 6 DV_CODED_TEXT 7*S+L+6 2*S+2 9*S+L+8 dvText definingCode_CodePhrase 7 TERM_MAPPING 1 match_Char 2*S+2 target_CodePhrase 9*S+L+8 purpose_DvCodedText 11*S+L+10 Herança Polimórfico Herança data_types.basic 8 DV_BOOLEAN 1 1 2 dataValue value_Boolean Herança 9 DV_IDENTIFIER 1 S S S S 4*S+1 dataValue issuer_String assigner_String id_String type_String Herança 10 DV_STATE 1 1 9*S+L+8 9*S+L+10 dataValue isTerminal_Boolean value_DvCodedText Herança Apêndice B 89 data_types.encapsulated DV_ENCAPSULATED 1 2*S+2 2*S+2 4*S+5 dataValue charset_CodePhrase language_CodePhrase Herança Abstrata Abstrata Abstrata 11 DV_MULTIMEDIA 4*S+5 1 1 4 S 2*S+2 2*S+2 10*S+L+4+12 L 1+S 20*S+2*L+32 dvEncapsulated Herança integrityCheck_byte data_byte size_Integer alternateText_String mediaType_CodePhrase compAlg_CodePhrase thumbnail_DvMultimedia checkAlg_ListCodePhrase uri_DvUri Polimórfico 12 DV_PARSABLE 4*S+5 S S 6*S+5 dvEncapsulated value_String formalism_String Herança data_types.time_specification DV_TIME_ SPECIFICATION 13 14 1 dataValue 6*S+5 6*S+6 value_DvParsable DV_GENERAL_ 6*S+6 TIME_SPECIFICATION 6*S+6 DV_PERIODIC_ 6*S+6 TIME_SPECIFICATION 6*S+6 Herança Abstrata dvTimeSpecification Herança dvTimeSpecification Herança data_types.quantity 15 DV_INTERVAL <T> 2*B+7 2*B+7 intervalT Herança Apêndice B 16 17 REFERENCE_ RANGE<T> 90 1 tipo 7*S+L+6 2*B+7 7*S+L+2*B+14 meaning_DvText range_DvIntervalT Polimórfico DV_ORDERED<T> 1 2*B+7 2*S+2 L 2*S+2*B+L+10 dataValue Herança normalRange_DvIntervalT normalStatus_CodePhrase other_ListReferenceRangeT Abstrata DV_ORDINAL 2*S+2*B+L+10 9*S+L+8 4 11*S+2*B+2*L+22 dvOrderedDvOrdinal symbol_DvCodedText value_Integer Herança 2*S+2*B+L+10 dvOrderedT Herança B S 3*S+3*B+L+10 accuracy_Any magnitudeStatus_String Polimórfico 3*S+3*B+L+10 1 3*S+3*B+L+11 dvQuantifiedTFloat Herança accuracyIsPercent_Boolean Abstrata 3*S+3*B+L+10 dvQuantifiedTS DV_QUANTIFIED <T, S> DV_AMOUNT<T> DV_ABSOLUTE_ QUANTITY<T, S> Abstrata 3*S+3*B+L+10 Herança Abstrata 18 DV_PROPORTION 3*S+3*B+L+11 4 4 4 4 3*S+3*B+L+27 dvAmountDvProportion numerator_Float denominator_Float type_int precision_int Herança 19 DV_COUNT 3*S+3*B+L+11 8 3*S+3*B+L+19 dvAmountDvCount magnitude_Integer64 Herança 20 DV_QUANTITY 3*S+3*B+L+11 4 4 S 4*S+3*B+L+19 dvAmountDvQuantity precision_Integer magnitude_Float units_String Herança Apêndice B 91 data_types.datetime DV_TEMPORAL<T> 3*S+3*B+L+10 dvAbsoluteQuantity TDvDuration 3*S+3*B+L+10 Herança Abstrata 21 DV_DURATION 3*S+3*B+L+11 S 4*S+3*B+L+11 dvAmountDvDuration value_String Herança 22 DV_TIME 3*S+3*B+L+10 S 4*S+3*B+L+10 dvTemporalDvTime value_String Herança 23 DV_DATE_TIME 3*S+3*B+L+10 S 4*S+3*B+L+10 dvTemporalDvDateTime value_String Herança 24 DV_DATE 3*S+3*B+L+10 S 4*S+3*B+L+10 dvTemporalDvDate value_String Herança Pacote: support; versão: 1.0.4 support.identification UID 1 S 1+S tipo value_String Abstrata 25 INTERNET_ID 1+S 1+S uid Herança 26 ISO_OID 1+S 1+S uid Herança 27 UUID 1+S 1+S uid Herança OBJECT_ID 1 S 1+S tipo value_String 1+S 1+S objectId UID_BASED_ID Abstrata Herança Abstrata Apêndice B 92 28 ARCHETYPE_ID 1+S 1+S objectId Herança 29 TEMPLATE_ID 1+S 1+S objectId Herança 30 GENERIC_ID 1+S S 1+2*S objectId scheme_String Herança 31 TERMINOLOGY_ID 1+S 1+S objectId Herança 32 OBJECT_VERSION_ID 1+S 1+S uidBasedId Herança 33 HIER_OBJECT_ID 1+S 1+S uidBasedId Herança 34 OBJECT_REF 1 S S 1+S 3*S+2 tipo namespace_String type_String id_ObjectId Polimórfico 35 ACCESS_GROUP_REF 3*S+2 3*S+2 objectRef Herança 36 PARTY_REF 3*S+2 3*S+2 objectRef Herança 37 LOCATABLE_REF 3*S+2 S 4*S+2 objectRef path_String Herança 38 VERSION_TREE_ID 1 S 1+S tipo value_String Pacote: common; versão 1.0.4 common.archetyped PATHABLE 1 1 tipo Abstrata Apêndice B 39 40 FEEDER_AUDIT_ DETAILS FEEDER_AUDIT 93 1 tipo 4*S+L+3 4*S+L+3 4*S+3*B+L+10 3*S+3 S S 17*S+3*B+3*L+20 provider_PartyIdentified location_PartyIdentified time_DvDateTime subject_PartyProxy versionId_String systemId_String 1 17*S+3*B+3*L+20 17*S+3*B+3*L+20 4*S+5 L L 38*S+6*B+8*L+45 tipo oa_FeederAuditDetails fa_FeederAuditDetails oc_DvEncapsulated os_ListDvIdentifier fi_ListDvIdentifier Polimórfico Polimórfico Polimórfico Polimórfico 41 ARCHETYPED 1 1+S 1+S S 3*S+3 tipo archetypeId_ArchetypeId templateId_TemplateId rmVersion_String 42 LINK 1 7*S+L+6 7*S+L+6 1+S 15*S+2*L+14 tipo meaning_DvText type_DvText target_DvEhrUri 1 1+S 7*S+L+6 3*S+3 38*S+6*B+8*L+45 L S 50*S+6*B+10*L+56 tipo uid_T Polimórfico name_DvText Polimórfico archetypeDtls_Archetyped feederAudit_FeederAudit links_ListLink archetypeNodeId_String Abstrata LOCATABLE<T> Polimórfico Polimórfico common.change_control VERSION 1 3*S+2 24*S+3*B+3*L+28 S 28*S+3*B+3*L+31 tipo contribution_ObjectRef commitAd_AuditDetails signature_String Polimórfico Polimórfico Abstrata Apêndice B 43 ORIGINAL_ VERSION<T> 94 28*S+3*B+3*L+31 Version 1+S 1+S 9*S+L+8 L L 1+B 39*S+4*B+5*L+46 44 IMPORTED_ VERSION<T> Herança uid_ObjectVersionId preV_ObjectVersionId lifecycState_DvCodedText other_ListObjectVersionId attestions_ListAttestation data_T Polimórfico 28*S+3*B+3*L+31 Version Herança 39*S+4*B+5*L+46 item_OriginalVersionT 67*S+7*B+8*L+77 45 46 VERSIONED_ OBJECT CONTRIBUTION 1 1+S 3*S+2 4*S+3*B+L+10 8*S+3*B+L+14 tipo uid_HierObjectId ownerId_ObjectRef timeCreated_DvDateTime 1 1+S 24*S+3*B+3*L+28 L 25*S+3*B+4*L+30 tipo uid_HierObjectId audit_AuditDetails versions_ListObjectRef Polimórfico Polimórfico Polimórfico common.generic 47 AUDIT_DETAILS 1 3*S+3 4*S+3*B+L+10 9*S+L+8 7*S+L+6 S 24*S+3*B+3*L+28 tipo commiter_PartyProxy Polimórfico tCommited_DvDateTime changeType_DvCodedText description_DvText Polimórfico systemId_String 48 ATTESTATION 24*S+3*B+3*L+28 1 20*S+2*L+32 7*S+L+6 1+S S 53*S+3*B+6*L+68 auditDetails isPending_Boolean attView_DvMultimedia reason_DvText items_DvEhrUri proof_String Herança Polimórfico Apêndice B 49 50 51 52 REVISION_ HISTORY_ITEM 95 1 tipo 1+S L S+L+2 versionId_ObjectVersionId audits_ListAuditDetails 1 tipo L L+1 it_ListRevisionHistoryItem PARTICIPATION 1 3*S+3 7*S+L+6 9*S+L+8 2*B+7 20*S+3*L+2*B+25 tipo perfomer_PartyProxy Polimórfico function_DvText Polimórfico mode_DvCodedText time_DvIntervalDvDateTime PARTY_PROXY 1 3*S+2 3*S+3 tipo externalRef_PartyRef 3*S+3 partyProxy L S 4*S+L+3 identifiers_ListDvIdentifier name_String REVISION_ HISTORY PARTY_ IDENTIFIED Polimórfico Abstrata Herança 53 PARTY_RELATED 4*S+L+3 9*S+L+8 13*S+2*L+11 partyIdentified relantionship_DvCodedText Herança 54 PARTY_SELF partyProxy Herança 3*S+3 3*S+3 common.resource 55 TRANSLATION _DETAILS 1 tipo 2*S+2 2*L 2*L S 1 language_CodePhrase otherDtls_HashStringString author_HashStringString accreditation_String Apêndice B 56 57 96 RESOURCE_ DESCRIPTION 1 _ITEM 2*S+2 2*L 2*L L S S S S 6*S+2+5*L+1 RESOURCE_ 1 DESCRIPTION 4*S+8*L+5 2*L 2*L L L S S 6*S+14*L+6 AUTHORED_ RESOURCE tipo language_CodePhrase origRsrcUri_HashStringString otherDetails_HashStringString keywords_ListString purpose_String use_String misuse_String copyright_String tipo parentRsrc_AuthoredResource Polimórfico origAuthor_HashStringString otherDetails_HashStringString otherContributors_ListString dt_ListResourceDescriptionItem lifecycleState_String resourcePackageUri_String 1 isControlled_Boolean 2*S+2 2*S+6*L+1 L+1 L 4*S+8*L+5 originalLanguage_CodePhrase descr_ResourceDescription revHistory_RevisionHistory transl_ListTranslationDetails Abstrata common.directory 58 59 FOLDER 50*S+6*B+10*L+56 locatable L folders_ListFolder L items_ListObjectRef 50*S+6*B+12*L+56 VERSIONED_ 8*S+3*B+L+14 FOLDER 8*S+3*B+L+14 versionedObject Pacote: data_structures; versão: 1.0.3 data_structures.representation Herança Polimórfico Herança Apêndice B 97 ITEM 50*S+6*B+10*L+56 50*S+6*B+10*L+56 locatable 60 ELEMENT 50*S+6*B+10*L+56 9*S+L+8 B 59*S+7*B+11*L+64 item Herança nullFlavour_DvCodedText value_DataValue Polimórfico 61 CLUSTER 50*S+6*B+10*L+56 L 50*S+6*B+11*L+56 item items_ListItem Herança Abstrata Herança Polimórfico data_structures.item_structure DATA_STRUCTURE 50*S+6*B+10*L+56 50*S+6*B+10*L+56 locatable Herança Abstrata ITEM_STRUCTURE 50*S+6*B+10*L+56 50*S+6*B+10*L+56 dataStructure Herança Abstrata 62 ITEM_LIST 50*S+6*B+10*L+56 L 50*S+6*B+11*L+56 itemStructure items_ListElement Herança Polimórfico 63 ITEM_TREE 50*S+6*B+10*L+56 L 50*S+6*B+11*L+56 itemStructure items_ListItem Herança Polimórfico 64 ITEM_SINGLE 50*S+6*B+10*L+56 itemStructure 50*S+6*B+10*L+56 item_Element 100*S+12*B+20*L+112 Herança 65 ITEM_TABLE 50*S+6*B+10*L+56 L 50*S+6*B+11*L+56 Herança itemStructure rows_ListCluster data_structures.history EVENT 50*S+6*B+10*L+56 4*S+3*B+L+10 B B 54*S+11*B+20*L+66 locatable time_DvDateTime state_ItemStructure data_ItemStructure Herança Polimórfico Polimórfico Abstrata Apêndice B 98 66 INTERVAL_EVENT 54*S+11*B+20*L+66 4 4*S+3*B+L+11 9*S+L+8 67*S+14*B+22*L+89 event Herança sampleCount_Integer width_DvDuration mathFunc_DvCodedText 67 POINT_EVENT 54*S+11*B+20*L+66 event 54*S+11*B+20*L+66 Herança 68 HISTORY 50*S+6*B+10*L+56 4*S+3*B+L+10 4*S+3*B+L+11 4*S+3*B+L+11 B L 62*S+15*B+14*L+88 Herança dataStructure origin_DvDateTime period_DvDuration duration_DvDuration summary_ItemStructure events_ListEvent Polimórfico Polimórfico Pacote: composition; versão: 1.0.4 69 EVENT_CONTEXT 1 B 4*S+3*B+L+10 4*S+3*B+L+10 9*S+L+8 B L S 18*S+7*B+4*L+29 pathable Herança hlthFacilty_PartyIdentified Polimórfico startTime_DvDateTime endTime_DvDateTime setting_DvCodedText otherCt_ItemStructure Polimórfico partp_ListParticipation location_String 70 COMPOSITION locatable Herança context_EventContext composer_PartyProxy Polimórfico category_DvCodedText language_CodePhrase territory_CodePhrase content_ListContentItem Polimórfico 50*S+6*B+10*L+56 18*S+7*B+4*L+29 B 9*S+L+8 2*S+2 2*S+2 L 81*S+14*B+16*L+97 composition.content CONTENT_ITEM 50*S+6*B+10*L+56 50*S+6*B+10*L+56 locatable composition.navigation Herança Abstrata Apêndice B 71 SECTION 99 50*S+6*B+10*L+56 L 50*S+6*B+11*L+56 contentItem items_ListContentItem Herança Polimórfico composition.entry 72 ACTIVITY 73 INSTRUCTION _DETAILS 74 50*S+6*B+10*L+56 B 6*S+5 S 51*S+13*B+10*L+61 locatable Herança description_ItemStructure Polimórfico timing_DvParsable actionArchetypeId_String 1 pathable 4*S+2 B S 5*S+B+3 instructionId_LocatableRef wfDetails_ItemStructure Polimórfico activityId_String Herança ISM_TRANSITION 1 9*S+L+8 9*S+L+8 9*S+L+8 L 27*S+4*L+9 pathable Herança currentState_DvCodedText transition_DvCodedText careflowStep_DvCodedText reason_ListDvText Polimórfico ENTRY 50*S+6*B+10*L+56 2*S+2 2*S+3 3*S+3 3*S+3 3*S+2 L 63*S+6*B+11*L+69 contentItem language_CodePhrase encoding_CodePhrase subject_PartyProxy provider_PartyProxy workflowId_ObjectRef otherP_ListParticipation CARE_ENTRY 63*S+6*B+11*L+69 B B 63*S+8*B+11*L+69 entry protocol_ItemStructure guidelineId_ObjectRef Herança Polimórfico Polimórfico Abstrata 75 ADMIN_ENTRY 63*S+6*B+11*L+69 B 63*S+7*B+11*L+69 entry data_ItemStructure Herança Polimórfico 76 OBSERVATION 63*S+8*B+11*L+69 careEntry Herança 62*S+15*B+14*L+88 data_HistoryItemStructure 62*S+15*B+14*L+88 state_HistoryItemStructure 187*S+38*B+39*L+185 Herança Polimórfico Polimórfico Polimórfico Abstrata Apêndice B 100 77 EVALUATION 63*S+8*B+11*L+69 careEntry B data_ItemStructure 63*S+9*B+11*L+69 Herança Polimórfico 78 INSTRUCTION 63*S+8*B+11*L+69 careEntry B narrative_DvText 4*S+3*B+L+10 expiryTime_DvDateTime 6*S+5 wfDefinition_DvParsable L activities_ListActivity 74*S+11*B+13*L+84 Herança Polimórfico 79 ACTION 63*S+8*B+11*L+69 careEntry 4*S+3*B+L+10 time_DvDateTime 27*S+4*L+9 itr_IsmTransition 5*S+B+3 idt_InstructionDetails B description_ItemStructure 99*S+13*B+15*L+91 Herança Polimórfico Pacote: demografic; versão: 1.0.4 PARTY 50*S+6*B+10*L+56 B L L L L 50*S+7*B+14*L+56 locatableHierObjectId Herança details_ItemStructure Polimórfico identities_ListPartyIdentity contacts_ListContact reverseRel_ListLocatableRef rel_ListPartyRelationship Abstrata 80 ROLE 50*S+7*B+14*L+56 2*B+7 1+S L 51*S+9*B+15*L+64 party Herança tValidity_DvIntervalDvDate performer_PartyRef capabilities_ListCapability 81 PARTY_ RELATIONSHIP 50*S+6*B+10*L+56 locatable 1+S 1+S B 2*B+7 52*S+9*B+10*L+65 82 Herança source_PartyRef target_PartyRef details_ItemStructure Polimórfico tValidity_DvIntervalDvDate PARTY_IDENTITY 50*S+6*B+10*L+56 locatable B details_ItemStructure 50*S+7*B+10*L+56 Herança Polimórfico Apêndice B 101 83 CONTACT 50*S+6*B+10*L+56 locatable Herança 2*B+7 tValidity_DvIntervalDvDate L addresses_ListAddress 50*S+8*B+1’*L+63 84 ADDRESS 50*S+6*B+10*L+56 locatable B details_ItemStructure 50*S+7*B+10*L+56 85 CAPABILITY 50*S+6*B+10*L+56 locatable Herança B credentials_ItemStructure Polimórfico 2*B+7 tValidity_DvIntervalDvDate 50*S+9*B+10*L+63 86 ACTOR 50*S+7*B+14*L+56 party L languages_ListDvText L roles_ListPartyRef 50*S+7*B+16*L+56 Herança Polimórfico 87 PERSON 50*S+7*B+16*L+56 actor 50*S+7*B+16*L+56 Herança 88 ORGANISATION 50*S+7*B+16*L+56 actor 50*S+7*B+16*L+56 Herança 89 GROUP 50*S+7*B+16*L+56 actor 50*S+7*B+16*L+56 Herança 90 AGENT 50*S+7*B+16*L+56 actor 50*S+7*B+16*L+56 Herança Herança Polimórfico Pacote: ehr; versão: 1.0.4 91 92 EHR VERSIONED_ EHR_ACCESS 1 1+S 1+S 3*S+2 3*S+2 3*S+2 4*S+3*B+L+10 L L 15*S+3*B+3*L+17 tipo systemId_HierObjectId ehrId_HierObjectId ehrStatus_ObjectRef ehrAccess_ObjectRef directory_ObjectRef timeCreated_DvDateTime contributions_ListObjectRef compositions_ListObjectRef Polimórfico Polimórfico Polimórfico 8*S+3*B+L+14 versionedObject Herança 8*S+3*B+L+14 Polimórfico Polimórfico Apêndice B 102 93 VERSIONED_ EHR_ACCESS 50*S+6*B+10*L+56 locatable Herança B st_AccessControlSettings 50*S+7*B+10*L+56 94 VERSIONED_ EHR_STATUS 8*S+3*B+L+14 8*S+3*B+L+14 versionedObject Herança 95 EHR_STATUS 50*S+6*B+10*L+56 1 1 3*S+3 B 53*S+7*B+10*L+61 locatable isQueryable_Boolean isModifiable_Boolean subject_PartySelf otherDt_ItemStructure Herança 8*S+3*B+L+14 8*S+3*B+L+14 versionedObject Herança 96 VERSIONED_ COMPOSITION Polimórfico Pacote: integration; versão: 1.0.1 97 GENERIC_ENTRY 50*S+6*B+10*L+56 contentItem 50*S+6*B+11*L+56 data_ItemTree 100*S+12*B+20*L+112 Herança Pacote: ehr_extract; versão: 1.0.4 ehr_extract.common 98 EXTRACT_REQUEST50*S+6*B+10*L+56 locatableHierObjectId Herança 9*S+2*B+2*L+29 extractSpec_ExtractSpec 6*S+3*B+2*L+15 updateSpec_UpdateSpec 65*S+11*B+14*L+100 99 EXTRACT_ACTION 50*S+6*B+10*L+56 locatableHierObjectId _REQUEST 3*S+2 requestId_ObjectRef 9*S+L+8 action_DvCodedText 62*S+6*B+11*L+66 100 EXTRACT_SPEC 1 1 4 4 2*B+11 1+L 9*S+L+8 L 9*S+2*B+2*L+30 Herança Polimórfico tipo includeMultimedia_Boolean priority_Integer linkDepth_Integer vSpec_ExtractVersionSpec manifest_ExtractManifest extractType_DvCodedText criteria_ListDvParsable Apêndice B 103 101 EXTRACT_ MANIFEST 1 L 1+L tipo e_ListExtractEntityManifest 102 EXTRACT_ENTITY _MANIFEST 1 S S S L L 4*S+2*L+1 tipo extractIdKey_String ehrtId_String subjectId_String otherIds_ListString itemList_ListObjectRef Polimórfico 8*S+3*B+L+14 8*S+3*B+L+14 versionedObject Herança 103 VERSIONED_ COMPOSITION 104 EXTRACT_VERSION 1 _SPEC 1 1 1 2*B+7 2*B+11 tipo incAllVersions_Boolean incRevHistory_Boolean incData_Boolean cm_DvIntervalDvDateTime 105 EXTRACT_ UPDATE_SPEC 1 1 4*S+3*B+L+11 2*S+2 L 6*S+3*B+2*L+15 tipo persistInServer_Boolean repeatPeriod_DvDuration updateMethod_CodePhrase triggerEv_ListDvCodedText 106 EXTRACT 50*S+6*B+10*L+56 locatable Herança 4 sequenceNr_Integer 9*S+2*B+2*L+29 specification_ExtractSpec 1+S requestId_HierObjectId 1+S systemId_HierObjectId 4*S+3*B+L+10 timeCreated_DvDateTime L p_ListExtractParticipation 63*S+11*B+14*L+95 107 EXTRACT_ CHAPTER 50*S+6*B+10*L+56 locatable L items_ListExtractItem 50*S+6*B+11*L+56 Herança 108 EXTRACT_ENTITY _CHAPTER 50*S+6*B+11*L+56 extractChapter S extractIdKey_String 51*S+6*B+11*L+56 Herança Apêndice B EXTRACT_ITEM 104 50*S+6*B+10*L+56 locatable 50*S+6*B+10*L+56 109 EXTRACT_FOLDER 50*S+6*B+10*L+56 extractItem L items_ListExtractItem 50*S+6*B+11*L+56 EXTRACT _CONTENT _ITEM<S> 110 EXTRACT_ PARTICIPATION Herança Abstrata Herança Polimórfico 50*S+6*B+10*L+56 1 1 1 B 50*S+7*B+10*L+59 extractItem isPrimary_Boolean isChanged_Boolean isMasked_Boolean item_Any Herança 1 2*B+7 S B 9*S+L+8 10*S+3*B+L+16 tipo t_DvIntervalDvDateTime performer_String function_DvText Polimórfico mode_DvCodedText Polimórfico Abstrata ehr_extract.openehr_extract 111 OPENEHR_ CONTENT_ITEM 50*S+7*B+10*L+59 extractContentItem 50*S+7*B+10*L+59 XVersionedObject Herança 112 X_VERSIONED _OBJECT 1 4 4 1+S 3*S+2 4*S+3*B+L+10 L+1 L 8*S+3*B+3*L+23 tipo totalVersionCount_Integer extVersionCount_Integer uid_HierObjectId ownerId_ObjectRef Polimórfico timeCreated_DvDateTime revHist_RevisionHistory vers_ListOriginalVersion 113 X_VERSIONED_ EHR_ACCESS 8*S+3*B+3*L+23 8*S+3*B+3*L+23 XVersionedObject Herança 114 X_VERSIONED_ EHR_STATUS 8*S+3*B+3*L+23 8*S+3*B+3*L+23 XVersionedObject Herança 115 X_VERSIONED _COMPOSITION 8*S+3*B+3*L+23 8*S+3*B+3*L+23 XVersionedObject Herança Apêndice B 105 116 X_VERSIONED _FOLDER 8*S+3*B+3*L+23 8*S+3*B+3*L+23 XVersionedObject Herança 117 X_VERSIONED _PARTY 8*S+3*B+3*L+23 8*S+3*B+3*L+23 XVersionedObject Herança ehr_extract.generic_extract 118 GENERIC _CONTENT _ITEM 50*S+7*B+10*L+59 extractContentItemLocatable Herança 9*S+L+8 itemType_DvCodedText 9*S+L+8 itemStatus_DvCodedText 4*S+3*B+L+10 creationT_DvDateTime 4*S+3*B+L+10 authorisationT_DvDateTime S author_String S authoriser_String S versionId_String S itemTypeVersion_String S versionSetId_String S systemId_String 2*L otherDt_HashStringString 82*S+13*B+16*L+95 ehr_extract.sync_extract 119 SYNC_EXTRACT _REQUEST 50*S+6*B+10*L+56 messageContent 4*S+3*B+2*L+12 spec_SyncExtractSpec 54*S+9*B+12*L+68 Herança 120 SYNC_EXTRACT 50*S+6*B+10*L+56 messageContent 4*S+3*B+2*L+13 spec_SyncExtractSpec L items_ListXContribution 54*S+9*B+13*L+68 Herança 121 SYNC_EXTRACT _SPEC 1 1 1 4*S+3*B+L+10 L 4*S+3*B+2*L+13 122 X_CONTRIBUTION 1+S 24*S+3*B+3*L+28 L 25*S+3*B+4*L+28 tipo includesVersions_Boolean allContributions_Boolean contrSince_DvDateTime contrList_ListHierObjectID uid_HierObjectId audit_AuditDetails versions_ListVersions Polim. Apêndice B 106 ehr_extract.message MESSAGE_ CONTENT 50*S+6*B+10*L+56 locatable 50*S+6*B+10*L+56 Herança Abstrata 123 ADDRESSED_ MESSAGE 1 4 77*S+9*B+10*L+88 S S L 79*S+9*B+11*L+93 tipo urgency_Integer message_Message sender_String senderReference_String addresses_ListString 124 MESSAGE 1 24*S+3*B+3*L+28 50*S+6*B+10*L+56 3*S+3 S 77*S+9*B+10*L+88 tipo audit_AuditDetails Polimórfico content_MessageContent Polimórfico author_PartyProxy Polimórfico signature_String