Quais são as vantagens de armazenar xml em um banco de dados relacional?


23

Eu estava vasculhando o banco de dados AdventureWorks hoje e notei que várias tabelas ( HumanResources.JobCandidatee Sales.Individualpor exemplo) têm uma coluna que está armazenando dados xml.

O que eu gostaria de saber é: qual é a vantagem de armazenar basicamente o valor de uma linha da tabela de banco de dados na coluna de outra tabela? Isso não torna difícil consultar essas informações? Ou é a suposição de que os dados não precisam ser consultados e apenas precisam ser armazenados?

Respostas:


30

Como nem todos os dados precisam ser armazenados de forma relacional e a gravação de código para processar os dados passados ​​como XML para armazenamento relacional consome tempo (e é muito, muito entediante). Isso é particularmente verdade quando muitos dados XML são provenientes de sistemas que estão lançando grandes respostas genéricas.

Vi frequentemente situações em que uma mensagem é recebida de outro sistema e não nos importamos com 98% do que ela contém. Portanto, analisamos para dividir os 2% de que gostamos, armazenar isso de forma relacional e depois armazenar toda a mensagem, caso precisemos dos 98% restantes posteriormente.

E o SQL Server fornece algumas ferramentas e sintaxe OK-ish para trabalhar com XML em T-SQL, para que não seja totalmente além do alcance prático de consultas ad-hoc da maneira como seria se você estivesse armazenando, digamos, o conteúdo de um CSV.

E isso exclui a possibilidade de que você realmente deseja armazenar é XML (por exemplo, para fins de suporte e depuração) ...


10
+1, "coma alguns agora, guarde alguns para mais tarde". O que foi uma péssima campanha de marketing para doces, mas funciona nesse caso para armazenamento XML.
Dan Rosenstark

11

Se o formato dos dados for volátil e estiver sujeito a possíveis alterações, convém reuni-lo como XML e colocá-lo no banco de dados dessa forma, evitando assim futuras alterações no esquema do banco de dados.

Na mesma tangente, se os dados forem fornecidos por algum sistema externo e consumidos por eles novamente, e eles não conseguirem fornecer um formato permanente, é isso que você faria.

Isso não torna difícil consultar essas informações?

O SQL Server pode consultar campos e variáveis ​​XML. Não necessariamente difícil, mas mais trabalho, sim. Mas factível.


+1 para dissociar dados do esquema do banco de dados. Além disso, convém mencionar explicitamente a consulta XPath.
perfil completo de Gary Rowe

Eu acho que você acabou de fazer. :)

5

Na minha experiência, os dados XML são geralmente armazenados e raramente consultados, mas frequentemente extraídos quando necessário, geralmente quando algum outro sistema precisa de uma representação XML de alguns dados que podem ser difíceis ou impossíveis de gerar dinamicamente a partir de dados relacionais. Os dados XML podem ser preenchidos previamente por algum outro processo.


3

Se você pode imaginar armazenar seus dados em um fluxo binário em um blob, então eu imagino que você pode imaginar armazenar seus dados em um formato xml em um blob.

Obviamente, é melhor deixar muitas coisas na imaginação do imaginador.

Digamos, registros médicos eletrônicos, por exemplo:

Como você provavelmente armazenaria o ASCII HL7 V2.x em um campo em um banco de dados. Você provavelmente estaria apto a armazenar o HL7 V3.0 em um campo em um banco de dados.

Então a vantagem é a conveniência.


2

Atualmente, estou trabalhando em um projeto que faz isso. Temos dados que precisam ser processados ​​várias vezes, armazenados de forma relacional. No entanto, o processamento é feito em Java, e é mais fácil trabalhar com XML lá. Portanto, fazemos uma passagem única pelos dados relacionais e os armazenamos como XML em uma tabela. Em seguida, podemos processar esses dados em Java com uma consulta sem associação, em vez de recuperar dados todas as vezes, e processar os mesmos dados repetidamente para o conteúdo do nosso coração. É muito mais simples e mais eficiente.


2

Um bom exemplo de armazenamento de XML é quando você deseja persistir os estados da interface do usuário no banco de dados. O estado de todas as visualizações do aplicativo é serializado e armazenado no banco de dados e não há necessidade de consultar o XML. Por estado da interface do usuário, quero dizer, ordem de exibição, tamanho das janelas, etc.


1

Frequentemente, você obtém dados misturados que são XML e relacionais. (Um bom exemplo disso é um armazenamento de documentos em que cada documento pode ter campos de metadados como título, data de criação, proprietário e assim por diante.)

Neste ponto, você deve escolher entre três opções:

  1. Armazene tudo em um banco de dados relacional.
  2. Armazene tudo em um banco de dados XML nativo.
  3. Armazene dados em dois bancos de dados separados, XML em XML nativo e metadados em relacionais.

A opção 3 é provavelmente a mais limpa, mas também a mais cara e a mais difícil de implementar, além de você não necessariamente querer transações distribuídas em um sistema não muito grande. A opção 2 não é muito boa, pois os bancos de dados XML nativos geralmente são extremamente ruins no tratamento de dados relacionais (que você provavelmente usará em pesquisas) e a tecnologia é menos madura do que o banco de dados relacional.

Isso deixa você com a opção 1 como certamente não a melhor solução, mas talvez a menos ruim.


1

