Upload
tiago-r-sampaio
View
84
Download
1
Embed Size (px)
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.
Citation preview
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>