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
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
- Obre
http://localhost:8984al navegador - Accedeix amb
admin/novaContrasenya - Al panell esquerre, crea la col·lecció "biblioteca" i puja
biblioteca.xml - 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.