Mais

Como atualizar apenas campos não vazios com um valor de entrada do usuário em um modelo?

Como atualizar apenas campos não vazios com um valor de entrada do usuário em um modelo?


Eu tenho um modelo que itera por meio de um GDB, preenchendo o mesmo campo de atributo em cada classe de recurso com um valor de parâmetro. Desta forma, posso marcar todos os FCs na geodatabase quanto a qual projeto eles fazem parte.

No entanto, às vezes um GDB contém FCs que são migrados de outros projetos GDB, com o atributo já preenchido com um valor que o designa como parte do outro projeto. Atualmente, meu modelo pisa nesse valor e o substitui com o novo código do projeto, embora eu queira reter as informações existentes.

Gostaria que o modelo avaliasse o campo para o registro com o qual está trabalhando e, se o campo não estiver vazio, deixar o campo sozinho e passar para o próximo registro. No entanto, se o campo for, ele deve gravar o novo código do projeto no campo e seguir em frente.

Analisei um pouco as perguntas e respostas se / então, mas não encontrei uma maneira simples de detectar se um campo está vazio ou não e, se não estiver, como ignorá-lo?


Agora estou tentando escrever algum Python para lidar com isso e tenho o seguinte, no entanto, não tenho certeza de como obter o valor do parâmetro da entrada do usuário no modelo (ou seja, UserInputFromModelParameter), ou qual comando enviar para fazer o script pular para o próximo registro se o script for verdadeiro.

# configurar variáveis ​​def BlockName: def IgnoreField: # definir nome do bloco do usuário inpuit BlockName = [UserInputFromModelParameter] # definir valores para observar IgnoreField = [NULL, ""] # avaliar o campo se [BlockID] == IgnoreField MoveToNextRecord () ; senão: [BlockID] = BlockName ();

Eu escrevi algum código VB para tentar lidar com isso com um if / then, parecia um pouco mais simples do que python.

Aqui está o código,% BlockID (entre aspas)% é o valor de entrada do usuário, [BlockID] é o campo sendo avaliado / escrito e Expression = "Output".

If IsNull ([BlockID]) Then Output =% Block (entre aspas)% Elseif [BlockID] <= "" Then Output =% Block (entre aspas)% Else Output = [BlockID] End If

… Parece estar funcionando, embora retorne com um erro se atingir um FC sem o campo "BlockID".


Use uma string vazia, nula ou remova a propriedade vazia na solicitação / resposta da API

Ao transferir um objeto por meio de uma API, como no formato JSON sem esquema, qual é a forma ideal de retornar uma propriedade de string inexistente? Eu sei que existem diferentes maneiras de fazer isso, conforme os exemplos nos links listados abaixo.

Tenho certeza de que usei null no passado, mas não tenho um bom motivo para dar isso. Parece simples usar null ao lidar com o banco de dados. Mas o banco de dados parece um detalhe de implementação que não deve preocupar a parte do outro lado da API. Por exemplo. eles provavelmente usam um armazenamento de dados sem esquema que armazena apenas propriedades com valores (não nulos).

Do ponto de vista do código, restringir funções de string para trabalhar apenas com um tipo, ou seja, string (não nulo), torna mais fácil provar que evitar o nulo também é uma razão para ter o objeto Option. Portanto, se o código que produz a solicitação / resposta não usa nulo, meu palpite é que o código do outro lado da API não será forçado a usar nulo também.

Eu gosto da ideia de usar uma string vazia como uma maneira fácil de evitar o uso de null. Um argumento que ouvi para usar null e contra a string vazia é que a string vazia significa que a propriedade existe. Embora eu entenda a diferença, também me pergunto se é apenas o detalhe da implementação e se usar string nula ou vazia faz alguma diferença na vida real. Também me pergunto se uma string vazia é análoga a uma matriz vazia.

Então, qual é a melhor maneira de fazer isso que atenda a essas preocupações? Depende do formato do objeto que está sendo transferido (esquema / sem esquema)?


Conteúdo

Esta representação de dados é análoga a métodos eficientes de espaço de armazenamento de uma matriz esparsa, onde apenas valores não vazios são armazenados. Em um modelo de dados EAV, cada par de valor de atributo é um fato que descreve uma entidade, e uma linha em uma tabela EAV armazena um único fato. As tabelas EAV são frequentemente descritas como "longas e finas": "longas" refere-se ao número de linhas, "finas" às poucas colunas.

Os dados são registrados em três colunas:

  • O entidade: o item que está sendo descrito.
  • O atributo ou parâmetro: normalmente implementado como uma chave estrangeira em uma tabela de definições de atributos. A tabela de definições de atributos pode conter as seguintes colunas: um ID de atributo, nome de atributo, descrição, tipo de dados e colunas que auxiliam na validação de entrada, por exemplo, comprimento máximo de string e expressão regular, conjunto de valores permitidos, etc.
  • O valor do atributo.

Edição de exemplo

Considere como alguém tentaria representar um registro clínico de uso geral em um banco de dados relacional. Claramente, criar uma tabela (ou um conjunto de tabelas) com milhares de colunas não é viável, porque a grande maioria das colunas seria nula. Para complicar as coisas, em um prontuário longitudinal que acompanha o paciente ao longo do tempo, podem haver vários valores do mesmo parâmetro: a altura e o peso de uma criança, por exemplo, mudam à medida que a criança cresce. Finalmente, o universo dos achados clínicos continua crescendo: por exemplo, surgem doenças e novos testes de laboratório são desenvolvidos, o que exigiria a adição constante de colunas e a revisão constante da interface do usuário. (A situação em que a lista de atributos muda com frequência é chamada de "volatilidade de atributo" no jargão do banco de dados.)

O seguinte mostra um instantâneo de uma tabela EAV para descobertas clínicas de uma visita a um médico para febre na manhã de 05/01/98. As entradas mostradas entre colchetes angulares são referências a entradas em outras tabelas, mostradas aqui como texto em vez de valores de chave estrangeira codificados para facilitar a compreensão. Neste exemplo, o valores são todos valores literais, mas também podem ser listas de valores predefinidos. Os últimos são particularmente úteis quando os valores possíveis são conhecidos por serem limitados (isto é, enumeráveis).

  • O entidade. Para os achados clínicos, a entidade é o evento do paciente: uma chave estrangeira em uma tabela que contém, no mínimo, um ID de paciente e um ou mais carimbos de data / hora (por exemplo, o início e o fim da data / hora do exame) que registram quando o evento descrito aconteceu.
  • O atributo ou parâmetro: uma chave estrangeira em uma tabela de definições de atributos (neste exemplo, definições de descobertas clínicas). No mínimo, a tabela de definições de atributo conteria as seguintes colunas: um ID de atributo, nome de atributo, descrição, tipo de dados, unidades de medida e colunas que auxiliam na validação de entrada, por exemplo, comprimento máximo de string e expressão regular, máximo e mínimo permitido valores, conjunto de valores permitidos, etc.
  • O valor do atributo. Isso dependeria do tipo de dados e discutiremos como os valores são armazenados em breve.

O exemplo abaixo ilustra os achados de sintomas que podem ser vistos em um paciente com pneumonia.

