Banco de Dados XML

Post on 06-Jul-2015

84 views 1 download

description

XML (eXtensible Markup Language) é uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais. É um dos subtipos da SGML (acrônimo de Standard Generalized Markup Language ou Linguagem Padronizada de Marcação Genérica) capaz de descrever diversos tipos de dados. Seu propósito principal é a facilidade de compartilhamento de informações através da internet.

Transcript of Banco de Dados XML

Banco de Dados XML

Tiago Roberti Sampaio

Introdução ao XML

eXtensible Markup Language – O recomendado pela W3C para usar como linguagem de marcação.

Documentos organizados hierarquicamente.

**W3C, ou World Wide Web Consortium, é um consórcio de empresas de tecnologia que visa padronizar a criação e interpretação de conteúdos para websites.

Linguagem de Marcação?

HTML – HyperText Markup Language é uma linguagem para organizar e formatar um website.

XML – eXtended Markup Language padroniza uma sequência de dados com o objetivo de organizar, separar o conteúdo e integrá-lo com outras linguagens.

Características do XML

Sintaxe simples.

Compartilhamento de informações entre diferentes computadores e aplicações.

Integração com outras linguagens.

Portabilidade: um BD pode escrever um arquivo XML para que outro BD consiga lê-lo.

Aplicações para o XML

XML vs Relacional

{ row: { name: “John”, phone: 3634 },

row: { name: “Sue”, phone: 6343 },

row: { name: “Dick”, phone: 6363 }}

name phone

John 3634

Sue 6343

Dick 6363

row row row

name name name

phone phone phone

“John” 3634 “Sue” “Dick”6343 6363

Relation

… in XML

Projeto de um BD XML

Especificação de requisitos: levantamento das necessidades de dados.

Modelagem conceitual: uso de um modelo de dados convecional, ex. ER.

Modelagem lógica: uso de um modelo de dados baseado em grafo, adequado à representação de uma hierarquia XML.

Modelagem física: especificação do esquema XML.

Banco de Dados com suporte XML

Tem ferramentas que convertem o conteúdo XML para um banco de dados tradicional.

Aceita XML como entrada

Rederiza XML como saída

Ex: Postgre tem um biblioteca interna de manipulação XML

Documentos orientados a registros

<endereço>

<rua>Beira-Mar</rua><numero>104</numero><complemento>apto 203</complemento>

<bairro>centro</bairro><cidade>Florianópolis</cidade> <cep>88010-600</cep>

</endereço>

<endereço>

<rua>Lauro Linhares</rua><numero>761</numero><bairro>trindade</bairro>

<cidade>Florianópolis</cidade><cep>88040-900</cep>

</endereço>

Banco de Dados com XML nativo

Define um modelo lógica para um documento XML, e armazena e recupera de acordo com este modelo.

Possui um documento como unidade fundamental de armazenamento lógico.

Especilizado em armazenar dados XML, armazena todos os componenetes do modelo XML (elementos, atributos, etc).

Benefícios

Suporta transações.

Acesso integrado a legados.

Suporte à distribuição.

Escalabilidade para grandes volumes.

Tem melhor desempenho que SGBDs padrão.

BD com suporte XML X nativo XML

Qual a vantagem de cada um?

BD XML X BD comum

Qual a vantagem de se utilizar um BD XML?

BD XML X BD comum

Mas... Por que utilizar XML?

Vamos supor uma empresa X que possui um conjunto de dados que precisaser disponibilizados para a empresa parceira Y. Como fazer isso de maneira simples?

XML!<?xml version=”1.0″

encoding=”ISO-8859-1″ ?> <pedidos>

<pedido id=”1″> <item descrição=”1″ qtde=”100″ /> <item descrição=”2″ qtde=”20″/> </pedido>

<pedido id=”2″> <item descrição=”1″ qtde=”25″ /> <item descrição=”3″ qtde=”10″/> <item descrição=”4″ qtde=”50″/> </pedido> <descrições>

<descrição id=”1″>Pacote de papel sulfite</descrição>

<descrição id=”2″>Pacote de papel carbono</descrição>

