60
Banco de Dados XML Tiago Roberti Sampaio

Banco de Dados XML

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

Page 1: Banco de Dados XML

Banco de Dados XML

Tiago Roberti Sampaio

Page 2: Banco de Dados XML

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.

Page 3: Banco de Dados XML

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.

Page 4: Banco de Dados XML

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.

Page 5: Banco de Dados XML

Aplicações para o XML

Page 6: Banco de Dados 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

Page 7: Banco de Dados 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.

Page 8: Banco de Dados 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

Page 9: Banco de Dados 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>

Page 10: Banco de Dados XML

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).

Page 11: Banco de Dados XML

Benefícios

Suporta transações.

Acesso integrado a legados.

Suporte à distribuição.

Escalabilidade para grandes volumes.

Tem melhor desempenho que SGBDs padrão.

Page 12: Banco de Dados XML

BD com suporte XML X nativo XML

Qual a vantagem de cada um?

Page 13: Banco de Dados XML

BD XML X BD comum

Qual a vantagem de se utilizar um BD XML?

Page 14: Banco de Dados 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?

Page 15: Banco de Dados XML

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>

Page 16: Banco de Dados XML

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?

Page 17: Banco de Dados XML

XML novamente...

Page 18: Banco de Dados XML

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.

Page 19: Banco de Dados XML

Uso ou não uso?

Page 20: Banco de Dados XML

Mapeamento na “mão” de um BD XML

Page 21: Banco de Dados 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

Page 22: Banco de Dados XML

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)

Page 23: Banco de Dados XML

Técnica Edge

Page 24: Banco de Dados XML

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

Page 25: Banco de Dados XML

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 >

Page 26: Banco de Dados XML

XMLElement()

Usado para criar elementos XML

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

)

Page 27: Banco de Dados XML

XMLElement()

SELECTXMLELEMENT("NOME_CLIENTE",

CLI.CNOME)

FROM CLIENTES_REL CLIWHERE CLI.CESTADO = 'CE'

<NOME_CLIENTE>Lineu</NOME_CLIENTE>

<NOME_CLIENTE>Valdiana</NOME_CLIENTE>

Page 28: Banco de Dados XML

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>

Page 29: Banco de Dados XML

XMLAttributes()

Define os atributos de um elemento

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

)

Page 30: Banco de Dados XML

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>

Page 31: Banco de Dados XML

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] ]*

)

Page 32: Banco de Dados XML

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>

Page 33: Banco de Dados XML

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 ]

)

Page 34: Banco de Dados XML

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>

Page 35: Banco de Dados XML

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>

Page 36: Banco de Dados XML

XMLConcat()

Gera um único fragmento XML a partir dos argumentos

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

)

Page 37: Banco de Dados 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>

Page 38: Banco de Dados XML

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>

Page 39: Banco de Dados XML

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.

Page 40: Banco de Dados XML

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.

Page 41: Banco de Dados XML

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

Page 42: Banco de Dados XML

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: //*

Page 43: Banco de Dados XML

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

Page 44: Banco de Dados XML

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

Page 45: Banco de Dados XML

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']

Page 46: Banco de Dados XML

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

Page 47: Banco de Dados XML

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.

Page 48: Banco de Dados XML

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).

Page 49: Banco de Dados XML

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])

Page 50: Banco de Dados XML

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.

Page 51: Banco de Dados XML

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>

Page 52: Banco de Dados XML

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).

Page 53: Banco de Dados XML

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

Page 54: Banco de Dados XML

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)

Page 55: Banco de Dados XML

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

Page 56: Banco de Dados XML

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

Page 57: Banco de Dados XML

Orderby

Muito semelhante ao SQL padrão

for $x in //video

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

return $x/title

Page 58: Banco de Dados XML

Return

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

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

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

Page 59: Banco de Dados XML

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>

Page 60: Banco de Dados XML

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>