Os dados EAV descritos acima são comparáveis ​​ao conteúdo de um recibo de venda de supermercado (que seria refletido em uma tabela de itens de linha de venda em um banco de dados). O recibo lista apenas os detalhes dos itens realmente comprados, em vez de listar todos os produtos da loja que o cliente pode ter comprado, mas não comprou. Como os achados clínicos de um determinado paciente, o recibo de venda é esparso.

  • A "entidade" é a id de venda / transação - uma chave estrangeira em uma tabela de transações de vendas. Isso é usado para marcar cada item de linha internamente, embora no recibo as informações sobre a venda apareçam na parte superior (localização da loja, data / hora da venda) e na parte inferior (valor total da venda).
  • O "atributo" é uma chave estrangeira em uma tabela de produtos, de onde se consulta a descrição, preço unitário, descontos e promoções, etc. (Os produtos são tão voláteis quanto as descobertas clínicas, possivelmente ainda mais: novos produtos são introduzidos a cada mês , enquanto outros são retirados do mercado se a aceitação do consumidor for baixa. Nenhum designer de banco de dados competente codificaria produtos individuais, como Doritos ou Diet Coke, como colunas em uma tabela.)
  • Os "valores" são a quantidade adquirida e o preço total do item de linha.

Modelagem de linha, [ esclarecimento necessário ] onde fatos sobre algo (neste caso, uma transação de venda) são registrados como múltiplos filas ao invés de múltiplo colunas, é uma técnica de modelagem de dados padrão. As diferenças entre modelagem de linha e EAV (que pode ser considerado um generalização de modelagem de linha) são:

  • Uma tabela modelada por linha é homogêneo nos fatos que descreve: uma tabela de itens de linha descreve apenas os produtos vendidos. Em contraste, uma tabela EAV contém quase qualquer tipo de fato.
  • O tipo de dados da (s) coluna (s) de valor em uma tabela modelada por linha é pré-determinado pela natureza dos fatos que registra. Por outro lado, em uma tabela EAV, o tipo de dados conceituais de um valor em uma linha específica depende do atributo nessa linha. Conclui-se que, em sistemas de produção, permitir a entrada direta de dados em uma tabela EAV seria uma receita para o desastre, porque o próprio mecanismo de banco de dados não seria capaz de realizar uma validação robusta de entrada. Veremos mais tarde como é possível construir frameworks genéricos que realizam a maioria das tarefas de validação de entrada, sem codificação infinita em uma base de atributo por atributo.

Em um repositório de dados clínicos, a modelagem de linha também encontra vários usos, o subesquema de teste de laboratório é normalmente modelado dessa forma, porque os resultados dos testes de laboratório são normalmente numéricos ou podem ser codificados numericamente.

As circunstâncias em que você precisaria ir além da modelagem de linha padrão para EAV estão listadas abaixo:

  • O tipo de dados de atributos individuais varia (conforme visto com os achados clínicos).
  • As categorias de dados são numerosas, crescentes ou flutuantes, mas o número de instâncias (registros / linhas) dentro de cada categoria é muito pequeno. Aqui, com a modelagem convencional, o diagrama entidade-relacionamento do banco de dados pode ter centenas de tabelas: as tabelas que contêm milhares / milhões de linhas / instâncias são enfatizadas visualmente da mesma forma que aquelas com muito poucas linhas. Os últimos são candidatos à conversão em representação EAV.

Essa situação surge em ambientes de modelagem de ontologia, onde as categorias ("classes") geralmente devem ser criadas dinamicamente e algumas classes são frequentemente eliminadas em ciclos subsequentes de prototipagem.

Certas classes ("híbridas") têm alguns atributos que não são esparsos (presentes em todas ou na maioria das instâncias), enquanto outros atributos são altamente variáveis ​​e esparsos. Os últimos são adequados para modelagem EAV. Por exemplo, as descrições de produtos feitos por uma empresa de conglomerado dependem da categoria do produto, por exemplo, os atributos necessários para descrever uma marca de lâmpada são bastante diferentes daqueles exigidos para descrever um dispositivo de imagem médica, mas ambos têm atributos comuns, como embalagem custo unitário e por item.

Descrição dos conceitos Editar

A entidade Editar

Em dados clínicos, a entidade é tipicamente um evento clínico, conforme descrito acima. Em configurações de uso mais geral, a entidade é uma chave estrangeira em uma tabela de "objetos" que registra informações comuns sobre cada "objeto" (coisa) no banco de dados - no mínimo, um nome preferido e uma breve descrição, bem como o categoria / classe de entidade a que pertence. Cada registro (objeto) nesta tabela é atribuído a um ID de objeto gerado por máquina.

A abordagem da "tabela de objetos" foi iniciada por Tom Slezak e colegas da Lawrence Livermore Laboratories para o banco de dados Chromosome 19 e agora é padrão na maioria dos grandes bancos de dados de bioinformática. O uso de uma tabela de objetos não exige o uso simultâneo de um projeto EAV: as tabelas convencionais podem ser usadas para armazenar os detalhes específicos da categoria de cada objeto.