<descrição id=”3″>Caixa de grampos</descrição>

<descrição id=”4″>Borracha branca</descrição>

</descrições> </pedidos>

Por que não usar XML?

Suponha que exista a necessidade de se transmitir o valor de determinados items, e cada item possui um identificador. E agora?

XML novamente...

Mas...

E se eu precisasse passar o valor de milhares de itens?

A quantidade de informação real (somente dos dados) que está sendo fornecida é bem menor comparada à quantidade de informações “extras” (tags) contidos no arquivo.

E também, não existe necessidade alguma dessa lista ser descrita hierarquicamente.

Uso ou não uso?

Mapeamento na “mão” de um BD XML

Técnica Edge

Consiste em armazenar todos os documentos em uma única tabela chamada Edge

Edge(source, ordinal, name, flag, target)

Id que indica o documento XML

N º para preservar a ordem entre os elementos de um

mesmo documento.

Nome do elemento ou atributo

Técnica Edge

Consiste em armazenar todos os documentos em uma única tabela chamada Edge

Edge(source, ordinal, name, flag, target)

Para armazenar os valores, uma tabela Vpara cada tipo

Vtype(vid, value)

Técnica Edge

SGBDs XML Híbridos

Suporte a armazenamento de docs. XML em sua forma nativa, ao mesmo tempo em que mantém suporte a armazenamento de dados relacionais/objeto-relacionais

Oracle: tem suporte a SQLX

SELECT SQLX

