Salta el contingut

Bases de Dades Natives XML

Qué és una BD nativa XML?

Una base de dades nativa XML emmagatzema documents XML com a unitat fonamental d'emmagatzematge, a diferència d'una BD relacional que emmagatzema taules. Permet consultar els documents amb XQuery sense necessitat de transformar-los prèviament.

Principals opcions: - BaseX — lleugera, gran rendiment, molt usada en recerca i educació - eXist-db — madura, REST API, interfície web completa - MarkLogic — empresarial, multimodel

BaseX amb Docker

Instal·lació

# Baixar i engegar BaseX
docker run -d \
    --name basex-joan-garcia \
    -p 8984:8984 \
    -p 1984:1984 \
    -v basex_data:/srv/basex/data \
    basex/basexhttp:latest

# Accedir a la interfície web
# http://localhost:8984
# Usuari: admin  Contrasenya: admin

Canviar la contrasenya

docker exec -it basex-joan-garcia bash
basex -c "ALTER PASSWORD admin novaContrasenya"

Gestió de col·leccions

Una col·lecció a BaseX és un conjunt de documents XML (similar a una base de dades o carpeta).

(: Crear una col·lecció :)
db:create("biblioteca", "biblioteca.xml")

(: Afegir documents a la col·lecció :)
db:add("biblioteca", "nous_llibres.xml")

(: Llistar col·leccions :)
db:list()

(: Llistar documents d'una col·lecció :)
db:list("biblioteca")

(: Esborrar una col·lecció :)
db:drop("biblioteca")

Consultes XQuery a BaseX

Quan es consulten dades d'una col·lecció, s'usa collection() en lloc de doc():

(: doc() → un únic fitxer :)
for $ll in doc("biblioteca.xml")//llibre
return $ll/titol

(: collection() → tots els documents de la col·lecció :)
for $ll in collection("biblioteca")//llibre
return $ll/titol

Exemple: consultes a la interfície web BaseX

  1. Obre http://localhost:8984 al navegador
  2. Accedeix amb admin/novaContrasenya
  3. Al panell esquerre, crea la col·lecció "biblioteca" i puja biblioteca.xml
  4. A l'editor de consultes, escriu:
(: Tots els títols de la col·lecció :)
for $ll in collection("biblioteca")//llibre
order by $ll/titol
return string($ll/titol)

Consultes des de línia de comandes

# Entrar a l'interfície de BaseX
docker exec -it basex-joan-garcia basex

# Executar una consulta directament
docker exec -it basex-joan-garcia basex -c "XQUERY count(collection('biblioteca')//llibre)"

# Executar un fitxer .xq
docker exec -it basex-joan-garcia basex consulta.xq

eXist-db amb Docker

docker run -d \
    --name existdb-joan-garcia \
    -p 8080:8080 \
    -p 8443:8443 \
    -v existdb_data:/exist/data \
    existdb/exist:6.2.0

# Accedir
# http://localhost:8080
# Admin: admin  Contrasenya: (buida per defecte, establir en primer accés)

Gestió via eXide (editor web d'eXist)

eXist-db inclou eXide a http://localhost:8080/exist/apps/eXide/: - Crea col·leccions a /db/ - Puja documents XML - Escriu i executa consultes XQuery - Guarda i organitza mòduls XQuery

Importació/Exportació XML-SQL

MySQL → XML (exportació)

-- Exportar taula com a XML
SELECT * FROM alumnes
FOR XML PATH('alumne'), ROOT('alumnes');

-- PostgreSQL: usar python o php per convertir

Python: SQL → XML

import sqlite3
import xml.etree.ElementTree as ET

conn = sqlite3.connect('institut.db')
cur = conn.cursor()
cur.execute("SELECT id, nom, cicle FROM alumnes")

root = ET.Element('alumnes')
for row in cur.fetchall():
    al = ET.SubElement(root, 'alumne', id=str(row[0]))
    ET.SubElement(al, 'nom').text = row[1]
    ET.SubElement(al, 'cicle').text = row[2]

tree = ET.ElementTree(root)
ET.indent(tree)  # Python 3.9+
tree.write('alumnes.xml', encoding='UTF-8', xml_declaration=True)

Python: XML → SQL

import sqlite3
import xml.etree.ElementTree as ET

tree = ET.parse('alumnes.xml')
root = tree.getroot()

conn = sqlite3.connect('institut.db')
cur = conn.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS alumnes
               (id INTEGER PRIMARY KEY, nom TEXT, cicle TEXT)''')

for alumne in root.findall('alumne'):
    cur.execute("INSERT OR REPLACE INTO alumnes VALUES (?,?,?)", (
        alumne.get('id'),
        alumne.findtext('nom'),
        alumne.findtext('cicle')
    ))

conn.commit()

Miniactivitat AC03744

Engega un contenidor BaseX amb Docker. Crea la col·lecció "lmsgi" i puja els documents XML del RA1 (institut.xml, biblioteca.xml). Executa 3 consultes XQuery que combinin dades dels dos documents.