Na minha experiência, o uso de XML em um banco de dados acaba sendo porque é assim que a fonte dos dados os armazena, ou você o está adicionando a um banco de dados existente para estender a funcionalidade de uma maneira que não requer muita programação de banco de dados para suportar .

Se você estiver pesquisando os novos dados com frequência, pode fazer sentido dividir o XML em seus componentes. Caso contrário, pode ser uma maneira útil de salvar dados alterados com pouca frequência.

Espero que isso ajude, Jeff


1

Os datastores orientados a documentos (também conhecidos como NoSql) são muito populares atualmente:

http://en.wikipedia.org/wiki/Document-oriented_database

Não há razão para que você não possa empregar um esquema orientado a documentos em um banco de dados relacional. Você pode não ter todos os mesmos benefícios em comparação com algo como o Mongo, mas também não terá os inconvenientes.

Por um longo tempo, se você quisesse usar o armazenamento orientado a documentos, sua única opção seria colocar dados estruturados (como XML) em uma grande coluna. Os bancos de dados relacionais adicionaram recursos como indexação e correspondência para dar suporte a isso.

Compare isso com o Mongo, onde eles aparecem no banco de dados de documentos. Mas esse é outro tópico.

EDIT: a idéia central do documento é: você retira os dados, manipula e empurra-os de volta. Às vezes, como quando você está transmitindo o documento para o cliente, você só quer enviar a coisa toda como um blob e deixá-lo lidar com isso. O benefício (e a desvantagem) é a flexibilidade. A validação e a correção do documento são feitas fora do banco de dados.

EDIT EDIT: Outro contraste. Imagine salvar imagens JPG ou documentos do Word em uma coluna do banco de dados.


0

Quais são as vantagens de armazenar uma árvore (XML) em uma lista de tuplas (uma tabela de banco de dados)?

Não há razão para que o XML não possa ser consultado no seu DBMS usando, por exemplo, XPath ou SPARQL.

A meu ver, são simplesmente duas estruturas de dados diferentes. E não há razão para que eles não sejam incorporados um ao outro.

Você pode procurar os motivos pelos quais o tipo de dados JSON foi adicionado no PostgreSQL. Eu acho que muitos dos mesmos argumentos se aplicam. Exceto que, com XML / XSD, ainda mais validação é possível.


-1

Bem, XML (ou JSON) é muito bom para armazenar metadados com hierarquia. Quais são as alternativas? Uma tabela de metadados com refid / key / value / depth, talvez? É um pouco complicado (mas provavelmente melhor para consultar se você precisar fazer isso). Armazenar alguns dados xml sobre um documento (uma linha em uma tabela de documentos) é bastante conveniente quando você deseja armazenar algumas informações hierárquicas sem precisar confiar em uma tabela externa ou adicionar uma coluna por "tipo" de informações.


1
este não parece acrescentar nada substancial sobre o que já foi publicada em anteriores 11 respostas
mosquito

-2

Eu diria que foi uma prática ruim, pois você está entupindo um armazenamento eficiente, com tags ineficientes que não precisam estar lá se você se esforçar para analisar as informações. O XML possui uma sobrecarga de armazenamento hediondo em comparação com os dados que descreve, pois você precisa de uma tag para cada coluna para cada linha. Por comparação, os dados analisados ​​e armazenados no formato relacional têm o nome da coluna armazenado ONCE. Por uma dúzia de linhas em um desenvolvedor. caixa, grande coisa, mas eu vi desenvolvedores assumirem que isso é escalável para milhões de linhas. Isso pode representar centenas de GB de sobrecarga para algumas dezenas de GB de dados, o que cria desafios operacionais. Você está basicamente abdicando de sua responsabilidade e pressionando as pessoas que precisam apoiar a porcaria que você escreveu.

Então, por que não armazená-lo LONGE dos dados operacionais, em seu próprio banco de dados? Ou como pretendido - em arquivos simples? Provavelmente nunca mais será analisado, por que não removê-lo de atingir o desempenho de um sistema operacional? Lembre-se de que o XML APENAS existe para fornecer uma descrição do esquema de dados que, de outra forma, não seria aparente devido a diferenças de protocolo de armazenamento entre sistemas. Esse é o ponto principal, não há nada de inteligente nisso. Armazenar 10x a quantidade de sobrecarga para uma determinada quantidade de dados apenas diz que você é um desenvolvedor desleixado que não pensou no assunto e não pode ser processado para processar os dados que está consumindo em um formato sensível, eficiente e rápido de consultar. Pare de esforçar-se para obter suporte operacional e pense em como você pode lidar melhor com os dados depois de ' recebi que seria minha ligação. Não há defesa para armazenar dados como XML depois que eles são recebidos, pois eles cumprem seu objetivo.


1
Mas você assume aqui que os dados no fragmento XML são dados relacionais. Geralmente, esse não é o caso - o XML é muito útil para dados hierárquicos, o que é muito difícil de representar em um banco de dados relacional. Um documento XML idiomático (por exemplo, fazendo bom uso de atributos) também terá bastante pouca sobrecarga de espaço, o principal problema seria o custo de analisar o fragmento a cada acesso.
amon

Os dados podem não ser processáveis ​​em um formato de consulta rápida (nem você pode precisar consultá-los). Imagine um esquema XML em que existem centenas de campos opcionais dos quais talvez um punhado seja preenchido ao mesmo tempo. Se você insistir em modelar isso de forma relacional, você terminará com vastas tabelas cheias de NULLs ou a monstruosidade que é o EAV.
Julia Hayward
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.