SELECTXMLElement(“departments",XMLElement(“dept",XMLElement(“number", DEPTNO),XMLElement(“name", DNAME),XMLElement(“location", LOC)))FROM DEPT;

<departments><dept><number>10</number><name>ACCOUNTING</name><location>NEW YORK</location></dept></departments><departments><dept><number>20</number><name>RESEARCH</name><location>DALLAS</location></dept></departments >

XMLElement()

Usado para criar elementos XML

XMLELEMENT ([NAME] id[, XMLAttributes() ][, ( instância_elemento_XML )+ ]

)

XMLElement()

SELECTXMLELEMENT("NOME_CLIENTE",

CLI.CNOME)

FROM CLIENTES_REL CLIWHERE CLI.CESTADO = 'CE'

<NOME_CLIENTE>Lineu</NOME_CLIENTE>

<NOME_CLIENTE>Valdiana</NOME_CLIENTE>

XMLElement()

SELECT XMLELEMENT("CLIENTE_CEARA",XMLELEMENT("NOME",

CLI.CNOME),XMLELEMENT("CIDADE",

CLI.CCIDADE)

)FROM CLIENTES_REL CLIWHERE CLI.CESTADO = 'CE'

<CLIENTE_CEARA>

<NOME>Lineu</NOME>

<CIDADE>Fortaleza</CIDADE>

</CLIENTE_CEARA>

<CLIENTE_CEARA>

<NOME>Valdiana</NOME>

<CIDADE>Fortaleza</CIDADE>

</CLIENTE_CEARA>

XMLAttributes()

Define os atributos de um elemento

XMLATTRIBUTES (expressão_valor [AS alias][, value_expr [AS alias]*

)

XMLAttributes()

SELECT XMLELEMENT("CLIENTE_CEARA",XMLATTRIBUTES(

CLI.CCODIGO AS "CODIGO"),XMLELEMENT("NOME",

CLI.CNOME),XMLELEMENT("CIDADE",

CLI.CCIDADE)

)FROM CLIENTES_REL CLIWHERE CLI.CESTADO = 'CE'

<CLIENTE_CEARA CODIDO="1">

<NOME>Lineu</NOME>

<CIDADE>Fortaleza</CIDADE>

</CLIENTE_CEARA>

<CLIENTE_CEARA CODIDO="3">

<NOME>Valdiana</NOME>

<CIDADE>Fortaleza</CIDADE>

</CLIENTE_CEARA>

XMLForest()

Gera uma lista de elementos XML a partir de uma lista de expressões de valor e seus aliases opcionais. Valores nulos não geram elementos XML.

XMLFOREST (expressão_valor [AS alias][, expressão_valor [AS alias] ]*

)

XMLForest()

SELECT XMLFOREST(CLI.CNOME AS "NOME",CLI.CCIDADE AS "CIDADE",CLI.CEP AS "CEP"

)FROM CLIENTES_REL CLIWHERE CLI.CESTADO = 'CE'

<NOME>Lineu</NOME>

<CIDADE>Fortaleza</CIDADE>

<CEP>60356-030</CEP>

<NOME>Valdiana</NOME>

<CIDADE>Fortaleza</CIDADE>

<CEP>60486-025</CEP>

XMLAgg()

Gera uma lista de elementos XML a partir de um agrupamento (GROUP BY). Se nenhum GROUP BY for especificado, é retornado um agregado XML para todas as cláusulas da consulta.

XMLAGG (instância_elemento_XML [ GROUP BY lista_atributos ]

)

XMLAgg()

SELECT XMLELEMENT("CLIENTES",XMLATTRIBUTES(CLI.CCIDADE AS "CIDADE")XMLAGG(

XMLELEMENT("CLIENTE",CLI.CNOME )

))

FROM CLIENTES_REL CLIGROUP BY CLI.CCIDADE;

<CLIENTES CIDADE="FORTALEZA">

<CLIENTE>Lineu</CLIENTE>

<CLIENTE>Valdiana</CLIENTE>

</CLIENTES>

<CLIENTES CIDADE="SOBRAL">

<CLIENTE>Marta</CLIENTE>

<CLIENTE>Joana</CLIENTE>

</CLIENTES>

XMLAgg()

SELECT XMLELEMENT("CLIENTES",XMLAGG(

XMLELEMENT("CLIENTE",CLI.CNOME )

))

FROM CLIENTES_REL CLI;

<CLIENTES>

<CLIENTE>Lineu</CLIENTE>

<CLIENTE>Valdiana</CLIENTE>

<CLIENTE>Marta</CLIENTE>

<CLIENTE>Joana</CLIENTE>

</CLIENTES>

XMLConcat()

Gera um único fragmento XML a partir dos argumentos

XMLConcat (instância_elemento_XML[, instância_elemento_XML ]*

)

XMLConcat()

SELECTXMLELEMENT("PRODUTO_NOME", PROD.PNOME),XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO)

FROM PRODUTOS_REL PROD

XMLELEMENT("PRODUTO_NOME", PROD.PNOME) XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO)

<PRODUTO_NOME>Monitor</PRODUTO_NOME> <PRODUTO_PRECO>589,50</PRODUTO_PRECO>

<PRODUTO_NOME>Mouse</PRODUTO_NOME> <PRODUTO_PRECO>50,25</PRODUTO_PRECO>

<PRODUTO_NOME>Teclado</PRODUTO_NOME> <PRODUTO_PRECO>165,88</PRODUTO_PRECO>

XMLConcat()

SELECT XMLCONCAT(XMLELEMENT("PRODUTO_NOME", PROD.PNOME),XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO)

)FROM PRODUTOS_REL PROD

XMLCONCAT(XMLELEMENT("PRODUTO_NOME", PROD.PNOME),

XMLELEMENT("PRODUTO_PRECO", PROD.PPRECO))

<PRODUTO_NOME>Monitor</PRODUTO_NOME>

<PRODUTO_PRECO>589,50</PRODUTO_PRECO>

<PRODUTO_NOME>Mouse</PRODUTO_NOME>

<PRODUTO_PRECO>50,25</PRODUTO_PRECO>

<PRODUTO_NOME>Teclado</PRODUTO_NOME>

<PRODUTO_PRECO>165,88</PRODUTO_PRECO>

Outras Funções XMLElement() Creates an XML Element.

XMLForest()Creates an XML Fragment from passed-in components.

XMLColAttVal() Creates an XML fragment and then expands the resulting XML so that each XML fragment has the name "column" with the attribute "name"

ExtractValue() Takes as arguments anXMLTypeinstance and an XPathexpression and returns a scalar value of the resultant node.

XMLTransform() Takes as arguments anXMLTypeinstance and an XSL style sheet, which is itself a form ofXMLTypeinstance. It applies the style sheet to the instance and returns anXMLType.