O principal benefício de uma tabela de objetos central é que, por ter uma tabela de suporte de sinônimos de objetos e palavras-chave, pode-se fornecer um mecanismo de pesquisa padrão do Google em todo o sistema, onde o usuário pode encontrar informações sobre qualquer objeto de interesse sem precisar primeiro especifique a categoria a que pertence. (Isso é importante em sistemas de biociência, onde uma palavra-chave como "acetilcolina" pode se referir à própria molécula, que é um neurotransmissor, ou ao receptor biológico ao qual se liga.

O atributo Editar

Na própria tabela EAV, este é apenas um ID de atributo, uma chave estrangeira em uma tabela de Definições de Atributo, conforme declarado acima. No entanto, geralmente existem várias tabelas de metadados que contêm informações relacionadas a atributos, e elas serão discutidas em breve.

O valor Edit

Coagir todos os valores em strings, como no exemplo de dados EAV acima, resulta em uma estrutura simples, mas não escalonável: interconversões de tipo de dados constantes são necessárias se alguém quiser fazer algo com os valores e um índice sobre o valor coluna de uma tabela EAV é essencialmente inútil. Além disso, não é conveniente armazenar grandes dados binários, como imagens, no formato codificado em Base64 na mesma tabela que pequenos inteiros ou strings. Portanto, sistemas maiores usam tabelas EAV separadas para cada tipo de dados (incluindo objetos binários grandes, "BLOBS"), com os metadados para um determinado atributo identificando a tabela EAV na qual seus dados serão armazenados. Na verdade, essa abordagem é bastante eficiente porque a quantidade modesta de metadados de atributo para uma determinada classe ou forma que um usuário escolhe para trabalhar pode ser armazenada em cache prontamente na memória. No entanto, é necessário mover os dados de uma tabela para outra se o tipo de dados de um atributo for alterado.

EAV, como um meio de representação de conhecimento de uso geral, originou-se do conceito de "listas de associação" (pares atributo-valor). Comumente usados ​​hoje, eles foram introduzidos pela primeira vez na linguagem LISP. [1] Os pares de atributo-valor são amplamente usados ​​para diversos aplicativos, como arquivos de configuração (usando uma sintaxe simples como atributo = valor) Um exemplo de uso do EAV sem banco de dados é o UIMA (Unstructured Information Management Architecture), um padrão agora gerenciado pela Apache Foundation e empregado em áreas como processamento de linguagem natural. O software que analisa o texto normalmente marca ("anota") um segmento: o exemplo fornecido no tutorial UIMA é um programa que realiza o reconhecimento de entidade nomeada (NER) em um documento, anotando o segmento de texto "Presidente Bush" com a anotação- triplo de valor de atributo (Pessoa, Full_Name, "George W. Bush"). [2] Essas anotações podem ser armazenadas em uma tabela de banco de dados.

Embora o EAV não tenha uma conexão direta com pares de AV, Stead e Hammond parecem ser os primeiros a conceber seu uso para armazenamento persistente de dados arbitrariamente complexos. [3] Os primeiros sistemas de registro médico a empregar EAV foram o registro médico eletrônico Regenstrief (esforço liderado por Clement MacDonald), [4] o sistema TMR (The Medical Record) de William Stead e Ed Hammond e o HELP Clinical Data Repository (CDR) criado pelo grupo de Homer Warner no Hospital LDS, Salt Lake City, Utah. [5] [6] (O sistema Regenstrief na verdade usava um design Paciente-Atributo-Timestamp-Value: o uso do timestamp suportava a recuperação de valores para um determinado paciente / atributo em ordem cronológica.) Todos esses sistemas, desenvolvidos na década de 1970 , foram lançados antes que os sistemas comerciais baseados no modelo de banco de dados relacional da EF Codd estivessem disponíveis, embora o HELP tenha sido muito mais tarde portado para uma arquitetura relacional e comercializado pela 3M corporation. (Observe que, embora o artigo de referência de Codd tenha sido publicado em 1970, seu tom altamente matemático teve o infeliz efeito de diminuir sua acessibilidade entre os tipos que não são da ciência da computação e, consequentemente, atrasar a aceitação do modelo nos círculos de fornecedores de software e TI. A contribuição de Christopher J. Date, colega de Codd na IBM, ao traduzir essas ideias em uma linguagem acessível, acompanhada de exemplos simples que ilustram seu poder, não pode ser subestimada.)

Um grupo do Columbia-Presbyterian Medical Center foi o primeiro a usar um mecanismo de banco de dados relacional como base de um sistema EAV. [7]

O sistema de gerenciamento de dados de estudos clínicos TrialDB de código aberto de Nadkarni et al. foi o primeiro a usar várias tabelas EAV, uma para cada tipo de dados DBMS. [8]

A estrutura EAV / CR, projetada principalmente por Luis Marenco e Prakash Nadkarni, sobrepôs os princípios de orientação a objetos no EAV [9], que se baseou na abordagem de tabela de objetos de Tom Slezak (descrita anteriormente na seção "Entidade"). SenseLab, um banco de dados neurocientífico acessível ao público, é construído com a estrutura EAV / CR.

O termo "banco de dados EAV" refere-se a um projeto de banco de dados em que uma proporção significativa dos dados é modelada como EAV. No entanto, mesmo em um banco de dados descrito como "baseado em EAV", algumas tabelas do sistema são tabelas relacionais tradicionais.

Conforme observado acima, a modelagem EAV faz sentido para categorias de dados, como achados clínicos, onde os atributos são numerosos e esparsos. Onde essas condições não se mantêm, a modelagem relacional padrão (ou seja, uma coluna por atributo) é preferível usando EAV não significa abandonar o bom senso ou princípios de bom design relacional. Em sistemas de registros clínicos, os subesquemas que lidam com dados demográficos e faturamento dos pacientes são normalmente modelados de maneira convencional. (Embora a maioria dos esquemas de banco de dados do fornecedor sejam proprietários, VistA, o sistema usado em todo o sistema médico do Departamento de Assuntos de Veteranos dos Estados Unidos (VA), conhecido como Veterans Health Administration (VHA), [10] é de código aberto e seu esquema é prontamente inspecionável, embora use um mecanismo de banco de dados MUMPS em vez de um banco de dados relacional.)

Conforme discutido em breve, um banco de dados EAV é essencialmente impossível de manter sem várias tabelas de suporte que contêm metadados de suporte. As tabelas de metadados, que normalmente superam as tabelas EAV por um fator de pelo menos três ou mais, são tipicamente tabelas relacionais padrão. [8] [9] Um exemplo de tabela de metadados é a tabela de Definições de Atributos mencionada acima.

Em um projeto EAV simples, os valores de um atributo são tipos de dados simples ou primitivos no que diz respeito ao mecanismo de banco de dados. No entanto, em sistemas EAV usados ​​para representação de dados altamente diversos, é possível que um determinado objeto (instância de classe) possa ter subestrutura: ou seja, alguns de seus atributos podem representar outros tipos de objetos, que por sua vez, podem ter subestrutura, para um nível arbitrário de complexidade. Um carro, por exemplo, tem um motor, uma transmissão, etc., e o motor tem componentes como cilindros. (A subestrutura permitida para uma determinada classe é definida dentro dos metadados de atributos do sistema, como discutido mais tarde. Assim, por exemplo, o atributo "random-access-memory" poderia se aplicar à classe "computer", mas não à classe "engine" .)

Para representar a subestrutura, incorpora-se uma tabela EAV especial onde a coluna de valor contém referências a outro entidades no sistema (ou seja, valores de chave estrangeira na tabela de objetos). Para obter todas as informações sobre um determinado objeto, é necessária uma travessia recursiva dos metadados, seguida por uma travessia recursiva dos dados que para quando cada atributo recuperado é simples (atômico). A travessia recursiva é necessária se os detalhes de uma classe individual são representados na forma convencional ou EAV, essa travessia é realizada em sistemas objeto-relacionais padrão, por exemplo. Na prática, o número de níveis de recursão tende a ser relativamente modesto para a maioria das classes, portanto, as penalidades de desempenho devido à recursão são modestas, especialmente com indexação de IDs de objeto.

EAV / CR (EAV com Classes e Relacionamentos) [11] [12] [13] refere-se a um framework que suporta subestruturas complexas. Seu nome é um tanto impróprio: embora tenha sido um outshoot do trabalho em sistemas EAV, na prática, muitas ou mesmo a maioria das classes em tal sistema podem ser representadas na forma relacional padrão, com base no fato de os atributos serem esparsos ou densos . EAV / CR é realmente caracterizado por seus metadados muito detalhados, que são ricos o suficiente para suportar a geração automática de interfaces de navegação para classes individuais sem ter que escrever código de interface de usuário classe por classe. A base de tais interfaces de navegador é que é possível gerar um lote de consultas SQL dinâmicas que são independentes da classe do objeto, primeiro consultando seus metadados e usando informações de metadados para gerar uma sequência de consultas nas tabelas de dados, e algumas dessas consultas podem ser arbitrariamente recursivas. Essa abordagem funciona bem para consultas de objeto por vez, como em interfaces de navegação baseadas na Web, onde clicar no nome de um objeto traz todos os detalhes do objeto em uma página separada: os metadados associados à classe desse objeto também facilitam apresentação dos detalhes do objeto, porque inclui legendas de atributos individuais, a ordem em que devem ser apresentados e como devem ser agrupados.

Uma abordagem para EAV / CR é permitir que as colunas contenham estruturas JSON, que assim fornecem a estrutura de classe necessária. Por exemplo, o PostgreSQL, a partir da versão 9.4, oferece suporte a coluna binária JSON (JSONB), permitindo que atributos JSON sejam consultados, indexados e unidos.

Nas palavras do Prof. Dr. Daniel Masys (ex-Presidente do Departamento de Informática Médica da Vanderbilt University), os desafios de trabalhar com EAV derivam do fato de que em um banco de dados EAV, o "esquema físico" (a forma como os dados são armazenados) é radicalmente diferente do "esquema lógico" - a maneira como os usuários e muitos aplicativos de software, como pacotes de estatísticas, o consideram, isto é, como linhas e colunas convencionais para classes individuais. (Como uma tabela EAV mistura conceitualmente maçãs, laranjas, toranjas e chop suey, se você quiser fazer qualquer análise dos dados usando um software de prateleira padrão, na maioria dos casos, você tem que converter subconjuntos para a forma colunar. [ 14] O processo de fazer isso, chamado de pivô, é importante o suficiente para ser discutido separadamente.)

Os metadados ajudam a realizar a prestidigitação que permite aos usuários interagir com o sistema em termos de esquema lógico em vez de físico: o software consulta continuamente os metadados para várias operações, como apresentação de dados, validação interativa, extração de dados em massa e consulta ad hoc. Os metadados podem realmente ser usados ​​para personalizar o comportamento do sistema.

Os sistemas EAV trocam a simplicidade na estrutura física e lógica dos dados pela complexidade em seus metadados, que, entre outras coisas, desempenha o papel que as restrições de banco de dados e integridade referencial desempenham em designs de banco de dados padrão. Essa compensação geralmente vale a pena, porque no esquema misto típico de sistemas de produção, os dados em tabelas relacionais convencionais também podem se beneficiar de funcionalidades como a geração automática de interface. A estrutura dos metadados é complexa o suficiente para incluir seu próprio subesquema no banco de dados: várias chaves estrangeiras nas tabelas de dados referem-se a tabelas dentro desse subesquema. Este subesquema é relacional padrão, com recursos como restrições e integridade referencial sendo usados ​​ao máximo.

A correção dos conteúdos de metadados, em termos do comportamento pretendido do sistema, é crítica e a tarefa de garantir a correção significa que, ao criar um sistema EAV, esforços consideráveis ​​de design devem ser feitos para construir interfaces de usuário para edição de metadados que podem ser usados ​​por pessoas na equipe que conhece o domínio do problema (por exemplo, medicina clínica), mas não são necessariamente programadores. (Historicamente, uma das principais razões pelas quais o sistema TMR pré-relacional não foi adotado em sites diferentes de sua instituição de origem era que todos os metadados eram armazenados em um único arquivo com uma estrutura não intuitiva. Personalização do comportamento do sistema alterando os conteúdos deste arquivo, sem causar a quebra do sistema, era uma tarefa tão delicada que os autores do sistema apenas confiaram em si mesmos para fazê-lo.)

Quando um sistema EAV é implementado por meio de RDF, a linguagem RDF Schema pode ser convenientemente usada para expressar tais metadados. Essas informações de esquema podem então ser usadas pelo mecanismo de banco de dados EAV para reorganizar dinamicamente sua estrutura de tabela interna para melhor eficiência. [15]

Algumas advertências finais sobre metadados:

  • Como a lógica de negócios está nos metadados em vez de explícita no esquema do banco de dados (ou seja, um nível removido, em comparação com sistemas projetados tradicionalmente), é menos aparente para quem não está familiarizado com o sistema. Ferramentas de navegação e relatório de metadados são, portanto, importantes para garantir a manutenção de um sistema EAV. No cenário comum em que os metadados são implementados como um subesquema relacional, essas ferramentas nada mais são do que aplicativos criados usando relatórios prontos para uso ou ferramentas de consulta que operam nas tabelas de metadados.
  • É fácil para um usuário com conhecimento insuficiente corromper (ou seja, introduzir inconsistências e erros em) metadados. Portanto, o acesso aos metadados deve ser restrito e uma trilha de auditoria de acessos e mudanças deve ser implementada para lidar com situações em que vários indivíduos têm acesso aos metadados. Usar um RDBMS para metadados simplificará o processo de manutenção da consistência durante a criação e edição de metadados, aproveitando os recursos do RDBMS, como suporte para transações. Além disso, se os metadados fizerem parte do mesmo banco de dados que os próprios dados, isso garante que o backup será feito pelo menos com a mesma frequência que os próprios dados, para que possam ser recuperados até um determinado momento.
  • A qualidade da anotação e da documentação nos metadados (ou seja, o texto narrativo / explicativo nas colunas descritivas do subesquema de metadados) deve ser muito maior, a fim de facilitar a compreensão por vários membros da equipe de desenvolvimento. Garantir a qualidade dos metadados (e mantê-los atualizados conforme o sistema evolui) tem alta prioridade no gerenciamento e manutenção de longo prazo de qualquer projeto que use um componente EAV. Metadados mal documentados ou desatualizados podem comprometer a viabilidade do sistema a longo prazo. [16] [17]

Informação capturada em edição de metadados

Editar metadados de atributos

  • Metadados de validação incluem tipo de dados, intervalo de valores permitidos ou associação em um conjunto de valores, correspondência de expressão regular, valor padrão e se o valor pode ser nulo. Em sistemas EAV que representam classes com subestrutura, os metadados de validação também registrarão a qual classe, se houver, um determinado atributo pertence.
  • Metadados de apresentação: como o atributo deve ser exibido para o usuário (por exemplo, como uma caixa de texto ou imagem de dimensões especificadas, uma lista suspensa ou um conjunto de botões de opção). Quando um objeto composto é composto de vários atributos, como no projeto EAV / CR, há metadados adicionais sobre a ordem em que os atributos devem ser apresentados e como esses atributos devem ser agrupados opcionalmente (sob títulos descritivos).
  • Para atributos que são parâmetros de laboratório, intervalos de valores normais, que podem variar por idade, sexo, estado fisiológico e método de ensaio, são registrados.
  • Metadados de agrupamento: Os atributos são normalmente apresentados como parte de um grupo de ordem superior, por exemplo, um formulário específico de especialidade. Os metadados de agrupamento incluem informações como a ordem em que os atributos são apresentados. Certos metadados de apresentação, como fontes / cores e o número de atributos exibidos por linha, se aplicam ao grupo como um todo.

Edição de metadados de validação avançada

  • Metadados de dependência: em muitas interfaces de usuário, a entrada de valores específicos em certos campos / atributos é necessária para desativar / ocultar determinados outros campos ou ativar / mostrar outros campos. (Por exemplo, se um usuário escolher a resposta "Não" para uma pergunta booleana "O paciente tem diabetes?", As perguntas subsequentes sobre a duração do diabetes, medicamentos para diabetes etc. devem ser desativadas.) uma estrutura genérica envolve o armazenamento de dependências entre os atributos de controle e os atributos controlados.
  • Cálculos e validação complexa: Como em uma planilha, o valor de certos atributos pode ser calculado e exibido, com base nos valores inseridos nos campos que são apresentados anteriormente na sequência. (Por exemplo, a área da superfície corporal é uma função da altura e largura). Da mesma forma, pode haver "restrições" que devem ser verdadeiras para que os dados sejam válidos: por exemplo, em uma contagem diferencial de leucócitos, a soma das contagens dos tipos de leucócitos individuais deve ser sempre igual a 100, porque as contagens individuais representam percentagens. As fórmulas computadas e a validação complexa geralmente são efetuadas armazenando expressões nos metadados que são substituídas por macro com os valores que o usuário insere e podem ser avaliados. Em navegadores da Web, JavaScript e VBScript têm uma função Eval () que pode ser aproveitada para esse propósito.

A validação, apresentação e agrupamento de metadados possibilitam a criação de estruturas de código que suportam a geração automática de interface de usuário para navegação de dados e edição interativa. Em um sistema de produção que é entregue pela Web, a tarefa de validação de dados EAV é essencialmente movida da camada de back-end / banco de dados (que é impotente em relação a essa tarefa) para a camada do servidor intermediário / Web. Embora a validação de back-end seja sempre ideal, porque é impossível subvertê-la tentando a entrada direta de dados em uma tabela, a validação de camada intermediária por meio de uma estrutura genérica é bastante viável, embora uma quantidade significativa de esforço de design de software deva ir para a construção da estrutura primeiro . A disponibilidade de estruturas de código aberto que podem ser estudadas e modificadas para necessidades individuais pode ajudar muito a evitar a reinvenção da roda. [ citação necessária ]

(A primeira parte desta seção é um resumo do artigo de referência Dinu / Nadkarni na Central, [18] para o qual o leitor é direcionado para mais detalhes.)

A modelagem EAV, sob os termos alternativos "modelagem de dados genérica" ​​ou "esquema aberto", há muito tempo é uma ferramenta padrão para modeladores de dados avançados. Como qualquer técnica avançada, pode ter dois gumes e deve ser usada com cautela.

Além disso, o emprego de EAV não impede o emprego de abordagens tradicionais de modelagem de banco de dados relacional dentro do mesmo esquema de banco de dados. Em EMRs que dependem de um RDBMS, como o Cerner, que usa uma abordagem EAV para seu subesquema de dados clínicos, a grande maioria das tabelas no esquema é, na verdade, modelada tradicionalmente, com atributos representados como colunas individuais em vez de linhas.

A modelagem do subesquema de metadados de um sistema EAV, na verdade, é um ajuste muito bom para a modelagem tradicional, por causa das inter-relações entre os vários componentes dos metadados. No sistema TrialDB, por exemplo, o número de tabelas de metadados no esquema supera as tabelas de dados em cerca de dez para um. Como a exatidão e a consistência dos metadados são essenciais para a operação correta de um sistema EAV, o designer do sistema deseja aproveitar todas as vantagens de todos os recursos que os RDBMSs fornecem, como integridade referencial e restrições programáveis, em vez de ter que reinventar o RDBMS - roda do motor. Consequentemente, as numerosas tabelas de metadados que suportam projetos EAV estão normalmente na forma relacional do terceiro normal.

Commercial electronic health record Systems (EHRs) use row-modeling for classes of data such as diagnoses, surgical procedures performed on and laboratory test results, which are segregated into separate tables. In each table, the "entity" is a composite of the patient ID and the date/time the diagnosis was made (or the surgery or lab test performed) the attribute is a foreign key into a specially designated lookup table that contains a controlled vocabulary - e.g., ICD-10 for diagnoses, Current Procedural Terminology for surgical procedures, with a set of value attributes. (E.g., for laboratory-test results, one may record the value measured, whether it is in the normal, low or high range, the ID of the person responsible for performing the test, the date/time the test was performed, and so on.) As stated earlier, this is not a full-fledged EAV approach because the domain of attributes for a given table is restricted, just as the domain of product IDs in a supermarket's Sales table would be restricted to the domain of Products in a Products table.

However, to capture data on parameters that are not always defined in standard vocabularies, EHRs also provide a "pure" EAV mechanism, where specially designated power-users can define new attributes, their data type, maximum and minimal permissible values (or permissible set of values/codes), and then allow others to capture data based on these attributes. In the Epic (TM) EHR, this mechanism is termed "Flowsheets", and is commonly used to capture inpatient nursing observation data.

Modeling sparse attributes Edit

The typical case for using the EAV model is for highly sparse, heterogeneous attributes, such as clinical parameters in the electronic medical record (EMRs), as stated above. Even here, however, it is accurate to state that the EAV modeling principle is applied to a sub-schema of the database rather than for all of its contents. (Patient demographics, for example, are most naturally modeled in one-column-per-attribute, traditional relational structure.)

Consequently, the arguments about EAV vs. "relational" design reflect incomplete understanding of the problem: An EAV design should be employed only for that sub-schema of a database where sparse attributes need to be modeled: even here, they need to be supported by third normal form metadata tables. There are relatively few database-design problems where sparse attributes are encountered: this is why the circumstances where EAV design is applicable are relatively rare. Even where they are encountered, a set of EAV tables is not the only way to address sparse data: an XML-based solution (discussed below) is applicable when the maximum number of attributes per entity is relatively modest, and the total volume of sparse data is also similarly modest. An example of this situation is the problems of capturing variable attributes for different product types.

Sparse attributes may also occur in E-commerce situations where an organization is purchasing or selling a vast and highly diverse set of commodities, with the details of individual categories of commodities being highly variable. The Magento E-commerce software [19] employs an EAV approach to address this issue.

Modeling numerous classes with very few instances per class: highly dynamic schemas Edit

Another application of EAV is in modeling classes and attributes that, while not sparse, are dynamic, but where the number of data rows per class will be relatively modest – a couple of hundred rows at most, but typically a few dozen – and the system developer is also required to provide a Web-based end-user interface within a very short turnaround time. "Dynamic" means that new classes and attributes need to be continually defined and altered to represent an evolving data model. This scenario can occur in rapidly evolving scientific fields as well as in ontology development, especially during the prototyping and iterative refinement phases.

While creation of new tables and columns to represent a new category of data is not especially labor-intensive, the programming of Web-based interfaces that support browsing or basic editing with type- and range-based validation is. In such a case, a more maintainable long-term solution is to create a framework where the class and attribute definitions are stored in metadata, and the software generates a basic user interface from this metadata dynamically.

The EAV/CR framework, mentioned earlier, was created to address this very situation. Note that an EAV data model is not essential here, but the system designer may consider it an acceptable alternative to creating, say, sixty or more tables containing a total of not more than two thousand rows. Here, because the number of rows per class is so few, efficiency considerations are less important with the standard indexing by class ID/attribute ID, DBMS optimizers can easily cache the data for a small class in memory when running a query involving that class or attribute.

In the dynamic-attribute scenario, it is worth noting that Resource Description Framework (RDF) is being employed as the underpinning of Semantic-Web-related ontology work. RDF, intended to be a general method of representing information, is a form of EAV: an RDF triple comprises an object, a property, and a value.

At the end of Jon Bentley's book "Writing Efficient Programs", the author warns that making code more efficient generally also makes it harder to understand and maintain, and so one does not rush in and tweak code unless one has first determined that there é a performance problem, and measures such as code profiling have pinpointed the exact location of the bottleneck. Once you have done so, you modify only the specific code that needs to run faster. Similar considerations apply to EAV modeling: you apply it only to the sub-system where traditional relational modeling is known a priori to be unwieldy (as in the clinical data domain), or is discovered, during system evolution, to pose significant maintenance challenges. Database Guru (and currently a vice-president of Core Technologies at Oracle Corporation) Tom Kyte, [20] for example, correctly points out drawbacks of employing EAV in traditional business scenarios, and makes the point that mere "flexibility" is not a sufficient criterion for employing EAV. (However, he makes the sweeping claim that EAV should be avoided in tudo circumstances, even though Oracle's Health Sciences division itself employs EAV to model clinical-data attributes in its commercial systems ClinTrial [21] and Oracle Clinical. [22] )

