Usando Visões SQL/XML para publicação de Dados Relacionais Luiz Aires de Souza Neto, Vânia Maria Ponte Vidal, Bernadette Farias Lóscio, Fernando Cordeiro Lemos Departamento de Computação - UFC {luiz_aires, vvidal, bernafarias, fernandocl}@lia.ufc.br Resumo Atualmente, muitas aplicações usam o formato XML para troca de dados na Web. Entretanto, a maioria dos dados está armazenada em bancos de dados relacionais. Assim, necessita-se definir mecanismos para publicá-los no formato XML. Nesse trabalho, apresentamos a visão geral de um processo de criação de visões XML de dados relacionais. Uma visão XML é definida por um esquema XML e um conjunto de mapeamentos que especificam relacionamentos entre o esquema da visão XML e o esquema da base relacional. Mostraremos um exemplo de criação de uma visão XML seguindo os passos descritos pelo processo proposto. Nesse trabalho, apresentamos uma visão geral sobre o processo de criação e consulta de visões XML sobre qualquer banco de dados que suporte o padrão SQL/XML. Neste trabalho, uma visão é definida através de um esquema XML e de um conjunto de mapeamentos entre o esquema da visão XML e o esquema da base relacional. Assim, baseado nos mapeamentos da visão, é possível traduzir consultas definidas sobre o esquema da visão XML em consultas SQL/XML correspondentes sobre a base de dados relacional. Esse artigo está organizado como se segue. A Seção 2 discute o padrão SQL/XML. A Seção 3 apresenta uma visão geral sobre o processo de criação de visões XML de dados relacionais. A Seção 4 apresenta alguns trabalhos relacionados. A Seção 5 apresenta as conclusões. 1. Introdução 2. SQL/XML XML tem se tornado o formato padrão para troca de informações entre aplicações na Web. Entretanto, como a maioria dos dados está armazenada em bancos de dados relacionais ou objetos-relacionais, surgiu a necessidade de definir mecanismos para publicá-los no formato XML. Uma maneira de publicar dados relacionais no formato XML consiste em criar visões XML sobre os dados relacionais. Uma visão pode ser materializada ou virtual. Visões materializadas melhoram o desempenho das consultas e a disponibilidade de dados, mas devem ser atualizadas para refletir mudanças nos dados da fonte subjacente [7]. No caso de visões virtuais, os dados ainda persistem em bases relacionais, enquanto as aplicações acessam os dados no formato de XML através da visão [1]. Entretanto, criar visões XML de dados relacionais levanta o problema de como definir a visão e de como avaliar uma consulta XQuery [8] sobre a visão. Neste caso, a consulta XQuery deve ser traduzida em SQL através da composição desta com a definição da visão. Com o surgimento do padrão SQL/XML [4] como parte do SQL:2003 [4], usuários podem recorrer à funções SQL/XML para publicar dados relacionais no formato XML. As vantagens dessa abordagem estão no fato de se usar um padrão para publicar dados relacionais e na capacidade de processar funções de publicação SQL/XML junto com cláusulas SQL, o que representa um ganho de desempenho. Várias aplicações Web usam banco de dados relacionais para armazenar seus dados e utilizam XML para troca de dados com outras aplicações. Diversos SGBDs implementam extensões que permitem manipular dados relacionais no formato XML, mas, geralmente, estes sistemas adotam abordagens muito diferentes entre si, dificultando uma interoperabilidade entre eles. Entretanto, desenvolvedores precisam construir aplicações que funcionem independentemente do SGBD que será usado. Assim, a existência de um padrão que unifique o processo de obtenção de dados XML a partir de dados relacionais é muito importante. Nesse contexto, XQuery e SQL/XML são dois padrões que adotam consultas declarativas para obter dados XML. XQuery é a linguagem padrão para a realização de consultas sobre dados XML. Já o padrão SQL/XML é capaz de gerar dados no formato XML a partir de dados relacionais. A linguagem SQL/XML foi criada com a participação de grandes empresas tais como: Oracle, IBM, Microsoft, Sybase. SQL/XML é parte do padrão ANSI/ISO SQL 2003. As extensões do SQL:2003 que compõem o SQL/XML são: • Funções de Publicação: permitem obter dados XML a partir de dados relacionais. O tipo de dados XMLTYPE: esse novo tipo de dados foi adicionado para permitir armazenamento de valores XML. • Regras de Mapeamento: definem como os valores relacionais serão convertidos em valores XML. Como o SQL é um padrão já maduro, existem várias ferramentas e infra-estrutura para suportá-lo. Assim, para um programador SQL aprender SQL/XML torna-se muito simples, pois são poucas as novas funções de publicação adicionadas ao SQL. Nesta restante dessa seção, discutimos as extensões relacionadas às funções de publicação. • 2.1. Funções de publicação As funções de publicação XML permitem a construção de consultas SQL para a geração de documentos XML a partir de dados relacionais. Como estas funções são parte do padrão SQL 2003, podem ser usadas em conjunto com expressões SQL comuns. Algumas das funções de publicação do SQL/XML são descritas a seguir: • XMLElement: Transforma valores relacionais em elementos XML. • XMLAttributes: Define os atributos de um elemento XML. • XMLForest: Transforma uma lista de valores relacionais em uma lista de elementos XML • XMLConcat: Concatena dois ou mais elementos XML. • XMLAGG: Trata relacionamentos 1:n, ou seja, trata coleções. • XMLRoot: Cria o nó raiz de um documento XML. Para ilustrar o uso de SQL/XML, considere, por exemplo, o esquema de banco de dados relacional PEDIDOS_DB apresentado na Figura 1. PEDIDOS_REL CLIENTES_REL FK1 CLIENTE (FK) DATA_PEDIDO DATA_ENTREG DEST_RUA DEST_CIDADE DEST_ESTADO DEST_CEP FK2 PRODUTOS_REL ITENS_REL CODIGO NOME PRECO TAXA Para obtermos o mesmo resultado da consulta Q1 no formato XML, poderíamos aplicar a consulta Q2, apresentada na Figura 5, sobre o mesmo banco de dados relacional citado. O resultado da consulta Q2 é mostrado na Figura 6. Note que, para cada tupla da tabela CLIENTES_REL, foi gerado um elemento XML <Cliente> estruturado com dois sub-elementos: um para o atributo CLI_ID e outro para o atributo CLI_NOME. CLIENTES_REL COD NOME RUA CIDADE EST FONE1 FONE2 1 Lucas S. José Itu SP 3466234 34721232 4 Marcelo D. Luís Cedro CE 32813281 32435555 6 Marta Vila I Santos SP 9954320 NULL PRODUTOS_REL COD NOME PRECO TAXA 2 Teclado 30 0.1 3 Mouse 12 0.05 5 DVD RW 2 0.01 ITENS_REL PEDIDO NUMERO PRODUTO QUANTIDADE DESCONTO 203 3203 5 5 0.05 204 3204 2 2 0.03 204 3205 3 2 0.01 PEDIDOS_REL COD CLIENTE DT_PED DT_ENT RUA CIDADE 203 1 9/8/2007 9/9/2007 S. José Itu 204 4 3/2/2008 6/3/2008 D. Luís Cedro Figura 2. Uma Instância de PEDIDOS_DB. CODIGO CODIGO NOME RUA CIDADE ESTADO CEP FONE1 FONE2 Figura 2 apresenta uma instância do banco de dados relacional PEDIDOS_DB. Figura 3 apresenta a consulta SQL Q1 sobre o banco de dados PEDIDOS_DB. Q1 retorna os atributos CLI_ID e CLI_NOME dos clientes da tabela CLIENTES_REL. O resultado da consulta Q1 sobre a instância da Figura 2 é mostrado na Figura 4. FK3 PEDIDO (FK) NUMERO PRODUTO (FK) QUANTIDADE DESCONTO Figura 1. Esquema Relacional PEDIDOS_DB. SELECT C.CODIGO, C.NOME FROM CLIENTES_REL C Figura 3: Consulta Q1 CODIGO 1 4 6 NOME Lucas Marcelo Marta Figura 4: Resultado da consulta SQL Q1. EST SP CE relacionamento entre os elementos e atributos do esquema da visão XML e os atributos ou caminhos da tabela pivô. SELECT XMLELEMENT("Cliente", XMLFOREST( C.CODIGO as " ClienteId", C.NOME as "CliNome")) FROM CLIENTES_REL C Passo 4 – Geração da consulta que define a visão: Neste passo, o projetista deve gerar a consulta SQL/XML que define a visão sobre o esquema relacional. Essa consulta é gerada com base no esquema XML do Passo 1 e nos mapeamentos obtidos no Passo 3. Figura 5: Consulta Q2 <Cliente> <ClienteId>1</ClienteId> <CliNome>Lucas</CliNome> </Cliente> <Cliente> <ClienteId>4</ClienteId> <CliNome>Marcelo</CliNome> </Cliente> <Cliente> <ClienteId>6</ClienteId> <CliNome>Marta</CliNome> </Cliente> 3.2. Exemplo de criação de visões XML de dados relacionais Figura 6: Resultado da consulta SQL/XML 3. Criação relacionais de visões XML de dados A seguir mostraremos a visão geral de um processo para a construção de uma visão XML a partir de um banco de dados relacional e, em seguida, mostraremos um exemplo seguindo os passos apresentados. 3.1. Processo de criação de visões XML O processo apresentado para criação de uma visão XML é composto dos seguintes passos. Passo 1 - Definição do esquema da visão: Neste passo, deve ser definida a estrutura da visão XML levando-se em consideração os requisitos dos usuários da visão. Essa estrutura pode ser definida usando qualquer linguagem de definição de esquema XML (por exemplo, XML Schema e DTD). O esquema da visão deve definir um único elemento raiz cuja estrutura descreve a estrutura dos elementos da visão. Passo 2 - Escolha da tabela pivô: A tabela pivô é uma tabela/visão relacional tal que existe um mapeamento 1-1 entre suas tuplas e os elementos da visão a ser construída. A tabela pivô é selecionada a partir de uma lista de tabelas e visões existentes no esquema do banco de dados relacional. Passo 3 - Especificação dos mapeamentos: O projetista deve especificar os mapeamentos que definem o Nesta Seção apresentamos um exemplo para ilustrar o processo de criação da visão Pedidos_XML sobre o esquema relacional PEDIDOS_DB da Figura 1. A construção do esquema da visão corresponde ao primeiro passo do processo. A Figura 7 mostra o esquema da visão Pedidos_XML, o qual foi gerado pelo projetista da visão. Como vemos, o elemento raiz da visão é composto pelo atributo ID, o elemento de tipo simples DataPedido, e por dois elementos de tipo complexo: Cliente (que é do tipo Cliente_Type) e Itens (que é do tipo Itens_Type). A escolha da tabela pivô corresponde ao segundo passo do processo. Dentre as tabelas do esquema relacional PEDIDOS_DB, aquela que apresenta um mapeamento 1-1 para com os elementos da visão Pedidos_XML é a tabela PEDIDOS_REL. A especificação dos mapeamentos corresponde ao terceiro passo do processo. Na Figura 8, ilustramos os mapeamentos entre o esquema da visão XML e o esquema relacional. Por exemplo, existe um mapeamento entre o elemento DataPedido da visão XML e o atributo DATA_PEDIDO do esquema relacional. Este mapeamento especifica que existe uma correspondência entre eles. Pedido @ID (integer) DataPedido (date) Cliente (Cliente_Type) Nome (string) Endereco (End_Type) Rua (string) Cidade (string) Estado (string) Fone* (string) Item* (Item_Type) Numero (integer) Produto (string) Quantidade (integer) Figura 7. Esquema da Visão Pedidos_XML. Pedido @ID DataPedido Cliente Nome Endereco Rua Cidade Estado Fone* Item* Numero Produto Quantidade PEDIDOS_REL CODIGO CLIENTE DATA_PEDIDO FK1 (CLIENTES_REL) CODIGO NOME RUA CIDADE ESTADO CEP FONE1 FONE2 FK2-1 (ITENS_REL) PEDIDO NUMERO PRODUTO QUANTIDADE DESCONTO FK3 (PRODUTOS_ REL) CODIGO NOME PRECO TAXA Figura 8. Mapeamentos entre o esquema da visão Pedidos_XML e o esquema relacional PEDIDOS_DB. A geração da consulta SQL/XML que define a visão corresponde ao quarto passo. Figura 9 mostra a consulta SQL/XML que define a visão Pedidos_XML. A figura também mostra que elemento ou atributo da visão é obtido por cada chamada de função de publicação. Por exemplo, na linha 3, a cláusula XMLFOREST(P.DATA_PEDIDO AS "DataPedido") gera o elemento XML <DataPedido> a partir do atributo P.DATA_PEDIDO. 4. Trabalhos Relacionados A publicação de dados relacionais através de visões XML foi abordada em diversos trabalhos. Entre eles estão: Oracle [1], XPeranto [3], Silkroute [5], DB2 XMLExtender [2] e SQL Server [6]. Em XPeranto [3] e SilkRoute [5], a visão XML é definida através de uma consulta XQuery [19] sobre uma visão canônica XML que representa as tabelas do banco de dados relacional. Essa consulta define o esquema da visão e seus mapementos com o esquema da visão canônica. Em ambos os sistemas, a realização de uma consulta XQuery sobre uma visão XML é feita usando um middleware sobre o banco relacional. O middleware traduz a consulta XQuery em uma ou mais consultas SQL equivalentes. Então, o resultado SQL é convertido no documento XML resultante. No DB2 XMLExtender [2] e no SQL Server [6], os mapeamentos são armazenados através de esquemas anotados [6]. Em ambos os casos, a definição dos mapeamentos é muito complexa. 1. SELECT XMLELEMENT("Pedido", 2. XMLATTRIBUTES(P.CODIGO AS "ID"), 3. XMLFOREST(P.DATA_PEDIDO AS "DataPedido"), 4. (SELECT XMLELEMENT("Cliente", 5. XMLFOREST(C.CCODIGO AS "Nome"), 6. XMLELEMENT("Endereco", 7. XMLFOREST(C.RUA AS "Rua"), 8. XMLFOREST(C.CDADE AS "Cidade"), 9. XMLFOREST(C.ESTADO AS "Estado"), 10. XMLFOREST(C.CEP AS "CEP") ), 11. XMLFOREST(C.FONE1 AS "Fone"), 12. XMLFOREST(C.FONE2 AS "Fone") ) 13. FROM CLIENTES_REL C WHERE C.CODIGO = P.CODIGO), 14. (SELECT XMLAGG( XMLELEMENT("Item", 15. XMLFOREST(I.NUMERO AS "Numero"), 16. XMLFOREST( (SELECT R.NOME FROM PRODUTOS_REL 17. WHERE R.CODIGO = I.PRODUTO), "Produto" ), 18. XMLFOREST(I.QUANTIDADE AS "Quantidade") ) ) 19. FROM ITEMS_REL I WHERE I.PEDIDO = P.CODIGO ) ) 20. FROM PEDIDOS_REL P; Pedido/ID Pedido/DataPedido Pedido/Cliente Pedido/Item Figura 9. Consulta SQL/XML que define a visão. Além disso, o SQL Server provê a cláusula FOR XML que permite gerar dados XML de dados relacionais. Neste caso, o mapeamento é definido no momento da consulta e não é armazenado. Oracle [1] foi o primeiro SGBD a suportar a criação de visões XML como consultas SQL/XML sobre dados relacionais. Tais visões podem ser consultadas usando a linguagem XQuery. O processo apresentado neste trabalho pode ser facilmente adaptado a esses outros sistemas. Para tanto, basta gerarmos no Passo 4 as definições correspondentes para cada sistema, ao invés de gerar a consulta SQL.XML. 5. Conclusão Neste trabalho discutimos um processo de criação de visões XML de dados relacionais, que consiste em quatro passos: (1) O projetista define o esquema da visão XML; (2) O projetista seleciona a tabela pivô a partir de uma lista de tabelas do esquema do banco de dados relacional; (3) O projetista define um conjunto de mapeamentos que identificam correspondências entre o esquema da visão XML e o esquema do banco de dados relacional; (4) Baseado nos mapeamentos, é gerada a consulta SQL/XML que define a visão XML. Uma vantagem do nosso processo está no fato de poder ser aplicado sobre qualquer banco que implementa o padrão SQL/XML. Além disso, a manutenção de mapeamentos torna-se menos complexa, uma vez que alterações no esquema do banco de dados precisam ser propagadas apenas nos elementos da visão que têm correspondência com os campos das tabelas relacionais que foram alterados. Como vimos, o nosso processo pode ser adaptado a outros tipos de sistemas que publicam visões XML sobre dados relacionais. Referências [1] Adams, D., Oracle® XML DB 10g Release 2 Developer's Guide. http://www.oracle.com/technology/documentation/da tabase10gR2.html, 2005. [2] Benham, S.E., IBM XML-Enabled Data Management Product Architecture and Technology. In: XML Data Management, Native XML and XMLEnable Database Systems, Chaudhri, A.B., Rashid, A., and Zicari, R. (eds.), Addison Wesley, 2003. [3] Carey, M. J., Kiernan, J., Shanmugasundaram, J., Shekita, E. J., Subramanian, S. N., XPERANTO: Middleware for Publishing Object-Relational Data as XML Documents. In: VLDB, pp. 646–648, 2000. [4] Eisenberg, A., Melton, J., Kulkarni, K., Michels, J.E. and Zemke, F., SQL:2003 has been published. In: ACM SIGMOD, pp. 119–126, 2004. [5] Fernández, M., Kadiyska, Y., Suciu, D., Morishima, A., Tan, W., SilkRoute: A framework for publishing relational data in XML. In: TODS, pp. 438–493, 2002. [6] Rys, M., XML Support in Microsoft SQL Server 2000. In: XML Data Management, Native XML and XML-Enable Database Systems, Addison Wesley, 2003. [7] Vidal, V. M. P., Araujo, V. S., Casanova, M. A., Towards Automatic Generation of Rules for the Incremental Maintenance of XML Views over Relational Data. In: WISE 2005, pp. 189-202, 2005. [8] World Wide Web Consortium, XQuery 1.0: An XML Query Language. W3C Working Draft, 2004, Disponível em: http://www.w3.org/TR/xquery/.