XMLSequence() Takes input and returns either a varrayof the top-level nodes in theXMLType, or anXMLSequencetype an XML document for each row of the cursor.

XMLConcat() Takes as input a series ofXMLTypeinstances, concatenates the series of elements for each row, and returns the concatenated series.

UpdateXML() Takes as arguments anXMLTypeinstance and an XPath-value pair, and returns anXMLTypeinstance with the updated value.

XPath

Os principais operadores da XPath são / e //. O primeiro serve para dar um passo na árvore XML, enquanto o segundo serve para pular vários níveis de uma só vez. Funciona de maneira parecida como se fosse uma árvore de diretórios. O resultado de cada expressão XPath é um conjunto de elementos especificados pelo caminho.

XPath

<?xml version="1.0" encoding="ISO-8859-1"?> <catalog> <cd country="USA"> <title>Empire Burlesque</title><artist>Bob Dylan</artist> <price>10.90</price> </cd> <cd

country="UK"> <title>Hide your heart</title><artist>Bonnie Tyler</artist> <price>9.90</price> </cd> <cd

country="USA"> <title>Greatest Hits</title> <artist>Dolly Parton</artist> <price>9.90</price> </cd> </catalog>

A expressão XPath abaixo seleciona o elemento RAIZ catalog: /catalog

A expressão XPath abaixo seleciona todos os elementos cd do elemento catalog: /catalog/cd

A expressão XPath abaixo seleciona todos os elementos price de todos os elementos cd do elemento catalog: /catalog/cd/price

Xpath: Selecionando elementos desconhecidos

A expressão XPath a seguir seleciona todos os elementos filhos de todos os elementos cd do elemento catalog: /catalog/cd/*

A expressão XPath a seguir seleciona todos os elementos price que são elementos netos do elemento catalog: /catalog/*/price

A expressão XPath a seguir seleciona todos os elementos price que têm dois ancestrais: /*/*/price

A expressão XPath a seguir seleciona todos os elementos no documento: //*

Xpath: Selecionando seções

Usando-se colchetes numa expressão XPath você pode especificar um elemento adiante.

A expressão XPath a seguir seleciona o primeiro elemento cd filho do elemento catalog: /catalog/cd[1]

A expressão XPath a seguir seleciona o último elemento cd filho do elemento catalog (Nota: não existe a função first()): /catalog/cd[last()]

A expressão XPath a seguir seleciona todos os elementos cd do elemento catalogque tem um elemento price: /catalog/cd[price]

A expressão XPath a seguir seleciona todos os elementos cd do elemento catalogque tem um elemento price com valor de 10.90: /catalog/cd[price=10.90]

A expressão XPath a seguir seleciona todos os elementos price de todos os elementos cd do elemento catalog que tem um elemento price com valor de 10.90: /catalog/cd[price=10.90]/price

Xpath: Selecionando vários caminhos

Usando o operador "|" numa expressão XPath você pode selecionar vários caminhos.

A expressão XPath a seguir seleciona todos os elementos title e artist do elemento cd do elemento catalog: /catalog/cd/title | /catalog/cd/artist

A expressão XPath a seguir seleciona todos os elementos title e artist do documento: //title | //artist

A expressão XPath a seguir seleciona todos os elementos title, artist e price do documento: //title | //artist | //price

A expressão XPath a seguir seleciona todos os elementos title do elemento cd do elemento catalog, e todos os elementos artist no documento: /catalog/cd/title | //artist

Atributos no XPath

Esta expressão XPath seleciona todos os atributos chamados country: //@country

Esta expressão XPath seleciona todos os elementos cd que tem um atributo chamado country: //cd[@country]

Esta expressão XPath seleciona todos os elementos cd que tem algum atributo: //cd[@*]

Esta expressão XPath seleciona todos os elementos cd que tem um atributo chamado country com valor 'UK': //cd[@country='UK']

Xquery: FLWOR Expressions

FOR-LET-WHERE-ORDERBY-RETURN = FLWOR

FOR/LET Clauses

WHERE Clause

ORDERBY/RETURN Clause