Working with EAV data Edit

The Achilles heel of EAV is the difficulty of working with large volumes of EAV data. It is often necessary to transiently or permanently inter-convert between columnar and row-or EAV-modeled representations of the same data this can be both error-prone if done manually as well as CPU-intensive. Generic frameworks that utilize attribute and attribute-grouping metadata address the former but not the latter limitation their use is more or less mandated in the case of mixed schemas that contain a mixture of conventional-relational and EAV data, where the error quotient can be very significant.

The conversion operation is called pivoting. Pivoting is not required only for EAV data but also for any form or row-modeled data. (For example, implementations of the Apriori algorithm for Association Analysis, widely used to process supermarket sales data to identify other products that purchasers of a given product are also likely to buy, pivot row-modeled data as a first step.) Many database engines have proprietary SQL extensions to facilitate pivoting, and packages such as Microsoft Excel also support it. The circumstances where pivoting is necessary are considered below.

  • Browsing of modest amounts of data for an individual entity, optionally followed by data editing based on inter-attribute dependencies. This operation is facilitated by caching the modest amounts of the requisite supporting metadata. Some programs, such as TrialDB, access the metadata to generate semi-static Web pages that contain embedded programming code as well as data structures holding metadata.
  • Bulk extraction transforms large (but predictable) amounts of data (e.g., a clinical study’s complete data) into a set of relational tables. While CPU-intensive, this task is infrequent and does not need to be done in real-time i.e., the user can wait for a batched process to complete. The importance of bulk extraction cannot be overestimated, especially when the data is to be processed or analyzed with standard third-party tools that are completely unaware of EAV structure. Here, it is not advisable to try to reinvent entire sets of wheels through a generic framework, and it is best just to bulk-extract EAV data into relational tables and then work with it using standard tools.
  • Ad hoc query interfaces to row- or EAV-modeled data, when queried from the perspective of individual attributes, (e.g., "retrieve all patients with the presence of liver disease, with signs of liver failure and no history of alcohol abuse") must typically show the results of the query with individual attributes as separate columns. For most EAV database scenarios ad hoc query performance must be tolerable, but sub-second responses are not necessary, since the queries tend to be exploratory in nature.