List of tuples

List of tuples

Instance of XQuery data model

Xquery: For vs Let

FOR $x IN list-expr

Binds $x in turn to each value in the list expression.

LET $x = list-expr

Binds $x to the entire list expression,

Useful for common sub-expressions and for aggregations.

For

FOR iterates over an input sequence and calculates some value for each item in that sequence, returning a sequence obtained by concatenating the results of these calculations.

In simple cases there is one output item for every input item. So:

for $n in (1 to 10)

return $n * $n

Returns the sequence (1, 4, 9, 16, 25, 36, 49, 64, 81, 100).

Let

The XQuery LET clause simply declares a variable and gives it a value:

let $maxCredit := 3000

let $overdrawnCustomers := //customer[overdraft > $maxCredit]

return count($overdrawnCustomers)

In this example you can simply replace each variable reference by the expression that provides the expression's value.

This means that the result is the same as:

count(//customer[overdraft > 3000])

Exemplo 1:

FOR $x IN document("bib.xml")/bib/book

RETURN <result> $x </result>

Returns:<result> <book>...</book></result><result> <book>...</book></result><result> <book>...</book></result>...

LET $x IN document("bib.xml")/bib/book

RETURN <result> $x </result>

Returns:<result> <book>...</book>

<book>...</book><book>...</book>...

</result>

FOR generates a list of bindings of $x to each book element in the bib.

LET generates a single binding of $x to the list of book elements in the bib.

Exemplo 2:

Find all book titles published after 1995:

FOR $x IN document("bib.xml")/bib/book

WHERE $x/year > 1995

RETURN $x/title

Result:<title> abc </title><title> def </title><title> ghi </title>

Exemplo 3:

For each author of a book by Morgan Kaufmann, list all books they have published:

FOR $a IN distinct(document("bib.xml")/bib/book[publisher=“Morgan Kaufmann”]/author)

RETURN <result>

$a,

FOR $t IN /bib/book[author=$a]/title

RETURN $t

</result>

distinct = a function that eliminates duplicates (after converting inputs to atomic values).

Exemplo 4:

<result>

<author>Jones</author>

<title> abc </title>

<title> def </title>

</result>

<result>

<author> Smith </author>

<title> ghi </title>

</result>

Observe how the nested structure of result elements is determined by the nested structure of the query.

FOR $t IN /bib/book[author=$a]/title

Where

Primeiro defina todas as tabelas de interesse e depois defina o where:

for $genre in //genre/choice

for $video in //video

for $actorRefs in $video/actorRef

for $actor in //actor

where $video/genre = $genre and $actor/@id = $actorRefs

return concat($genre, ": ", $actor)

Exemplo 5

count = (aggregate) function that returns the number of elements

<big_publishers>

FOR $p IN distinct(document("bib.xml")//publisher)

LET $b := document("bib.xml")/book[publisher = $p]

WHERE count($b) > 100

RETURN $p

</big_publishers>

For each publisher p

- Let the list of books published by p be b

Count the # books in b, and return p if b > 100

Exemplo 6

Find books whose price is larger than average:

LET $a=avg(document("bib.xml")/bib/book/price)

FOR $b in document("bib.xml")/bib/book

WHERE $b/price > $a

RETURN $b

avg() == aggregate function

Orderby

Muito semelhante ao SQL padrão

for $x in //video

order by $x/year ascending, number($x/user-rating) descending

return $x/title

Return

O return no Xquery define quais resultados serão exibidos, por exemplo:

for $v in //video[genre="comedy"]

return //actor[@id = $v/actorRef]

Sorting

<publisher_list>FOR $p IN distinct(document("bib.xml")//publisher)ORDERBY $pRETURN <publisher> <name> $p/text() </name> ,

FOR $b IN document("bib.xml")//book[publisher = $p] ORDERBY $b/price DESCENDING

RETURN <book> $b/title , $b/price

</book></publisher>

</publisher_list>

If-then-else

FOR $h IN //holding

ORDERBY $h/title

RETURN <holding>

$h/title,

IF $h/@type = "Journal"

THEN $h/editor

ELSE $h/author

</holding>