Relational division Edit

However, the structure of EAV data model is a perfect candidate for Relational Division, see relational algebra. With a good indexing strategy it's possible to get a response time in less than a few hundred milliseconds on a billion row EAV table. Microsoft SQL Server MVP Peter Larsson has proved this on a laptop and made the solution general available. [23]

Optimizing pivoting performance Edit

  • One possible optimization is the use of a separate "warehouse" or queryable schema whose contents are refreshed in batch mode from the production (transaction) schema. See data warehousing. The tables in the warehouse are heavily indexed and optimized using denormalization, which combines multiple tables into one to minimize performance penalty due to table joins.
  • Certain EAV data in a warehouse may be converted into standard tables using "materialized views" (see data warehouse), but this is generally a last resort that must be used carefully, because the number of views of this kind tends to grow non-linearly with the number of attributes in a system. [14]
  • In-memory data structures: One can use hash tables and two-dimensional arrays in memory in conjunction with attribute-grouping metadata to pivot data, one group at a time. This data is written to disk as a flat delimited file, with the internal names for each attribute in the first row: this format can be readily bulk-imported into a relational table. This "in-memory" technique significantly outperforms alternative approaches by keeping the queries on EAV tables as simple as possible and minimizing the number of I/O operations. [14] Each statement retrieves a large amount of data, and the hash tables help carry out the pivoting operation, which involves placing a value for a given attribute instance into the appropriate row and column. Random Access Memory (RAM) is sufficiently abundant and affordable in modern hardware that the complete data set for a single attribute group in even large data sets will usually fit completely into memory, though the algorithm can be made smarter by working on slices of the data if this turns out not to be the case.

Obviously, no matter what approaches you take, querying EAV will not be as fast as querying standard column-modeled relational data for certain types of query, in much the same way that access of elements in sparse matrices are not as fast as those on non-sparse matrices if the latter fit entirely into main memory. (Sparse matrices, represented using structures such as linked lists, require list traversal to access an element at a given X-Y position, while access to elements in matrices represented as 2-D arrays can be performed using fast CPU register operations.) If, however, you chose the EAV approach correctly for the problem that you were trying to solve, this is the price that you pay in this respect, EAV modeling is an example of a space (and schema maintenance) versus CPU-time tradeoff.

EAV vs. the Universal Data Model Edit

Originally postulated by Maier, Ullman and Vardi, [24] the "Universal Data Model" (UDM) seeks to simplify the query of a complex relational schema by naive users, by creating the illusion that everything is stored in a single giant "universal table". It does this by utilizing inter-table relationships, so that the user does not need to be concerned about what table contains what attribute. C.J. Date, however, [25] pointed out that in circumstances where a table is multiply related to another (as in genealogy databases, where an individual's father and mother are also individuals, or in some business databases where all addresses are stored centrally, and an organization can have different office addresses and shipping addresses), there is insufficient metadata within the database schema to specify unambiguous joins. When UDM has been commercialized, as in SAP BusinessObjects, this limitation is worked around through the creation of "Universes", which are relational views with predefined joins between sets of tables: the "Universe" developer disambiguates ambiguous joins by including the multiply-related table in a view multiple times using different aliases.

Apart from the way in which data is explicitly modeled (UDM simply uses relational views to intercede between the user and the database schema), EAV differs from Universal Data Models in that it also applies to transactional systems, not only query oriented (read-only) systems as in UDM. Also, when used as the basis for clinical-data query systems, EAV implementations do not necessarily shield the user from having to specify the class of an object of interest. In the EAV-based i2b2 clinical data mart, [26] for example, when the user searches for a term, she has the option of specifying the category of data that the user is interested in. For example, the phrase "lithium" can refer either to the medication (which is used to treat bipolar disorder), or a laboratory assay for lithium level in the patient's blood. (The blood level of lithium must be monitored carefully: too much of the drug causes severe side effects, while too little is ineffective.)

XML and JSON Edit

An Open Schema implementation can use an XML column in a table to capture the variable/sparse information. [27] Similar ideas can be applied to databases that support JSON-valued columns: sparse, hierarchical data can be represented as JSON. If the database has JSON support, such as PostgreSQL and (partially) SQL Server 2016 and later, then attributes can be queried, indexed and joined. This can offer performance improvements of over 1000x over naive EAV implementations., [28] but does not necessarily make the overall database application more robust.

Note that there are two ways in which XML or JSON data can be stored: one way is to store it as a plain string, opaque to the database server the other way is to use a database server that can "see into" the structure. There are obviously some severe drawbacks to storing opaque strings: these cannot be queried directly, one cannot form an index based on their contents, and it is impossible to perform joins based on the content.

Building an application that has to manage data gets extremely complicated when using EAV models, because of the extent of infrastructure that has to be developed in terms of metadata tables and application-framework code. Using XML solves the problem of server-based data validation (which must be done by middle-tier and browser-based code in EAV-based frameworks), but has the following drawbacks:

  • It is programmer-intensive. XML schemas are notoriously tricky to write by hand, a recommended approach is to create them by defining relational tables, generating XML-schema code, and then dropping these tables. This is problematic in many production operations involving dynamic schemas, where new attributes are required to be defined by power-users who understand a specific application domain (e.g. inventory management or biomedicine) but are not necessarily programmers. By contrast, in production systems that use EAV, such users define new attributes (and the data-type and validation checks associated with each) through a GUI application. Because the validation-associated metadata is required to be stored in multiple relational tables in a normalized design, a GUI application that ties these tables together and enforces the appropriate metadata-consistency checks is the only practical way to allow entry of attribute information, even for advanced developers - even if the end-result uses XML or JSON instead of separate relational tables.
  • The server-based diagnostics that result with an XML/JSON solution if incorrect data is attempted to be inserted (e.g., range check or regular-expression pattern violations) are cryptic to the end-user: to convey the error accurately, one would, at the least, need to associate a detailed and user-friendly error diagnostic with each attribute.
  • The solution does not address the user-interface-generation problem.

All of the above drawbacks are remediable by creating a layer of metadata and application code, but in creating this, the original "advantage" of not having to create a framework has vanished. The fact is that modeling sparse data attributes robustly is a hard database-application-design problem no matter which storage approach is used. Sarka's work, [27] however, proves the viability of using an XML field instead of type-specific relational EAV tables for the data-storage layer, and in situations where the number of attributes per entity is modest (e.g., variable product attributes for different product types) the XML-based solution is more compact than an EAV-table-based one. (XML itself may be regarded as a means of attribute-value data representation, though it is based on structured text rather than on relational tables.)

Tree structures and relational databases Edit

There exist several other approaches for the representation of tree-structured data, be it XML, JSON or other formats, such as the nested set model, in a relational database. On the other hand, database vendors have begun to include JSON and XML support into their data structures and query features, like in IBM DB2, where XML data is stored as XML separate from the tables, using XPath queries as part of SQL statements, or in PostgreSQL, with a JSON data type [29] that can be indexed and queried. These developments accomplish, improve or substitute the EAV model approach.

The uses of JSON and XML are not necessarily the same as the use of an EAV model, though they can overlap. XML is preferable to EAV for arbitrarily hierarchical data that is relatively modest in volume for a single entity: it is not intended to scale up to the multi-gigabyte level with respect to data-manipulation performance. [ citation needed ] XML is not concerned per-se with the sparse-attribute problem, and when the data model underlying the information to be represented can be decomposed straightforwardly into a relational structure, XML is better suited as a means of data interchange than as a primary storage mechanism. EAV, as stated earlier, is specifically (and only) applicable to the sparse-attribute scenario. When such a scenario holds, the use of datatype-specific attribute-value tables than can be indexed by entity, by attribute, and by value and manipulated through simple SQL statements is vastly more scalable than the use of an XML tree structure. [ citation needed ] The Google App Engine, mentioned above, [ citation needed ] uses strongly-typed-value tables for a good reason. [ citation needed ]

Graph databases Edit

An alternative approach to managing the various problems encountered with EAV-structured data is to employ a graph database. These represent entities as the nodes of a graph or hypergraph, and attributes as links or edges of that graph. The issue of table joins are addressed by providing graph-specific query languages, such as Apache TinkerPop, [30] or the OpenCog atomspace pattern matcher. [31]

Another alternative is to use SPARQL store.

PostgreSQL: JSONB columns Edit

PostgreSQL version 9.4 includes support for JSON binary columns (JSONB), which can be queried, indexed and joined. This allows performance improvements by factors of a thousand or more over traditional EAV table designs. [28]

A db schema based on JSONB always has fewer tables: one may nest attribute-value pairs in JSONB type fields of the Entity table. That makes the db schema easy to comprehend and SQL queries concise. [32] The programming code to manipulate the database objects on the abstraction layer turns out much shorter. [33]

SQL Server 2008 and later: Sparse columns Edit

Microsoft SQL Server 2008 offers a (proprietary) alternative to EAV. [34] Columns with an atomic data type (e.g., numeric, varchar or datetime columns) can be designated as sparse simply by including the word SPARSE in the column definition of the CREATE TABLE statement. Sparse columns optimize the storage of NULL values (which now take up no space at all) and are useful when the majority records in a table will have NULL values for that column. Indexes on sparse columns are also optimized: only those rows with values are indexed. In addition, the contents of all sparse columns in a particular row of a table can be collectively aggregated into a single XML column (a column set), whose contents are of the form [<column-name>column contents </column-name>]*. In fact, if a column set is defined for a table as part of a CREATE TABLE statement, all sparse columns subsequently defined are typically added to it. This has the interesting consequence that the SQL statement SELECT * from <tablename> will not return the individual sparse columns, but concatenate all of them into a single XML column whose name is that of the column set (which therefore acts as a virtual, computed column). Sparse columns are convenient for business applications such as product information, where the applicable attributes can be highly variable depending on the product type, but where the total number of variable attributes per product type are relatively modest.

Limitations of Sparse Attributes Edit

However, this approach to modeling sparse attributes has several limitations: rival DBMSs have, notably, chosen not to borrow this idea for their own engines. Limitations include:

  • The maximum number of sparse columns in a table is 10,000, which may fall short for some implementations, such as for storing clinical data, where the possible number of attributes is one order of magnitude larger. Therefore, this is not a solution for modeling *all* possible clinical attributes for a patient.
  • Addition of new attributes – one of the primary reasons an EAV model might be sought – still requires a DBA. Further, the problem of building a user interface to sparse attribute data is not addressed: only the storage mechanism is streamlined. * Applications can be written to dynamically add and remove sparse columns from a table at run-time: in contrast, an attempt to perform such an action in a multi-user scenario where other users/processes are still using the table would be prevented for tables without sparse columns. However, while this capability offers power and flexibility, it invites abuse, and should be used judiciously and infrequently.
    • It can result in significant performance penalties, in part because any compiled query plans that use this table are automatically invalidated.
    • Dynamic column addition or removal is an operation that should be audited, because column removal can cause data loss: allowing an application to modify a table without maintaining some kind of a trail, including a justification for the action, is not good software practice.

    Many cloud computing vendors offer data stores based on the EAV model, where an arbitrary number of attributes can be associated with a given entity. Roger Jennings provides an in-depth comparison [35] of these. In Amazon's offering, SimpleDB, the data type is limited to strings, and data that is intrinsically non-string must be coerced to string (e.g., numbers must be padded with leading zeros) if you wish to perform operations such as sorting. Microsoft's offering, Windows Azure Table Storage, offers a limited set of data types: byte[], bool, DateTime, double, Guid, int, long and string [1]. The Google App Engine [2] offers the greatest variety of data types: in addition to dividing numeric data into int, long, or float, it also defines custom data types such as phone number, E-mail address, geocode and hyperlink. Google, but not Amazon or Microsoft, lets you define metadata that would prevent invalid attributes from being associated with a particular class of entity, by letting you create a metadata model.

    Google lets you operate on the data using a subset of SQL Microsoft offer a URL-based querying syntax that is abstracted via a LINQ provider Amazon offer a more limited syntax. Of concern, built-in support for combining different entities through joins is currently (April '10) non-existent with all three engines. Such operations have to be performed by application code. This may not be a concern if the application servers are co-located with the data servers at the vendor's data center, but a lot of network traffic would be generated if the two were geographically separated.

    An EAV approach is justified only when the attributes that are being modeled are numerous and sparse: if the data being captured does not meet this requirement, the cloud vendors' default EAV approach is often a mismatch for applications that require a true back-end database (as opposed to merely a means of persistent data storage). Retrofitting the vast majority of existing database applications, which use a traditional data-modeling approach, to an EAV-type cloud architecture, would require major surgery. Microsoft discovered, for example, that its database-application-developer base was largely reluctant to invest such effort. More recently, therefore, Microsoft has provided a premium offering – a cloud-accessible full-fledged relational engine, SQL Server Azure, which allows porting of existing database applications with modest changes.

    One limitation of SQL Azure is that physical databases are limited to 500 GB in size as of January 2015 [update] . [36] Microsoft recommends that data sets larger than this be split into multiple physical databases and accessed with parallel queries.


    How to use the Sample Excel?

    Example scenario

    The purpose of the following sample Excel template is to change the ABC classification of ByD supplier:

    1. Query and download all relevant supplier from ByD into your Excel template
    2. Change the ABC classification of the supplier offline
    3. Write back the changed supplier ABC classifications to ByD

    To ensure data integrity and to avoid accidental changes, you would like to make sure, that the Excel can be used to change the ABC classification of existing suppliers only. It shall not be possible to create supplier, to delete supplier or to change any other supplier data except the ABC classification.

    The sample Excel template SAP_ByD_MassChange_SupplierGeneralData.xlsm is designed to serve this scenario.

    Create a user to access the ByD web services

    The Excel template in our example uses the ByD web services QuerySupplierIn and ManageSupplierIn to query, read and update ByD data. The logon user used in the Excel template must have authorizations for these ByD web services.

    Steps to create a user in ByD:

    1. Create a communication system representing the Excel template
      1. Open ByD work center Application and User Management , view Communication Systems
      2. Create a new communication system via button New
        1. Enter an ID, host name (any name… irrelevant for this scenario) and the System Access Type “Internet”
        2. Add a system instance via button Add Row and enter a System Instance ID and the Preferred Application Protocol 𔄝 – Web Service”
        3. Activate the communication system via button Actions >> set to Active
        4. Save and close the communication system

        1. Open ByD work center Application and User Management , view Communication Scenarios
        2. Create a new communication scenario via button New
          1. Enter a communication scenario name
          2. Press button Add Operations , filter by the service description “*Supplier*” and select the operations with service description “Check suppliers”, “Maintain suppliers” and “Find suppliers”
          3. Press button OK , save and close the communication scenario
          1. Open ByD work center Application and User Management , view Communication Arrangements
          2. Create a new communication arrangement via button New
            1. Select the communication scenario from step 2 and continue with button Next
            2. Select the communication system from step 1 and continue with button Next
            3. Select the authentication method “User ID and Password”, edit the credentials and continue with button Next
            4. Review your settings and complete the communication arrangement with button Finish

            If you have already a suitable ByD user and communication arrangement, then you can change the credentials via ByD communication arrangement:

            1. Open ByD work center Application and User Management , view Communication Arrangements
              1. Select and open the communication arrangement which includes the required ByD web services
              2. Click on button ViewTudo
              3. Goto tab TechnicalData
              4. On section Inbound Communication: Basic Settings:
                1. Selecione os Authentication Method of your choice (e.g. user ID and password for logon)
                2. Edit the credentials via button Edit Credentials and change user/password or upload a client certificate.

                Query and Change ByD Supplier using the Excel Template

                Open the sample Excel template SAP_ByD_MassChange_SupplierGeneralData.xlsm.

                The Excel file consists of 5 pages:

                • _DATA_MASTER contains the ByD data. Using the menu buttons “Query”, the data is retrieved from the ByD system. If you change data in the relevant field(s), the corresponding records will be marked as modified. Using the menu buttons “Simulate” and “Update” the changed records will be sent back to the ByD system (for simulation resp. update as expected).
                • Query allows you to filter the data that is retrieved via button „Query“
                • Config holds important design time parameters. Most of the parameters are consisting of XML snippets.
                • Terms and Conditions contains information about the source and usage of the sample Excel template.

                1. Open Tab Query and enter suitable selection parameters
                2. Query and read ByD supplier via button “Query” of section “SAP ByD” (Excel quick access toolbar, tab Home) enter your ByD system and user/password on the logon popup (the Logon screen automatically pops up on the first query):
                3. Review the extracted supplier records on tab “_DATA_MASTER”

                Change Supplier ABC Classification and update Supplier in ByD:

                1. Change the ABC classifications in column E
                  Observe, that all touched suppliers get the status “Modified” in column B:
                2. Optional: Simulate the update of ByD supplier using button “Simulate” of section “SAP ByD” (Excel quick access toolbar, tab Home).
                  Observe: successfully checked lines are marked green, lines with errors are marked red and system messages are added as field comments in column B.
                3. Write back your changes to ByD using button “Update”.
                  If you simulated the update before, then Excel only sends lines to ByD that are marked “OK”.
                  If you did not simulate the update, then Excel sends all modified lines to ByD. In this case the complete update is rejected if one or more line are erroneous. Successfully updated lines are marked green, unprocessed lines or lines with errors are marked yellow or red and system messages are added as field comments.

                Press “Update” again to repeat the write back to ByD for the unprocessed lines w/o errors.

                On tab “ Config ” you can set the Test Mode = “ On ” to review web service requests and responses.

                Volume recommendations strongly depend on the business document and the data retrieved and updated per business document instance.

                As an example I recommend the following limits for ByD product data:

                • Query: The query process uses paging and can load high numbers of records. However, to avoid too long runtimes, I recommend to choose selection parameter values such that the total number of hits (e.g. material – sales organization – distribution channel combinations) does not become too high (< 10.000 records).
                • Update/Simulate: Assume all changed records are updated to ByD in a single web service call. To avoid timeouts, I recommend editing a limited number of records for each update/simulation run only (start with < 500 and check what is possible for your use case).

                The Excel template does not yet support value helps. Feel free to enhance the sample Excel helpful ByD web services are QueryCodeListIn and QueryObjectDescriptionIn (see as well How to get ByDesign Code Lists via Web Service QueryCodeListIn ) .


                What is a NULL value?

                Before we delve into how to navigate the potential minefield of datasets with missing values and avoid stepping on a Null, let’s first take a quick look at what a NULL is.

                Null (or NULL) is a special marker used in Structured Query Language to indicate that a data value does not exist in the database. Introduced by the creator of the relational database model, E. F. Codd, SQL Null serves to fulfil the requirement that all true relational database management systems (RDBMS) support a representation of “missing information and inapplicable information”. Codd also introduced the use of the lowercase Greek omega (ω) symbol to represent Null in database theory. In SQL, NULL is a reserved word used to identify this marker. … This should not be confused with a value of 0. A null value indicates a lack of a value — a lack of a value is not the same thing as a value of zero in the same way that a lack of an answer is not the same thing as an answer of “no”.

                SQL null is a state, not a value. This usage is quite different from most programming languages, where null value of a reference means it is not pointing to any object.

                SQL does provide some handy functionality for working with your character data in your SQL queries that we’ll describe in detail


                Here is a script that automatically converts input to upper case:

                From the spreadsheet, go Tools > Script Editor. Put the above code in the code window (replacing anything pre-filled there), and save.

                If you wanted to enforce upper case e single-character entries, then data validation could be used, with custom formula

                This is assuming the upper left corner of the range is A1, and that you expect letters of Latin alphabet. The regular expression ^[A-Z]$ means: beginning of string single character in the range A-Z end of string.


                3 respostas 3

                This is because you are in an after insert/update trigger and the records are read only in that context as they have been written, but not committed, to the database.

                Unfortunately your trigger is relying on the ids of the records, which means you won't be able to use before insert as the ids won't be populated at that time (as the records haven't been written to the database at that point so while you can write to them, database generated fields aren't populated).

                In this instance you'll need to clone the record (or query anew via SOQL) and make changes to the new copy of the record, then execute the update against the new copies.


                Request Validation

                If an API method has side effects and there is a need to validate the request without causing such side effects, the request message devemos contain a field:

                If this field is set to true , the server must not execute any side effects and only perform implementation-specific validation consistent with the full request.

                If validation succeeds, google.rpc.Code.OK deve be returned and any full request using the same request message should not return google.rpc.Code.INVALID_ARGUMENT . Note that the request may still fail due to other errors such as google.rpc.Code.ALREADY_EXISTS or because of race conditions.


                5 Answers 5

                Other answers here are only working with the "known" meta keys, for custom/arbitrary meta keys, -map_metadata 0 is not sufficient to keep them all.

                In my transcoder project, a lot of camera makers like to inject custom meta keys in the MP4/MOV container, and I want to keep them in the transcoded MP4/MOV files. After a lot of head scratching, ffmpeg do have a switch for this purpose:

                Credit goes to the author of this thread and Google:

                The -metadata option is for manipulating the metadata. If you just want to copy the metadata from an input file to an ouput file, you should use the -map_metadata option:

                ffmpeg -i a.MOV -map_metadata 0 -c copy c.MOV

                The file specifier is a zero-indexed number, so '0' takes the metadata from the first input file.

                FFmpeg, by default, makes all metadata from the first input file available, to the output file muxer, for writing. -map_metadata allows to override that, by either pointing to a different input, or by telling ffmpeg to discard input global metadata (value of -1 ).

                However, which of the available metadata, is actually written to the output file, depends on the output muxer. The QT/ISOBMFF muxer (for MOV/MP4/3GP..) only considers a limited number of tags, primarily iTunes-related. As @JerryTian noted, with -movflags use_metadata_tags , all other tags are written to the file. However, these are written in an unconventional manner - Quicktime, in particular, does not recognize these additional metadata entries. Other, ffmpeg-based s/w, should read them. Or anyone who's using custom s/w, like @JerryTian, can adapt their s/w to read them.

                Note that movflags only applies to output from the QT muxer. Matroska (MKV) will write anything. Other muxers vary.


                Client-side form validation sometimes requires JavaScript if you want to customize styling and error messages, but it always requires you to think carefully about the user. Always remember to help your users correct the data they provide. To that end, be sure to:

                • Display explicit error messages.
                • Be permissive about the input format.
                • Point out exactly where the error occurs, especially on large forms.

                Once you have checked that the form is filled out correctly, the form can be submitted. We'll cover sending form data next.